El componente Email es una manera simple de agregarle a tu aplicación CakePHP la funcionalidad de envío de mails, usando los mismos conceptos de layouts, vistas, archivos .ctp, etc, formateados como texto, html, o ambos. Puede enviar mails por medio de las funciones propias de PHP, vía servidor SMTP o en modo DEBUG en el que escribe el mensaje en un mensaje flash de sesión. También soporta archivos adjuntados y inclusión/filtrado simple de encabezados. Hay un montón de cosas que no hace por tí, pero te pondrá en movimiento.
Estos son los valores que puedes configurar antes de hacer la llamada
EmailComponent::send()
to
dirección a la que se dirige el mensaje (string)
cc
arreglo de direcciones a enviar copias del mensaje (CC)
bcc
arreglo de direcciones a enviar las copias ocultas del mensaje (CCO)
replyTo
dirección de respuesta(string)
from
dirección remitente (string)
subject
asunto del mensaje (string)
template
Elemento email a usar para el mensaje(ubicado en
app/views/elements/email/html/
y en
app/views/elements/email/text/
)
layout
Layout usado por el mail (ubicado en app/views/layouts/email/html/
y
en app/views/layouts/email/text/
)
lineLength
Longitud (en caracteres) en la que corta las líneas largas. Por defecto es 70. (integer)
sendAs
Como quieres mandar el mensaje: text
(texto), html
(código
HTML) o both
(ambos).
attachments
Arreglo de archivos a enviar (rutas absolutas y relativas)
delivery
Como enviar el mensaje (mail
, smtp
[requerirá el campo
smtpOptions explicado abajo] y debug
)
smtpOptions
Arreglo asociativo de opciones para el envío por SMTP.
(port
(puerto), host
(servidor), timeout
(tiempo de
espera), username
(nombre de usuario), password
(contraseña))
Hay algunas opciones más para configurar, para mayor información consulta la documentación de CakePHP.
Si lo que quieres es enviar varios emails usando un bucle, deberás
resetear los campos de mails usando el método reset()
del componente
Email. Necesitarás resetearlo antes de setear nuevamente las propiedades
del email.
$this->Email->reset()
If you do not want to actually send an email and instead want to test out the functionality, you can use the following delivery option:
$this->Email->delivery = 'debug';
In order to view those debugging information you need to create an extra line in your view or layout file (e.g. underneath your normal flash message in /layouts/default.ctp):
<?php echo $this->Session->flash(); ?>
<?php echo $this->Session->flash('email'); ?>
Para enviar un mensaje sin usar ningún template, sólo pasa el cuerpo del
mensaje como una cadena (string) o un arreglo de líneas al método
send()
. Por ejemplo:
$this->Email->from = 'Alguien <[email protected]>';
$this->Email->to = 'Alguien más <[email protected]>';
$this->Email->subject = 'Prueba';
$this->Email->send('Hola cuerpo de mensaje!!!');
Para usar tanto texto como html en el email necesitarás crear los
archivos de layout para ellos. Tal como lo hayas hecho para tu layout
default para las vistas en un navegador, precisas establecer los
layouts default para tus emails. En la carpeta app/views/layouts/
precisas tener (como mínimo) esta estructura
email/
html/
default.ctp
text/
default.ctp
Estos son los archivos que conservan los valores por defecto para los templates de layout para tus mensajes. Un simple ejemplo de contenido:
email/text/default.ctp
<?php echo $content_for_layout; ?>
email/html/default.ctp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
<?php echo $content_for_layout; ?>
</body>
</html>
En el directorio app/views/elements/email/
debes configurar carpetas
para text
(mails modo texto) y html
(mails modo HTML) a menos
que quieras usar sólo uno de ellos. En cada una de estas carpetas debes
crear templates para poder utilizar con el contenido que le envíes a la
vista ya sea usando $this->set() o usando el parámetro $contents del
método send(). Algunos ejemplos simples a continuación, usando el
template simple_message.ctp
text
Estimado <?php echo $User['first']. ' ' . $User['last'] ?>,
Gracias por su interés.
html
<p>Estimado <?php echo $User['first']. ' ' . $User['last'] ?>,<br />
Gracias por su interés.</p>
En tu controlador necesitas agregar el componente a tu array
$components
o agregar un array $components a tu controlador de la
forma:
<?php
var $components = array('Email');
?>
En este ejemplo configuraremos un método privado para manejar el envío
de mensajes de email a un usuario identificado por un $id
. En
nuestro controlador (usemos el controlador User en este ejemplo):
<?php
function _sendNewUserMail($id) {
$User = $this->User->read(null,$id);
$this->Email->to = $User['User']['email'];
$this->Email->bcc = array('[email protected]');
$this->Email->subject = 'Bienvenido a nuestra cosa genial';
$this->Email->replyTo = '[email protected]';
$this->Email->from = 'Cool Web App <[email protected]>';
$this->Email->template = 'simple_message'; // NOTAR QUE NO HAY '.ctp'
//Enviar como 'html', 'text' or 'both' (ambos) - (por defecto es 'text')
$this->Email->sendAs = 'both'; // queremos enviar un lindo email
//Variables de la vista
$this->set('User', $User);
//NO PASAMOS ARGUMENTOS A SEND()
$this->Email->send();
}
?>
Has enviado un mensaje, podrías llamarlo desde otro método de esta forma:
$this->_sendNewUserMail( $this->User->id );
Here’s how you can send file attachments along with your message. You
set an array containing the paths to the files to attach to the
attachments
property of the component.
$this->Email->attachments = array(
TMP . 'foo.doc',
'bar.doc' => TMP . 'some-temp-name'
);
The first file foo.doc
will be attached with the same filename. For
the second file we specify an alias bar.doc
will be be used for
attaching instead of its actual filename some-temp-name
Para enviar un mail usando servidor SMTP, los pasos a seguir son
similares a los del mensaje básico. Configurar el método de entrega
(delivery) a smtp
y asignar las opciones a las propiedades del
objeto de Email smtpOptions
. También puedes obtener los errores SMTP
generados durante la sesión leyendo la propiedad smtpError
del
componente.
/* Opciones SMTP*/
$this->Email->smtpOptions = array(
'port'=>'25',
'timeout'=>'30',
'host' => 'tu.servidor.smtp',
'username'=>'tu_nombre_usuario_smtp',
'password'=>'tu_contraseña_smtp');
/* Configurar método de entrega */
$this->Email->delivery = 'smtp';
/* No le pases ningún argumento a send() */
$this->Email->send();
/* Chequeo de errores SMTP. */
$this->set('smtp-errors', $this->Email->smtpError);
Si tu servidor SMTP requiere autenticación, asegúrate de especificar los
parámetros de nombre de usuario y contraseña en smtpOptions
como se
ve en el ejemplo.