Voici un peu de contexte : Emails have stopped sending - end of file reached
Il y a environ une semaine (13 janvier 2021), l’envoi d’e-mails a commencé à échouer via le serveur smtp-relay.gmail.com de Google (ce qui est un usage autorisé et prévu pour les utilisateurs de Google Apps).
Sidekiq a signalé les échecs avec des erreurs EOFErrors :
Jobs::HandledExceptionWrapper: Wrapped EOFError: end of file reached
Et /logs a également rapporté les tâches échouées :
Job exception: end of file reached
La trace d’appel est disponible dans l’autre publication.
===================
L’enquête a révélé que les installations à jour de Discourse se connectent aux relais SMTP avec ‘EHLO localhost’ — et Google a commencé à rejeter ces requêtes il y a environ une semaine.
À partir d’un tcpdump sur une instance de production :
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..
Et la réplication avec telnet donne le même résultat :
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.
Cependant, un ehlo spécifique au domaine fonctionne correctement :
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
======
Sur la base des journaux, j’ai identifié le fichier à modifier pour tester la correction (dans l’image Docker) :
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb
En changeant
DEFAULTS = {
:address => 'localhost',
:port => 25,
:domain => 'localhost.localdomain',
en
DEFAULTS = {
:address => 'conversation.sevarg.net',
:port => 25,
:domain => 'conversation.sevarg.net',
le problème a été résolu (après un redémarrage de l’instance). L’EHLO est maintenant envoyé avec la chaîne de domaine, et les e-mails sont maintenant envoyés correctement depuis mon instance.
================
Comportement souhaité : Lors de l’envoi d’e-mails, l’installation par défaut de Discourse utilise le nom de domaine configuré pour la connexion initiale au serveur SMTP. Alternativement, une option de configuration existe pour remplacer le domaine envoyé. Si cela existe, je n’ai pas réussi à le trouver en effectuant une recherche.