Nuovo tentativo di invio delle email in caso di fallimento all'interno di un azione programmata
Quando si verifica un errore durante l'invio delle email all'interno di un task asincrono (i.e. tramite scheduled actions) vorrei che venisse fatto un tentativo successivo.
Il primo errore che si verifica è
{
"message": "Error in dispatchMailForPratica - Email: XXX@example.it - Pratica: XXX Expected response code 250 but got code \"451\", with message \"451 4.4.2 Timeout waiting for data from client.\r\n\"",
"context": [],
"level": 400,
"level_name": "ERROR",
"channel": "app",
"datetime": {
"date": "2023-06-13 15:59:28.800627",
"timezone_type": 3,
"timezone": "Europe/Rome"
},
"extra": []
}
A cui poi segue un errore del tipo:
{
"message": "Error in dispatchMailForPratica (All operators): Email: YYY@example.it - Pratica: XXX Expected response code 250 but got an empty response",
"context": [],
"level": 400,
"level_name": "ERROR",
"channel": "app",
"datetime": {
"date": "2023-06-13 15:59:28.846483",
"timezone_type": 3,
"timezone": "Europe/Rome"
},
"extra": []
}
Al primo timeout la connessione viene chiusa e da quel momento in poi falliscono tutti i successivi tentativi di invio restituendo empty response
-
Hint: Creare una nuova tipologia di scheduled action per l'invio delle email senza fare un rollback della pratica. Attenzione le email che falliscono non sono solo le email del cambio di stato di una pratica, ma anche le email dei calendari -
Alternativa: possiamo creare un topic multi-tenant email_delivery
e un comando da cli che prende dakrun
i parametri in entrata e tenta l'invio delle email. Un vantaggio di questa soluzione è poter regolare il rate di invio delle email e frenare in un punto solo l'invio se stiamo ricevendo errori. Ci serve ovviamente il meccanismo di retry. -
Altra ipotesi: ma usare l'invio tramite API non ci aiuterebbe in alcun modo? -
SwiftMailer è abbandonato, si può provare ad utilizzare symfony mailer https://symfony.com/doc/4.4/mailer.html#installation e un transport per ses