Algunos datos de contexto: Emails have stopped sending - end of file reached
Aproximadamente hace una semana (13 de enero de 2021), el envío de correos electrónicos comenzó a fallar a través del servidor smtp-relay.gmail.com de Google (que es un uso permitido e intencionado para los usuarios de Google Apps).
Sidekiq reportó los fallos con errores EOFErrors:
Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached
Y /logs también reportó las tareas fallidas:
Job exception: end of file reached
El backtrace está disponible en el otro post.
===================
La investigación reveló que las instalaciones actualizadas de Discourse se conectan a los retransmisores SMTP con ‘EHLO localhost’, y Google comenzó a rechazar estas conexiones hace aproximadamente una semana.
Desde tcpdump en una instancia de producción:
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..
Y replicando con telnet se obtiene el mismo resultado:
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.
Sin embargo, un ehlo específico del dominio funciona correctamente:
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
======
Basándome en los registros, identifiqué el archivo que debía modificar para probar la solución (en la imagen de Docker):
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb
Cambiar
DEFAULTS = {
:address => 'localhost',
:port => 25,
:domain => 'localhost.localdomain',
por
DEFAULTS = {
:address => 'conversation.sevarg.net',
:port => 25,
:domain => 'conversation.sevarg.net',
resolvió el problema (tras reiniciar la instancia). El EHLO ahora se envía con la cadena del dominio, y los correos electrónicos se envían correctamente desde mi instancia.
================
Comportamiento deseado: Al enviar correos electrónicos, la instalación predeterminada de Discourse debe usar el nombre de dominio configurado para la conexión inicial al servidor SMTP. Alternativamente, debería existir una opción de configuración para anular el dominio enviado. Si esta opción existe, no pude encontrarla mediante búsquedas.