2012-05-23 8 views
7

Używam pakietu SwiftMailer z Symfony 2. Przekazuję moje ustawienia użytkownika/hasła smtp w pliku config.yml, działa świetnie, ale muszę pobrać te ustawienia z bazy danych, kiedy " m wysyłanie poczty. mogę acces to params:Zmienianie ustawień smtp w SwiftMailer dynamicznie

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

Ale czy to możliwe, aby zmienić je w czasie wykonywania? Nie widzę żadnych metod setera. wielkie dzięki!

+1

Jestem tylko ciekaw, jak można przechowywać hasła? – Gigala

+0

@Gigala Widzę, co tam zrobiłeś. Tak, na to pytanie trzeba odpowiedzieć! – aalaap

+0

@aalaap haha ​​to mój stary komentarz: P – Gigala

Odpowiedz

3

Można utworzyć kernel.request zdarzeń słuchacza, wstrzyknąć swiftmailer.transport.real i zestaw informacji SMTP np

Listener klasy

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

} 

usługi 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

Wielkie dzięki, ale to nie jest rozwiązanie szukałem, na prośbę jądra nie wiem, którego konta użyję. Musiałem zmienić ustawienia wewnątrz pętli wysyłania poczty. znalazłem całkiem fajne rozwiązanie:

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

wiem, że to jest nieco stary, ale chciałem uzyskać odpowiedź w in-case pomaga kogoś innego. Używamy bufora plików z transportem SMTP i potrzebujemy mieć dostosowane połączenia serwera SMTP w zależności od strony.

Nasze rozwiązanie polegało na zmodyfikowaniu Swiftmailera, aby umożliwić dodanie dodatkowych danych do każdej wiadomości, a także powiązanie jej z Dispatcherem Symfony2. To pozwoliło nam wyodrębnić informacje o połączeniu z każdej wiadomości w czasie płukania bufora.

Zrobiliśmy to w pakiecie, dzięki czemu może być wykorzystany przez innych. Możesz przeczytać o tym here.

2

W rzeczywistości, należy zadzwonić $transport->stop(); ponieważ w inny sposób Swift Mailer nie będzie ponownie i stare ustawienia będą wykorzystane w trakcie wykonywania skryptu 1

+0

Witam, na którą odpowiedź się powołujesz? Dzięki! – Acyra

+2

dowolne z wymienionych powyżej. Jeśli zmienisz dynamicznie ustawienia Swift - powinieneś zadzwonić po tym, aby zastosować zmiany :) –

+0

Zaoszczędziłeś dużo czasu dla mnie kumpla :) Dziękuję bardzo! Próbowałem wysyłać e-maile w pętli z różnymi ustawieniami auth i otrzymywałem błąd 'Oczekiwany kod odpowiedzi 250, ale otrzymałem kod 553' przez cały czas. – leealex

Powiązane problemy