SmtpMailer a FallbackMailer

Kamil Valenta
Člen | 833
+
0
-

Chtěl bych dát rozesílaným mailům trochu větší péči.
Aktuálně si v DI předávám mailer (konkrétně SMTP mailer), loguju si, pokud odeslání selže, příp. to s časovým odstupem zkusím znovu.

Nevím, zda v dokumentaci přehlížím, lze si někde po $mailer->send($mail); vrátit queue/transaction ID?

Rád bych si to zalogoval s error hláškou, kterou SMTP vrátil. V logu SMTP pak podle ID dohledám více.

Druhá věc je použití Fallback maileru, jak si ho předáváte v DI a jak k němu předáváte jednotlivé mailery?
A protože často SMTP vyžaduje, aby hlavička From byla shodná jako login k SMTP, jak řešíte From?
Já mám aktuálně v neonu v parametrech mailFrom, což je prostě totožný string jako mail > smtp > login. A když to v neonu měním, musím to změnit na obou místech. Je to nepříjemné, ale roky se s tím dá žít. Při použití Fallback maileru to padá, protože se From musí změnit podle použitého SMTP. Doufal jsem, že $mail->setFrom() bude volitelné a při nevyplnění si vezme login z maileru, ale setFrom() je povinné…

Marek Bartoš
Nette Blogger | 1297
+
+1
-

lze si někde po $mailer->send($mail); vrátit queue/transaction ID?

Mailer ti nic nevrací, ale nastavuje header Message-ID, se kterým pak mail odesílá. Když budeš mít víc mailerů v řadě, tak si můžeš v posledním podle ID zalogovat.
Jen v případě nette/mail se nastavuje ID v Message, na klonu objektu, těsně před odesláním. Takže by-default bude mít mail v každém maileru vlastní ID.
Já si pro vícero mailerů udělal wrapper, aby ve všech mailerech měl mail stejné ID. Případně si do Message můžeš nastavit i vlastní ID. Message i můj mailer vlastní ID respektují.

Rád bych si to zalogoval s error hláškou, kterou SMTP vrátil. V logu SMTP pak podle ID dohledám více.

S ohledem na více mailerů to zatím řeším tak, že odesílání běží v cyklu s try-catch. Všechny chyby se pak vyhodí jako součást souhrnné exception, nemám v maileru interní logger či error handler.

Druhá věc je použití Fallback maileru, jak si ho předáváte v DI a jak k němu předáváte jednotlivé mailery?

U originálního maileru vypínám autowiring, ve svém seznamu pak můžu mailery poskládat jak potřebuju.

A protože často SMTP vyžaduje, aby hlavička From byla shodná jako login k SMTP, jak řešíte From?

Pro tohle snadné obecné řešení asi nebude, nefunguje to všude stejně. S AWS SES odesíláme maily z jakéhokoli účtu v rámci domény.
Pro tvůj konkrétní případ bych si login dal do parametru a ten pak předával i do SMTP loginu a nejspíš dal mailer do wrapperu, který podle loginu odesílatele přenastaví.


Celá funkcionalita je v orisai/nette-mail

Editoval Marek Bartoš (4. 3. 17:03)