Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [symfony]sfMailer i kilka maili
athabus
post 19.08.2010, 12:21:06
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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".

Go to the top of the page
+Quote Post
destroyerr
post 19.08.2010, 14:10:10
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
athabus
post 19.08.2010, 14:24:09
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 21.06.2025 - 12:19