Cuando estás utilizando el SwiftmailerBundle para enviar correo electrónico desde una aplicación Symfony2, de manera predeterminada el mensaje será enviado inmediatamente. Sin embargo, posiblemente quieras evitar el impacto en el rendimiento de la comunicación entre SwiftMailer y el transporte de correo electrónico, lo cual podría hacer que el usuario tuviera que esperar la carga de la siguiente página mientras que se envía el correo electrónico. Puedes evitar todo esto eligiendo «spool», para formar los mensajes en la cola de correo en lugar de enviarlos directamente. Esto significa que SwiftMailer no intentará enviar el correo electrónico, sino que guardará el mensaje en alguna parte, tal como un archivo. Otro proceso puede leer la cola y hacerse cargo de enviar los correos que están organizados en la cola. Actualmente sólo la organización en archivos o memoria es compatible con Swiftmailer.
Cuándo organizas almacenando los mensajes de correo electrónico en memoria, conseguirás enviarlos antes de que el núcleo termine. Esto significa que el mensaje de correo será enviado si la petición entera se ejecutó sin excepción no controladas o algún error. Para configurar swiftmailer con la opción de memoria, usa la siguiente configuración:
# app/config/config.yml
swiftmailer:
# ...
spool: { type: memory }
<!-- app/config/config.xml -->
<!--
xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd
-->
<swiftmailer:config>
<swiftmailer:spool type="memory" />
</swiftmailer:config>
// app/config/config.php
$container->loadFromExtension('swiftmailer', array(
...,
'spool' => array('type' => 'memory')
));
Para utilizar la organización con un archivo, usa la siguiente configuración:
# app/config/config.yml
swiftmailer:
# ...
spool:
type: file
path: /ruta/a/spool
<!-- app/config/config.xml -->
<!--
xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd
-->
<swiftmailer:config>
<swiftmailer:spool
type="file"
path="/ruta/a/spool" />
</swiftmailer:config>
// app/config/config.php
$container->loadFromExtension('swiftmailer', array(
// ...
'spool' => array(
'type' => 'file',
'path' => '/ruta/a/spool',
),
));
Truco
Si deseas almacenar la cola de correo en algún lugar en el directorio de tu proyecto, recuerda que puedes utilizar el parámetro %kernel.root_dir% para referirte a la raíz del proyecto:
path: "%kernel.root_dir%/spool"
Ahora, cuando tu aplicación envía un correo electrónico, no se enviará realmente, sino que se añade a la cola de correo. El envío de los mensajes desde la cola se hace por separado. Hay una orden de consola para enviar los mensajes en la cola de correo:
$ php app/console swiftmailer:spool:send --env=prod
Tiene una opción para limitar el número de mensajes que se enviarán:
$ php app/console swiftmailer:spool:send --message-limit=10 --env=prod
También puedes establecer el límite de tiempo en segundos:
$ php app/console swiftmailer:spool:send --time-limit=10 --env=prod
Por supuesto que en realidad no deseas ejecutar esto manualmente. En cambio, la orden de consola la debe activar un trabajo cronometrado o tarea programada y ejecutarse a intervalos regulares.