Cómo formar en la cola mensajes de correo electrónico

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.

Organizar usando la memoria

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:

  • YAML
    # app/config/config.yml
    swiftmailer:
        # ...
        spool: { type: memory }
    
  • XML
    <!-- 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>
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('swiftmailer', array(
         ...,
        'spool' => array('type' => 'memory')
    ));
    

Organizar usando un archivo

Para utilizar la organización con un archivo, usa la siguiente configuración:

  • YAML
    # app/config/config.yml
    swiftmailer:
        # ...
        spool:
            type: file
            path: /ruta/a/spool
    
  • XML
    <!-- 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>
    
  • PHP
    // 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.

Bifúrcame en GitHub