web-dev-qa-db-fra.com

Comment créer un modèle d'e-mail dans Zend Framework?

Je veux créer des modèles d'e-mails dans Zend Framework.

Par exemple,

<html>
<body>
Dear {$username$},<br>
This is a invitation email sent by your {$friend$}.<br>
Regards,<br>
Admin
</body>
</html>

Je veux créer ce fichier, l'obtenir dans le framework Zend, définir ces paramètres (nom d'utilisateur, ami) puis envoyer l'e-mail.

Comment puis je faire ça? Est-ce que Zend le supporte?

63
Billy

Salut, c'est vraiment courant.

Créez un script de vue comme: /views/emails/template.phtml

<body>
<?php echo $this->name; ?>
<h1>Welcome</h1>
<?php echo $this->mysite; ?>
</body>

et lors de la création de l'e-mail:

// create view object
$html = new Zend_View();
$html->setScriptPath(APPLICATION_PATH . '/modules/default/views/emails/');

// assign valeues
$html->assign('name', 'John Doe');
$html->assign('site', 'limespace.de');

// create mail object
$mail = new Zend_Mail('utf-8');

// render view
$bodyText = $html->render('template.phtml');

// configure base stuff
$mail->addTo('[email protected]');
$mail->setSubject('Welcome to Limespace.de');
$mail->setFrom('[email protected]','Limespace');
$mail->setBodyHtml($bodyText);
$mail->send();
104
opHASnoNAME

Juste pour compléter la réponse d'ArneRie ici (qui est déjà très pertinente), j'aime avoir dans mes projets une classe pour gérer l'envoi d'emails et différents modèles en même temps.

Cette classe peut être dans votre bibliothèque par exemple (/library/My/Mail.php):

class My_Mail
{
    // templates name
    const SIGNUP_ACTIVATION          = "signup-activation";
    const JOIN_CLUB_CONFIRMATION     = "join-club-confirmation";


    protected $_viewSubject;
    protected $_viewContent;
    protected $templateVariables = array();
    protected $templateName;
    protected $_mail;
    protected $recipient;

    public function __construct()
    {
        $this->_mail = new Zend_Mail();
        $this->_viewSubject = new Zend_View();
        $this->_viewContent = new Zend_View();
    }

    /**
     * Set variables for use in the templates
     *
     * @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;
    }

    /**
     * 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 email
     *
     * @todo Add from name
     */
    public function send()
    {
        $config = Zend_Registry::get('config');
        $emailPath = $config->email->templatePath;
        $templateVars = $config->email->template->toArray();

        foreach ($templateVars as $key => $value)
        {
            if (!array_key_exists($key, $this->templateVariables)) {
                $this->{$key} = $value;
            }
        }


        $viewSubject = $this->_viewSubject->setScriptPath($emailPath);
        foreach ($this->templateVariables as $key => $value) {
            $viewSubject->{$key} = $value;
        }
        $subject = $viewSubject->render($this->templateName . '.subj.tpl');


        $viewContent = $this->_viewContent->setScriptPath($emailPath);
        foreach ($this->templateVariables as $key => $value) {
            $viewContent->{$key} = $value;
        }
        $html = $viewContent->render($this->templateName . '.tpl');

        $this->_mail->addTo($this->recipient);
        $this->_mail->setSubject($subject);
        $this->_mail->setBodyHtml($html);

        $this->_mail->send();
    }
}

J'aime avoir des options Zend_Mail (telles que le transport, le nom de l'expéditeur par défaut, etc.) définies dans mon application.ini comme suit:

;------------------------------------------------------------------------------
;; Email
;------------------------------------------------------------------------------
resources.mail.transport.type       = smtp
resources.mail.transport.Host       = "192.168.1.8"
;resources.mail.transport.auth      = login
;resources.mail.transport.username  = username
;resources.mail.transport.password  = password
;resources.mail.transport.register  = true
resources.mail.defaultFrom.email    = [email protected]
resources.mail.defaultFrom.name     = "My Site Name"
resources.mail.defaultReplyTo.email = [email protected]
resources.mail.defaultReplyTo.name  = "My Site Name"

email.templatePath = APPLICATION_PATH "/modules/default/views/scripts/emails"
email.template.newsletter = "My Site Name - Newsletter" // default templates

Et maintenant, de n'importe où dans mon application, je peux simplement envoyer un email en utilisant par exemple:

    $mail = new My_Mail;
    $mail->setRecipient("[email protected]");
    $mail->setTemplate(My_Mail::SIGNUP_ACTIVATION);
    $mail->email = $user->email;
    $mail->token = $token; // generate token for activation link
    $mail->firstName = $user->firstName;
    $mail->lastName = $user->lastName;
    $mail->send();

Cela définira le modèle et les variables de modèle via un setter magique . Enfin, mes modèles sont localisés dans APPLICATION_PATH "/ modules/default/views/scripts/emails" (peut être modifié dans le application.ini ). Un modèle typique serait:

// in /views/scripts/emails/signup-activation.tpl
<p> Hi,<br /><br /> You almost done, please finish your registration:<br />
<a href="http://www.example.com
  <?= $this->url(array('controller' => 'account', 
                       'action'     => 'index', 
                       'e'          => $this->email, 
                       't'          => $this->token), 'default', true) ?>
  ">Click here</a>
</p>

// in /views/scripts/emails/signup-activation.subj.tpl
My Site Name - Account Activation Link

$this->email et $this->token sont les variables du modèle.

22
Liyali