2012-05-23 2 views
7

Я использую пакет SwiftMailer с Symfony 2. Я передаю свои настройки пользователя/пароля smtp в файле config.yml, он отлично работает, но мне нужно принять эти настройки из базы данных, m отправка mail. я могу Acces это Params:Изменение настроек smtp в SwiftMailer динамически

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

Но можно ли изменить их во время выполнения? Я не вижу никаких методов сеттера. большое спасибо!

+1

Мне просто интересно, как вы храните пароль? – Gigala

+0

@ Гигала Я вижу, что вы там делали. Да, на этот вопрос нужно ответить! – aalaap

+0

@aalaap ха-ха, что старый комментарий моей: P – Gigala

ответ

3

Вы можете создать kernel.request слушателя событий, впрыснуть swiftmailer.transport.real и установить ФПУЮ информацию, например

Слушателя класс

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) 
     ); 
    } 

} 

службу 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

Большого спасибо, но это не решение Я смотрел, по запросу ядра я не знаю, какую учетную запись я буду использовать. Мне нужно было изменить настройки внутри моего почтового цикла. я нашел довольно прохладное решение:

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

Я знаю, что это немного старый, но я хотел бы получить ответ в в-случае это помогает кому-то еще. Мы используем диспетчер очереди сообщений с транспортом SMTP и должны иметь настроенные соединения SMTP-сервера в зависимости от сайта.

Наше решение заключалось в том, чтобы модифицировать Swiftmailer, чтобы предоставить дополнительные данные для каждого сообщения, а также привязать его к диспетчеру событий Symfony2. Это позволило нам извлечь информацию о соединении из каждого сообщения во время промывки катушки.

Мы сделали это в комплекте, чтобы его могли использовать другие. Вы можете прочитать об этом here.

2

В самом деле, вы должны вызвать $transport->stop(); , потому что по-другому Swift Mailer не будет восстановить и старые настройки будут использоваться во время выполнения сценария 1

+0

Привет, на какой ответ вы имеете в виду? Благодаря! – Acyra

+2

любой из перечисленных выше. Если вы меняете настройки Swift динамически - вы должны называть стоп после того, как применить изменения :) –

+0

Вы спасли мне много времени :) Спасибо большое! Я пытался отправлять электронные письма в цикле с разными настройками auth и получал ошибку «Ожидаемый код ответа 250, но получал код 553» все время. – leealex

Смежные вопросы