Programación

18/07/2011

Zend Framework – Mail Templates usando Zend_Mail & Zend_View

Me pareció útil compartir esta función con el resto de los programadores, esta función no es de mi autoría, el creador es Jonathan Street, yo solamente la arregle un poco ya que tenia un par de errores, le agregue una función para que se le pueda pasar los parámetros que uno quiere, y alguna que otra cosita mas.

Esta función es muy útil para enviar templates de mails en Zend Framework, utilizando Zend View y Zend Mail, pueden ser archivos con texto plano, archivos HTML, o archivos con HTML y PHP! Tan solo tienen q hacer lo siguiente..

1) Tienen que agregar al archivo de configuración las siguientes lineas:

settings.email = "service@sparkboxtoys.com"
settings.template.dir = APPLICATION_PATH "/theme/mail_template/"

en “settings.template.dir” pongan el directorio donde estarán puestos los mail’s template.

La extensión de los mismos pueden ser:

  • TXT si van a ser textos planos.
  • PHTML si van a ser mails con html y/o php (para enviarles paramentos)

2) Dentro de la carpeta library crear los directorios y archivo correspondientes (tener en cuenta las mayúsculas)

/App/Mail/Template.php

3) Dentro del archivo Template.php copiar el siguiente código:

/**
 * A template based email system
 *
 * Supports the sending of multipart txt/html emails based on templates
 *
 */
class App_Mail_Template
{

    /**
     * Variable registry for template values
     */
    protected $templateVariables = array();

    /**
     * Template name
     */
    protected $templateName;

    /**
     * Zend_Mail instance
     */
    protected $zendMail;

    /**
     * Email recipient
     */
    protected $recipient;

    /**
     * Email subject
     */
    protected $subject;

    /**
     * __construct
     *
     * Set default options
     *
     */
    public function __construct ()
    {
        $this->zendMail = new Zend_Mail();
    }

    /**
     * Set variables for use in the templates
     *
     * Magic function stores the value put in any variable in this class for
     * use later when creating the template
     *
     * @param string $name  The name of the variable to be stored
     * @param mixed  $value The value of the variable
     */
    public function __set ($name, $value)
    {
        $this->templateVariables[$name] = $value;
    }

    public function setVariables($data)
    {
        foreach($data as $key => $value){
            $this->__set($key,$value);
        }
    }

    /**
     * Set the subject to use
     *
     * @param string $subject Subject text
     */
    public function setSubject ($subject)
    {
        $this->subject = $subject;
    }

    /**
     * Set the template file to use
     *
     * @param string $filename Template filename
     */
    public function setTemplate ($filename)
    {
        $this->templateName = $filename;
    }

    /**
     * Set the recipient address for the email message
     *
     * @param string $email Email address
     */
    public function setRecipient ($email)
    {
        $this->recipient = $email;
    }

    /**
     * Send the constructed email
     *
     * @todo Add from name
     */
    public function send ()
    {
        /*
         * Get data from config
         * - From address
         * - Directory for template files
         */
        $config = Zend_Registry::get('config');
        $templateDir = $config->settings->template->dir;
        $fromAddr = $config->settings->email;

        //Build template
        //Check that template file exists before using
        $viewConfig = array('basePath' => $templateDir);
        $subjectView = new Zend_View($viewConfig);

        foreach ($this->templateVariables as $key => $value)
        {
            $subjectView->{$key} = $value;
        }

        $textView = new Zend_View($viewConfig);
        foreach ($this->templateVariables as $key => $value)
        {
            $textView->{$key} = $value;
        }
        try {
            $text = $textView->render($this->templateName . '.txt');
        } catch (Zend_View_Exception $e) {
            $text = false;
        }

        $htmlView = new Zend_View($viewConfig);
        foreach ($this->templateVariables as $key => $value)
        {
            $htmlView->{$key} = $value;
        }

        try {
            $html = $htmlView->render($this->templateName . '.phtml');
        } catch (Zend_View_Exception $e) {
            $html = false;
        }

        //var_dump($subject);
        //var_dump($text);
        //var_dump($html);

        //Pass variables to Zend_Mail
        $mail = new Zend_Mail();
        //var_dump($fromAddr);
        $mail->setFrom($fromAddr);
        //var_dump($this->recipient);
        $mail->addTo($this->recipient);

        $mail->setSubject($this->subject);

        if ($html !== false) {
            $mail->setBodyText($text);
        }

        if ($html !== false) {
            $mail->setBodyHtml($html);
        }

        //Send email
        $mail->send();
    }

}

4) Luego en el archivo en el cual vas a enviar el mail copiar el siguiente código:

$emailObj = new App_Mail_Template;
$emailObj->setRecipient('test@avlog.com.ar');
$emailObj->setTemplate('welcome');
$dataArray = array(
    'name' => 'Pablo',
    'mail' => 'test@avlog.com.ar',
);
$emailObj->setSubject('Welcome to AgeValed!');
$emailObj->setVariables($dataArray);
$emailObj->send();

Con esto estamos enviando un mail del archivo welcome.phtml q adentro tiene los parámetros $this->name y $this->mail

Espero que les sea útil, cualquier consulta no duden en escribirme!



About the Author

AgeValed
Pablo Ignacio de la Vega Ibañez, también conocido en algunos lugares como AgeValed, el creador de este blog. Actualmente estoy trabajando como Líder Técnico y Supervisor de Equipo en el área de desarrollo PHP.




 
 

 
PHP

Doctrine2 – Getting Started Issues

Luego de querer instalar y hacer funcionar doctrine en nuestro querido y amado Windows, me encontré con un par de problemas, y por lo que vi en internet a varios le paso lo mismo, vamos a tomar como ejemplo el Doctrine –...
by AgeValed
1

 
 
PHP

Zend Framework – Almacenamiento de sesión en base de datos

En este mini tutorial voy a mostrarles como guardar la sesión en base de datos con ZF 1, esto es muy util para manejo de sesiones en un entorno con múltiples servidores. Material Relacionado Zend_Session_SaveHandler_DbTable Z...
by AgeValed
0

 
 

PHP Conference Argentina 2013

El 4 y 5 de Octubre se celebrará, en la Ciudad de Buenos Aires (Argentina), la PHP Conference Argentina, edición local de la conferencia PHP más popular. Esta edición no solamente está destinada a los programadores PHP, ...
by AgeValed
0

 

 

PHP 5.4.0 liberado!

Les comento que ya se encuentra la nueva versión de PHP liberada, la versión 5.4.0, luego de varios updates que se hicieron a la versión PHP 5.3 ya contamos con nuevas versión que incluye (según ellos) un gran núme...
by AgeValed
0

 
 
PHP

Zend Framework – Zend_Translate + Zend_Route

Les quiero compartir algo que estaba necesitando para un sitio web que estoy creando, y estuve peleando bastante para que funcione todo perfecto. Primero que nada quiero agradecer a Jon Lebensold con la Introducción a Zend...
by AgeValed
12

 




2 Comentarios


  1. Maresita

    hola, estoy crenado una pagina web en la cual debo poder enviar mail’s, pero he intentado con servidores SMPT y no me han funcionado, buscando mas opciones me encontre con esta pagina y me parecio muy interesante, aunque tengo algunas dudas:
    cual es el archivo de configuración?
    como creo los archivos y directorios a la carpeta library y donde se encuantra esta carpeta?



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*