2012-09-04 18 views
6

En mi aplicación web Symfony2 se supone que debo enviar dos tipos de correos electrónicos: instantáneos y masivos. Los correos electrónicos instantáneos deben enviarse de inmediato, mientras que los correos electrónicos masivos deben enviarse usando el spool. Con la configuración predeterminada de Swiftmailer en Symfony2 es imposible hacerlo porque solo hay un servicio de correo.Cómo definir un servicio de correo adicional para utilizar el spool y enviar correos electrónicos instantáneos en Symfony2

preguntas similares se ha pedido aquí en SO (How to spool emails (in a task) and send normal emails in the moment in the other controllers?) sin suerte, pero de acuerdo a este hilo github (https://github.com/symfony/SwiftmailerBundle/issues/6) es posible crear un segundo servicio gestor de correo que puede ser configurado totalmente diferente a la predeterminada. Alguien allí (stof) recomienda como posible solución seguir la configuración que se encuentra en el SwiftmailerBundle (https://github.com/symfony/SwiftmailerBundle/blob/master/Resources/config/swiftmailer.xml) para crear este nuevo servicio, pero no sé exactamente cómo hacerlo.

¿Alguien sabe cómo crear un servicio de correo adicional que puedo configurar como un spool mientras tengo el servicio de correo predeterminado para enviar correos electrónicos regulares (instantáneos)?

Respuesta

11

he encontrado la solución here

Ésta es la forma en que he implementado:

En primer lugar, he configurado el servicio de correo predeterminado para trabajar como un carrete para enviar correos electrónicos masivos.

(config.yml)

swiftmailer: 
    transport: %mailer_transport% 
    encryption: %mailer_encryption% 
    auth_mode: %mailer_auth_mode% 
    host: %mailer_host% 
    username: %mailer_user% 
    password: %mailer_password% 
    spool: 
     type: file 
     path: "%kernel.root_dir%/spool" 

Luego, dentro de uno de mis paquetes (CommonBundle) que registró un nuevo servicio llamado "instant_mailer" que se asigna a la clase SwiftMailer.

(service.yml)

instant_mailer: 
    class: %swiftmailer.class% 
    arguments: ["@?swiftmailer.transport.real"] 

Por último, en mi controlador, siempre que lo desee enviar un correo electrónico usning el carrete acabo de hacer:

$mailer = $this->get('mailer'); 

Y para enviar un correo electrónico instantáneo:

$mailer = $this->get('instant_mailer'); 
+2

¡Agradable! Pero puede encontrarse con problemas si un entorno utiliza spooling y el otro no. Es posible que desee comprobar si '$ this-> get ('mailer') -> getTransport() instanciaof \ Swift_Transport_SpoolTransport' antes de cambiar al transporte .real ya que puede no existir. – bksunday

Cuestiones relacionadas