Enviar emails en cakePHP
Llevo ya un tiempo rematando (eso que los programadores llamamos rematar, que realmente quiere decir que aún queda un mes de curro) la nueva tienda online de bambooapps, que va a correr sobe cakePHP.
Los motivos de la elección de ese framework en concreto son múltiples, y al contrario de lo que suele ocurrir en estos casos, y una vez terminado el proyecto, debo reconocer que la elección ha sido un acierto, y que cada día me gusta más el framework.
Una de las soluciones que me han parecido más elegantes es la que han adoptado para el envío de correos electrónicos. Configuración cero, y separación de la presentación del email en dos capas: por un lado, el layout general y por otro la vista del mensaje.
Enviar un mensaje es muy sencillo. Por ejemplo:
{
$this->Registration->id = $id;
$this->set('registration', $this->Registration->read());
$this->Email->to = $this->Registration->email;
$this->Email->bcc = array('support@bambooapps.com');
$this->Email->subject = 'License recovery';
$this->Email->replyTo = 'support@bambooapps.com';
$this->Email->from = 'bambooapps <support@bambooapps.com>';
$this->Email->template = 'simple_message';// ctp filename
$this->Email->sendAs = 'both';//text and html
$this->Email->send();
}
Este método es un método privado de un controlador encargado de gestionar los usuarios registrados, y que envía el típico email de recuperación de número de serie.
La presentación del email a enviar está separada en dos partes. Por un lado el layout general, se encuentra en app/layouts/email/html/default.ctp, en el caso del mensaje en formato html, y en app/layouts/email/text/default.ctp para el mensaje de sólo texto. El layout podría ser algo como:
<body>
<div id="mensaje">
<?php echo $content_for_layout ?>
</div>
</body>
</html>
El contenido real del mensaje, las dos vistas, html y texto, están en app/views/email/html/simple_message.ctp y app/views/email/text/simple_message.ctp
Por ejemplo, la vista para el mensaje html podría ser algo como:
According to our records, this is your license:<br/>
Name: <?php echo $registration['Registration']['name'] ?><br/>
E-mail: <?php echo $registration['Registration']['email'] ?><br/>
Serial Number: <?php echo $registration['Registration']['serial'] ?></p>
Y ya está. Separación perfecta de lógica, datos y presentación. Solución elegante.