válido para Symfony 1.3 y 1.4
Si no dispones de un servidor SMTP pero tienes una cuenta de correo electrónico de Gmail, utiliza la siguiente configuración para enviar los mensajes a través de los servidores de Google:
transport:
class: Swift_SmtpTransport
param:
host: smtp.gmail.com
port: 465
encryption: ssl
username: tu_nombre_de_usuario_de_gmail
password: tu_contrasena_de_gmail
Sustituye el valor de las opciones username y password por tus
credenciales de Gmail y ya puedes empezar a enviar emails.
Si necesitas una configuración mayor que la proporcionada por el archivo de
configuración factories.yml, puedes utilizar el evento mailer.configure
para personalizar todavía más el objeto mailer.
Puedes conectar tu aplicación con este evento directamente en la clase
ProjectConfiguration, tal y como se muestra a continuación:
class ProjectConfiguration extends sfProjectConfiguration { public function setup() { // ... $this->dispatcher->connect( 'mailer.configure', array($this, 'configurarMailer') ); } public function configurarMailer(sfEvent $event) { $mailer = $event->getSubject(); // hacer algo con el objeto mailer } }
La siguiente sección muestra un caso práctico de esta técnica.
Los plugins de Swift Mailer plugins requieren el uso del evento
mailer.configure explicado en la sección anterior:
public function configurarMailer(sfEvent $event) { $mailer = $event->getSubject(); $plugin = new Swift_Plugins_ThrottlerPlugin( 100, Swift_Plugins_ThrottlerPlugin::MESSAGES_PER_MINUTE ); $mailer->registerPlugin($plugin); }
La sección "Plugins" de la documentación oficial de Swift Mailer describe todas las características de los plugins incluidos en la librería.
El comportamiento por defecto de las colas es muy simple. Se seleccionan todos los emails de la cola de forma aleatoria y se envían.
Puedes configurar una cola para que se limite el tiempo (en segundos) dedicado al envío de los mensajes o para que se limite el número de mensajes a enviar:
$spool = $mailer->getSpool(); $spool->setMessageLimit(10); $spool->setTimeLimit(10);
En esta sección se explica cómo crear un mecanismo de prioridad para la cola y se muestra todo lo necesario para desarrollar nuestra propia lógica.
En primer lugar se añade en el esquema una columna de prioridad:
# para Propel
mail_message:
message: { type: clob, required: true }
created_at: ~
priority: { type: integer, default: 3 }
# para Doctrine
MailMessage:
actAs: { Timestampable: ~ }
columns:
message: { type: clob, notnull: true }
priority: { type: integer }
Cuando se envía un email, se establece la cabecera de prioridad (siendo 1
la máxima prioridad):
$mensaje = $this->getMailer() ->compose('remitente@ejemplo.com', 'destinatario@ejemplo.com', 'Asunto', 'Cuerpo') ->setPriority(1) ; $this->getMailer()->send($mensaje);
A continuación, redefine el método setMessage() por defecto para modificar
la prioridad del propio objeto MailMessage:
// para Propel class MailMessage extends BaseMailMessage { public function setMessage($mensaje) { $msg = unserialize($mensaje); $this->setPriority($msg->getPriority()); parent::setMessage($mensaje); } } // para Doctrine class MailMessage extends BaseMailMessage { public function setMessage($mensaje) { $msg = unserialize($mensaje); $this->priority = $msg->getPriority(); $this->_set('message', $mensaje); } }
Ten en cuenta que la cola serializa los mensajes, así que es necesario deserializar el mensaje antes de obtener su prioridad. A continuación es necesario crear un método que ordene los mensajes por prioridad:
// para Propel class MailMessagePeer extends BaseMailMessagePeer { static public function getSpooledMessages(Criteria $criteria) { $criteria->addAscendingOrderByColumn(self::PRIORITY); return self::doSelect($criteria); } // ... } // para Doctrine class MailMessageTable extends Doctrine_Table { public function getSpooledMessages() { return $this->createQuery('m') ->orderBy('m.priority') ; } // ... }
El último paso consiste en definir en el archivo de configuración
factories.yml el método que se invoca para obtener los mensajes de la cola:
spool_arguments: [ MailMessage, message, getSpooledMessages ]
Y eso es todo lo que hay que hacer. Ahora, cuando ejecutes la tarea
project:send-emails, los mensajes se enviarán de acuerdo a su prioridad.
válido para Symfony 1.3 y 1.4