Alcuni contesti qui: Emails have stopped sending - end of file reached
Circa una settimana fa (13 gennaio 2021), l’invio di email ha iniziato a fallire tramite il server smtp-relay.gmail.com di Google (che è un uso consentito e previsto per gli utenti Google Apps).
Sidekiq ha segnalato i fallimenti con EOFErrors:
Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached
E /logs ha riportato anche i task falliti:
Job exception: end of file reached
Il backtrace è disponibile nell’altro post.
===================
L’indagine ha rivelato che le installazioni di Discourse aggiornate si connettono ai relay SMTP con ‘EHLO localhost’ e Google ha iniziato a rifiutarle circa una settimana fa.
Da tcpdump su un’istanza di produzione:
0x0030: d10f f8e4 4548 4c4f 206c 6f63 616c 686f ....EHLO.localho
0x0040: 7374 0d0a st..
...
0x0030: de62 f0c3 3432 3120 342e 372e 3020 5472 .b..421.4.7.0.Tr
0x0040: 7920 6167 6169 6e20 6c61 7465 722c 2063 y.again.later,.c
0x0050: 6c6f 7369 6e67 2063 6f6e 6e65 6374 696f losing.connectio
0x0060: 6e2e 2028 4548 4c4f 2920 6a31 3673 6d34 n..(EHLO).j16sm4
0x0070: 3831 3932 3976 736d 2e31 202d 2067 736d 81929vsm.1.-.gsm
0x0080: 7470 0d0a tp..
E la replica con telnet dà lo stesso risultato:
root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP ls8sm507258pjb.6 - gsmtp
ehlo localhost.localdomain
421 4.7.0 Try again later, closing connection. (EHLO) ls8sm507258pjb.6 - gsmtp
Connection closed by foreign host.
Tuttavia, un ehlo specifico del dominio funziona correttamente:
root@conversation:~# telnet smtp-relay.gmail.com 587
Trying 74.125.137.28...
Connected to smtp-relay.gmail.com.
Escape character is '^]'.
220 smtp-relay.gmail.com ESMTP p10sm668563uaw.3 - gsmtp
ehlo conversation.sevarg.net
250-smtp-relay.gmail.com at your service, [64.227.96.27]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
======
Sulla base dei log, ho identificato il file da modificare per testare la correzione (nell’immagine docker):
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb
Cambiando
DEFAULTS = {
:address => 'localhost',
:port => 25,
:domain => 'localhost.localdomain',
in
DEFAULTS = {
:address => 'conversation.sevarg.net',
:port => 25,
:domain => 'conversation.sevarg.net',
ha risolto il problema (dopo un riavvio dell’istanza). L’EHLO ora viene inviato con la stringa del dominio e le email vengono inviate correttamente dalla mia istanza.
================
Comportamento desiderato: Durante l’invio di email, l’installazione predefinita di Discourse utilizza il nome di dominio configurato per la connessione iniziale al server SMTP. In alternativa, esiste un’opzione di configurazione per sovrascrivere il dominio inviato. Se questa esiste, non sono riuscito a trovarla cercando.