Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony]sfMailer i kilka maili
Forum PHP.pl > Forum > PHP > Frameworki
athabus
Witam,

chciałbym za pomocą sfMailer w Symfony (SwiftMailer) wysyłać maile z kilku różnych skrzynek.
Niestety nigdzie nie mogę znaleźć jak to osiągnąć - w factories.yml mogę zdefiniować dane domyślnego konta email, ale nie wiem jak osiągnąć efekt, aby w akcji móc dynamicznie zmieniać skrzynkę (czyli transport). Interesuje mnie zarówno możliwość zdefiniowania kilku skrzynek w factories.yml (ale to chyba nie jest możliwe) jak również dynamiczne ustawianie opcji transportu wewnątrz akcji.

Czy wie ktoś może, jak osiągnąć taki efekt bo utknąłem w tym miejscu.
Wiem, że ostatecznie mogę skorzystać z gołego SwiftMailera, ale wtedy nie będę miał dostępu do dobrodziejstw korzystania z sfMailera - np. podczas pracy z wersją "dev".

destroyerr
Nie chciało mi się za bardzo opisywać jak to zrobić, więc naszkicowałem kawałek kodu, wydaje mi się, że zadziała. Konfiguracja poprzez factories.yml lub bezpośrednio przez php, jak wolisz.
Tworzysz nowy transport:
  1. class MultipleTransports implements Swift_Transport
  2. {
  3. protected $transports = array();
  4. protected $currentTransportName = '';
  5.  
  6. public function isStarted($transportName = null)
  7. {
  8. return $this->getTransport($transportName)->isStarted();
  9. }
  10.  
  11. public function start($transportName = null)
  12. {
  13. return $this->getTransport($transportName)->start();
  14. }
  15.  
  16. public function stop($transportName = null)
  17. {
  18. return $this->getTransport($transportName)->stop();
  19. }
  20.  
  21. public function send(Swift_Mime_Message $message, &$failedRecipients = null, $transportName = null)
  22. {
  23. $this->getTransport($transportName)->send($message, $failedRecipients);
  24. }
  25.  
  26. public function registerPlugin(Swift_Events_EventListener $plugin)
  27. {
  28. foreach($this->transports as $transport)
  29. {
  30. $transport->registerPlugin($plugin);
  31. }
  32. }
  33.  
  34. public function setTransports($transports)
  35. {
  36. foreach($transports as $name => $parameters)
  37. {
  38. //wiem, ze nie tak, ale to tylko szkic
  39. $dispatcher = sfContext::getInstance()->getEventDispatcher();
  40. $mailer = new sfMailer($dispatcher, $paramters);
  41. $this->transports[$name] = $mailer->getTransport();
  42. }
  43. }
  44.  
  45. public function getTransport($name = null)
  46. {
  47. $name = $name ? $name : $this->currentTransportName;
  48. return $this->transports[$name];
  49. }
  50.  
  51. public function setCurrentTransportName($name)
  52. {
  53. $this->currentTransportName = $name;
  54. }
  55. }

Konfigurujesz:
Kod
  mailer:
    class: sfMailer
    param:
      logging:           %SF_LOGGING_ENABLED%
      charset:           %SF_CHARSET%
      delivery_strategy: realtime
      transport:
        class: MultipleTransports
        param:
          currentTransportName: first
          transports:
            first:
              class: Swift_SmtpTransport
              param:
                host:       localhost
                port:       25
                encryption: ~
                username:   ~
                password:   ~
            second:
              class: Swift_SmtpTransport
              param:
                host:       localhost
                port:       25
                encryption: ~
                username:   ~
                password:   ~
            third:
              class: Swift_SmtpTransport
              param:
                host:       localhost
                port:       25
                encryption: ~
                username:   ~
                password:   ~

Używasz:
  1. class someActions extends sfActions
  2. {
  3. public function executeSendMail(sfWebRequest $request)
  4. {
  5. $mailer = $this->getMailer();
  6. $message = $mailer->compose(/* ... */);
  7. $mailer->send($message);
  8.  
  9. //inny transport
  10. $mailer->getTransport()->setCurrentTransportName('second');
  11. $mailer->send($message);
  12.  
  13. //z nadpisaną metodą sfMailer::send()
  14. $mailer->send($message, null, 'third');
  15. }
  16. }


Potrzebna jeszcze obsługa błędów ale nie chciało mi się i może tak wygląda czytelniej.
athabus
Bardzo ciekawe rozwiązanie - muszę je wypróbować. Ja tymczasem spróbowałem trochę innego podejścia - tj. zdefiniowałem klasę dziedziczącą po sfMailer i w konstruktorze tworzącą nowy transport z dynamicznymi parametrami - nie jest tak eleganckie jak Twoje rozwiązanie, ale jakoś działa.

Jeszcze raz dzięki, że poświęciłeś tyle czasu na mój problem - spróbuję zaimplementować Twoje rozwiązanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.