Динамическое изменение настроек smtp в SwiftMailer

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

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

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


person Ivan    schedule 23.05.2012    source источник
comment
Мне просто интересно, как вы храните пароль?   -  person Gigala    schedule 12.02.2013
comment
@Gigala Я вижу, что ты там сделал. Да, на этот вопрос нужно ответить!   -  person aalaap    schedule 16.06.2016
comment
@aalaap, ха-ха, мой старый комментарий :P   -  person Gigala    schedule 16.06.2016


Ответы (4)


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

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 );    
}
person Ivan    schedule 24.05.2012

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

Класс слушателя

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

}

Декларация службы,

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

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

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

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

person Wpigott    schedule 12.07.2013

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

person Andrew Zhilin    schedule 28.12.2013
comment
Привет, какой ответ вы имеете в виду? Спасибо! - person Acyra; 15.03.2014
comment
любой из перечисленных выше. Если вы изменяете настройки Swift динамически - вы должны вызвать stop после него, чтобы применить изменения :) - person Andrew Zhilin; 10.12.2014
comment
Ты сэкономил мне много времени, приятель :) Большое тебе спасибо! Я пытался отправлять электронные письма в цикле с разными настройками аутентификации и все время получал ошибку Expected response code 250 but got code 553. - person leealex; 09.03.2018