mail - ¿Cómo puedo hacer una plantilla de correo electrónico en Zend Framework?
zend mail message (2)
Quiero crear plantillas de correo electrónico en Zend Framework.
Por ejemplo,
<html>
<body>
Dear {$username$},<br>
This is a invitation email sent by your {$friend$}.<br>
Regards,<br>
Admin
</body>
</html>
Quiero hacer este archivo, obtenerlo en Zend framework, configurar esos parámetros (nombre de usuario, amigo) y luego enviar el correo electrónico.
¿Cómo puedo hacer eso? Zend apoya esto?
Hola, esto es realmente común.
Cree una secuencia de comandos de vista como: /views/emails/template.phtml
<body>
<?php echo $this->name; ?>
<h1>Welcome</h1>
<?php echo $this->mysite; ?>
</body>
y al crear el correo electrónico:
// 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();
Para completar la respuesta de ArneRie aquí (que ya es muy relevante), me gusta tener en mis proyectos una clase para manejar el envío de correo electrónico y diferentes plantillas al mismo tiempo.
Esta clase podría estar en su biblioteca, por ejemplo (/ 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();
}
}
Me gusta tener algunas opciones de Zend_Mail (como transporte, nombre del remitente predeterminado, etc.) configuradas en mi application.ini de la siguiente manera:
;------------------------------------------------------------------------------
;; 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
Y ahora, desde cualquier lugar de mi aplicación, simplemente puedo enviar un correo electrónico utilizando, por ejemplo:
$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();
Esto establecerá la plantilla y las variables de plantilla a través de un setter mágico . Por fin, mis plantillas están ubicadas en APPLICATION_PATH "/ modules / default / views / scripts / emails" (se pueden cambiar en la aplicación.ini ). Una plantilla típica sería:
// 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
donde $this->email
y $this->token
son las variables de la plantilla.