2012-05-23 3 views
7

J'utilise SwiftMailer bundle avec Symfony 2. Je passe mes paramètres utilisateur smtp/mot de passe dans le fichier config.yml, cela fonctionne très bien, mais je dois prendre ces paramètres de base de données, quand je ' m envoyer du courrier. Je peux plus accéder ce params:Modification dynamique des paramètres SMTP dans SwiftMailer

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

Mais est-il possible de les modifier à l'exécution? Je ne vois aucune méthode de setter. merci beaucoup!

+1

Je suis juste curieux, comment entreposez-vous le mot de passe? – Gigala

+0

@Gigala Je vois ce que vous avez fait là-bas. Oui, cette question doit être répondue! – aalaap

+0

@aalaap haha ​​ce vieux commentaire à mon sujet: P – Gigala

Répondre

3

Vous pouvez créer un écouteur d'événement kernel.request, injecter swiftmailer.transport.real et définir les informations SMPT par exemple

Listener classe

namespace Namespace\Of\YourListener; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 

class YourListener implements EventSubscriberInterface 
{ 

    /** 
    * @var Swift_Transport_EsmtpTransport 
    */ 
    private $transport; 

    /** 
    * @var Doctrine\ORM\EntityManager 
    */ 
    private $em; 

    public function __construct($transport, $em) 
    { 
     $this->transport = $transport; 
     $this->em = $em; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     //fetch info from db 
     $this->transport->setHost("host"); 
     $this->transport->setPort("port"); 
     $this->transport->setUserName("username"); 
     $this->transport->setPassword("pass"); 
    } 

    static public function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::REQUEST => array('onKernelRequest', 0) 
     ); 
    } 

} 

service decleration,

your_listener: 
    class: FQCN\Of\YourListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
    arguments: [@swiftmailer.transport.real, @doctrine.orm.entity_manager] 
6

Un grand merci, mais ce n'est pas la solution Je regardais, sur la demande du noyau je ne sais pas quel compte je vais utiliser. J'avais besoin de changer les paramètres dans ma boucle de courrier d'envoi. J'ai trouvé une solution assez cool:

foreach ($locations as $location) { 
    // get settings for account 
    $user = $location->getSmtpUser(); 
    $pass = $location->getSmtpPass(); 

    // switch to new settings 
    $transport = $this->getContainer()->get('mailer')->getTransport();    
    $ext = $transport->getExtensionHandlers(); 
    $auth_handler = $ext[0];    
    $auth_handler->setUserName($user); 
    $auth_handler->setPassword($pass); 

    // send message using new settings 
    $message = \Swift_Message::newInstance() 
     ->setSubject($subject) 
     ->setFrom($from) 
     ->setTo($email) 
     ->setBody($body) 
     ->setContentType('text/html'); 

     $this->getContainer()->get('mailer')->send($message);  
} 
2

Je sais que c'est un peu vieux, mais je voulais obtenir une réponse en cas, il aide quelqu'un d'autre. Nous utilisons le spooler de fichiers avec un transport SMTP et avons besoin d'avoir des connexions de serveur SMTP personnalisées en fonction du site.

Notre solution était de modifier Swiftmailer pour permettre des données supplémentaires sur chaque message ainsi que de l'attacher dans Event Dispatcher de Symfony2. Cela nous a permis d'extraire les informations de connexion de chaque message au moment du rinçage du tiroir.

Nous l'avons fait en un paquet afin qu'il puisse être exploité par d'autres. Vous pouvez lire à ce sujet here.

2

En fait, vous devez appeler $transport->stop(); parce que d'une autre manière Swift Mailer ne sera pas reconnecter et ancien paramètre sera utilisé lors de l'exécution de script 1

+0

Salut à quelle réponse parlez-vous? Merci! – Acyra

+2

tout de la liste ci-dessus. Si vous changez les paramètres de Swift dynamiquement - vous devriez appeler stop après pour appliquer les changements :) –

+0

Vous avez économisé beaucoup de temps pour mon pote :) Merci beaucoup! J'ai essayé d'envoyer des courriels dans une boucle avec différents paramètres d'authentification et obtenais l'erreur 'Code de réponse prévu 250 mais j'ai reçu le code 553' tout le temps. – leealex

Questions connexes