Fix prima notifica ai soci: viene silenziosamente scartata (quasi sempre)

Mi appunto questo errore. Ci ha contattato una persona appena associata dicendo che non ha ricevuto alcuna email di ingresso dopo che abbiamo importato la quota.

Ho trovato questa loggata in produzione:

[2024-12-15 09:24:26] production.ERROR: Impossibile inoltrare mail di notifica a utente 822: Expected response code "250/251/252" but got code "550", with message "550 5.1.1 <OMISSISASDASD@linux.it>: Recipient address rejected: User unknown in virtual alias table".

Parallelamente questa era la relativa quota associativa:

$ SELECT * FROM account_rows WHERE user_id = OMISSISASDLOL;
+------+---------------------+---------------------+-------------+------------+---------+------------+-----------+------------+----------------------------------+
| id   | created_at          | updated_at          | movement_id | account_id | user_id | section_id | amount_in | amount_out | notes                            |
+------+---------------------+---------------------+-------------+------------+---------+------------+-----------+------------+----------------------------------+
| 2630 | 2024-12-15 09:24:26 | 2024-12-15 09:24:26 |        2136 |          2 |     XXX |       NULL |     25.00 |       0.00 | Saldo quota 2025 - OMISSISASDLOL |
+------+---------------------+---------------------+-------------+------------+---------+------------+-----------+------------+----------------------------------+

Notare che la loggata è nello stesso momento della quota.

Causa

L'AccountRowObserver tenta di notificare la casella qualcosa@linux.it alla prima quota:

https://gitlab.com/ItalianLinuxSociety/ilsmanager/-/blob/ed82a9d3e35c6659d6bac9c29e0b8ddc9d28462c/app/User.php#L404

Però, all'epoca di creazione di quel movimento, è quasi impossibile che sia stata già creata quella casella di posta. La procedura di creazione avviene via cron, al massimo una volta all'ora. Quindi è normale che esploda.

Proposta

  1. L'invio della email dovrebbe fare almeno un secondo tentativo sulla mailbox originale dell'utenza (soluzione abbastanza generica per questo e altri simili problemi non noti):

https://gitlab.com/ItalianLinuxSociety/ilsmanager/-/blob/ed82a9d3e35c6659d6bac9c29e0b8ddc9d28462c/app/User.php#L404

  1. Sempre nel codice di cui sopra, all'ultimo tentativo (secondo tentativo, uno su casella nostra, altro su casella utenza) il metodo deve esplodere violentemente con un'eccezione. Lo davo già per scontato. Altrimenti è difficile capire se c'è stato un problema o no...

  2. Mi piacerebbe capire se ha senso spostare l'invio della mail PRIMA di persistere cose tipo $fee->save(), così se esplode l'invio della email si vede bene a video l'errore e ci rendiamo conto che l'utenza ha una mail non valida (poi possiamo metterne un'altra farlocca, ri-tentare la creazione causando una nuova email, ecc.) - premettendo che avere un'email non valida è off-topic rispetto a questa issue. Comunque ci sarebbe da rivedere tutte le volte in cui si chiama User#sendMail(), così da valutare quando metterlo in try-catch e quando no.

https://gitlab.com/ItalianLinuxSociety/ilsmanager/-/blob/ed82a9d3e35c6659d6bac9c29e0b8ddc9d28462c/app/Observers/AccountRowObserver.php#L58

Edited by Valerio Bozzolan