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
où $this->email
et $this->token
sont les variables du modèle.
Cher Robert Jones, ceci est une invitation envoyée par votre John Smith. Cordialement, Admin. :) –