2009-08-02 7 views
62

Je souhaite créer des modèles d'e-mail dans Zend Framework.Comment puis-je créer un modèle de courrier électronique 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 faire ce fichier, faites-le dans le Zend Framework, définissez les paramètres (nom d'utilisateur, ami), puis envoyer l'e-mail.

Comment puis-je faire cela? Est-ce que Zend supporte cela?

+3

Cher Robert Jones, ceci est une invitation envoyée par votre John Smith. Cordialement, Admin. :) –

Répondre

103

Salut c'est vraiment commun.

Créer 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 du 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(); 
+13

Il est à noter que si vous êtes dans une action de contrôleur et que vous n'avez pas dévié trop loin de l'architecture MVC par défaut, vous pouvez simplement utiliser l'instance de vue existante plutôt que d'en créer une nouvelle (si vous ne vous inquiétez pas de la portée variable). '$ bodyText = $ this-> view-> render ('template.phtml')' suffira dans la plupart des cas. – jason

22

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

Cette classe pourrait être dans votre bibliothèque par exemple (/ bibliothèque/Mon /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 de Zend_Mail (tels que le transport, par défaut le nom de l'expéditeur, etc.) situé 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, où que vous soyez dans ma demande, je peux simplement envoyer un e-mail 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 magic setter. Enfin, mes modèles sont localisés dans APPLICATION_PATH "/ modules/default/vues/scripts/emails" (peut être modifié dans l'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.

+3

+1, Faire de cette manière, mais au lieu de DI de pauvre, j'élargis Zend_Mail –

Questions connexes