Discussion avec d'autres sites web, problème SMTP : fin de fichier atteinte

(à l’équipe : ceci n’a aucun rapport avec l’abonnement hébergé auquel mon compte est également associé)

J’ai installé Discourse sur un VPS en suivant les instructions de Run other websites on the same machine as Discourse, mais avec cette différence : j’ai adapté le fichier app.yml avant la première installation :

sudo mkdir /var/discourse
sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
sudo cp samples/standalone.yml containers/app.yml
sudo nano containers/app.yml

Dans le fichier YAML, j’ai commenté la section des ports, ajouté - "templates/web.socketed.template.yml" et configuré le nom d’hôte ainsi que le SMTP :

  ## TODO : Le nom de domaine auquel cette instance Discourse répondra
  ## Requis. Discourse ne fonctionnera pas avec une adresse IP brute.
  DISCOURSE_HOSTNAME: 'discuss.mydomain.community'

  ## TODO : Liste d'e-mails séparés par des virgules qui seront définis comme administrateurs et développeurs
  ## lors de l'inscription initiale, par exemple 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'someuser@protonmail.com,anotheruser@otherdomain.io'

  ## TODO : Le serveur SMTP utilisé pour valider les nouveaux comptes et envoyer des notifications
  # L'adresse SMTP, le nom d'utilisateur et le mot de passe sont requis
  # ATTENTION : le caractère '#' dans le mot de passe SMTP peut causer des problèmes !
  DISCOURSE_SMTP_ADDRESS: smtp.myprovider.email
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: mydomain-no-reply@otherdomain.io
  DISCOURSE_SMTP_PASSWORD: pa$$word
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optionnel, valeur par défaut true)

Ensuite, j’ai initialisé et lancé l’application Discourse :

sudo ./launcher bootstrap app
sudo ./launcher start app

Cela a fonctionné. J’ai arrêté Discourse et configuré le Nginx externe (dans /etc/nginx/conf.d/discourse.conf) avec la configuration http-only suggérée (juste pour tester). J’ai pu accéder à http://discuss.mydomain.community.

J’ai à nouveau arrêté Discourse et, avec certbot, j’ai mis à jour discourse.conf. Voici ce que j’ai maintenant :

server {
	server_name discuss.mydomain.community;  # <-- modifiez ceci

	location / {
		proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
		proxy_set_header Host $http_host;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Real-IP $remote_addr;
	}

    listen [::]:443 ssl ipv6only=on; # géré par Certbot
    listen 443 ssl; # géré par Certbot
    ssl_certificate /etc/letsencrypt/live/discuss.mydomain.community/fullchain.pem; # géré par Certbot
    ssl_certificate_key /etc/letsencrypt/live/discuss.mydomain.community/privkey.pem; # géré par Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # géré par Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # géré par Certbot

}
server {
    if ($host = discuss.mydomain.community) {
        return 301 https://$host$request_uri;
    } # géré par Certbot


	listen 80; listen [::]:80;
	server_name discuss.mydomain.community;
    return 404; # géré par Certbot
}

Jusqu’ici, tout va bien. J’ai pu accéder à Discourse via HTTPS (j’ai ensuite exécuté ./launcher rebuild app quand les choses ne fonctionnaient pas, mais cela n’a rien changé).

Dans l’écran « Terminer l’installation », après avoir soumis le formulaire d’inscription, j’obtiens le message : « Nous avons envoyé un e-mail d’activation à someuser@protonmail.com ».

Problème : aucun e-mail n’arrive.

Aucun e-mail n’arrive dans la boîte de réception de l’administrateur. J’ai vérifié la boîte de réception de mydomain-no-reply@otherdomain.io, mais rien non plus.

Remarque : Il est possible que le problème vienne du fait que l’utilisateur de messagerie est sur otherdomain.io et doit résider sur mydomain.community. Mais, à ma connaissance, ce n’est pas une obligation.

J’ai commencé le dépannage et testé ensuite avec les modifications suivantes du fichier app.yml (avec un rebuild app entre les deux) :

  DISCOURSE_SMTP_ENABLE_START_TLS: false

Sans succès. Continuation :

## Si vous souhaitez définir l'adresse e-mail « De » pour votre première inscription, décommentez et modifiez :
  - exec: rails r "SiteSetting.notification_email='mydomain-no-reply@otherdomain.io"

J’ai donc poursuivi avec Troubleshoot email on a new Discourse install :

  • otherdomain.io a DKIM et SPF correctement configurés dans DNS
  • L’utilisation de telnet depuis le VPS vers le fournisseur SMTP fonctionne
  • L’utilisation de telnet depuis le conteneur Docker (avec docker exec et l’installation de telnet) fonctionne également

J’ai exécuté ./discourse-doctor et deux éléments ont retenu mon attention (le reste des résultats était conforme aux attentes) :

========================================
Version de Discourse à discuss.mydomain.community : Discourse 2.6.0.beta2 
Version de Discourse à localhost : NON TROUVÉ
==================== PROBLÈME DNS ====================
Ce serveur indique NON TROUVÉ, mais discuss.mydomain.community indique Discourse 2.6.0.beta2.
Cela suggère que vous avez un problème DNS ou qu'un proxy intermédiaire est en cause.
Si vous utilisez Cloudflare ou un CDN, il se peut qu'il soit mal configuré.
==================== TEST DE COURRIEL ====================
Pour un test robuste, obtenez une adresse depuis http://www.mail-tester.com/
Envoi de courriel à REDACTED  . . 
Test de l'envoi vers test-k86jiyqb9@srv1.mail-tester.com en utilisant smtp.myprovider.email:465.
======================================== ERREUR ========================================
                                    ERREUR INATTENDUE

fin de fichier atteinte

====================================== SOLUTION =======================================
Ce n'est pas une erreur courante. Aucune solution recommandée n'existe !

Veuillez signaler le message d'erreur exact ci-dessus à https://meta.discourse.org/
(Et une solution, si vous en trouvez une !)

J’ai essayé deux fois. Une fois avec l’e-mail configuré, une fois avec une adresse fournie par mail-tester.com. Les résultats sont les mêmes. Cela ne semble donc pas bon.

Remarque : Apparemment, la procédure d’installation Docker sert également des versions bêta. Bon à savoir.

En examinant le journal de production, voici ce que j’ai trouvé :

Started GET "/" for REDACTED-IP at 2020-09-03 06:21:57 +0000
Processing by FinishInstallationController#index as HTML
  Rendering finish_installation/index.html.erb within layouts/finish_installation
  Rendered finish_installation/index.html.erb within layouts/finish_installation (Duration: 3.2ms | Allocations: 356)
  Rendered layouts/_head.html.erb (Duration: 15.7ms | Allocations: 2969)
Completed 200 OK in 323ms (Views: 140.3ms | ActiveRecord: 0.0ms | Allocations: 32137)
Started GET "/finish-installation/register" for REDACTED-IP at 2020-09-03 06:22:01 +0000
Processing by FinishInstallationController#register as HTML
  Rendering finish_installation/register.html.erb within layouts/finish_installation
  Rendered finish_installation/register.html.erb within layouts/finish_installation (Duration: 7.1ms | Allocations: 1607)
  Rendered layouts/_head.html.erb (Duration: 22.3ms | Allocations: 3139)
Completed 200 OK in 107ms (Views: 41.3ms | ActiveRecord: 0.0ms | Allocations: 11760)
Started POST "/finish-installation/register" for REDACTED-IP at 2020-09-03 06:22:22 +0000
Processing by FinishInstallationController#register as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"l1hEEsK/gur5yplJdMIHttZAgYcuzLLkESaAI87IMb88nAFqNwi7l3yJ+3EJBw7leFypVGbH4C5hJl7VnJVYBQ==", "email"=>"someuser@protonmail.com", "username"=>"someusername", "password"=>"[FILTERED]", "commit"=>"Register"}
Redirected to https://discuss.mydomain.community/finish-installation/confirm-email
Completed 302 Found in 48ms (ActiveRecord: 0.0ms | Allocations: 4246)
  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Started GET "/finish-installation/confirm-email" for REDACTED-IP at 2020-09-03 06:22:22 +0000
Processing by FinishInstallationController#confirm_email as HTML
  Rendering finish_installation/confirm_email.html.erb within layouts/finish_installation
  Rendered finish_installation/confirm_email.html.erb within layouts/finish_installation (Duration: 2.3ms | Allocations: 418)
  Rendered layouts/_head.html.erb (Duration: 7.9ms | Allocations: 1612)
Completed 200 OK in 25ms (Views: 22.1ms | ActiveRecord: 0.0ms | Allocations: 4611)
Delivered mail ea8af868-4a2c-4312-85dd-f57061a3cd90@discuss.mydomain.community (60015.9ms)
Job exception: Net::ReadTimeout

J’ai attendu un peu, puis j’ai demandé via le navigateur de « Renvoyer l’e-mail de notification ». Voici ce qui a été ajouté au journal de production :

Delivered mail 47ca6f15-cd9e-4c96-a670-6646e2bda585@discuss.mydomain.community (60007.9ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Delivered mail 02367872-af3a-4df4-9a68-4e5e7c5eda60@discuss.mydomain.community (60007.4ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Delivered mail ee9ee1fc-6fd1-4970-89fa-260efe2dd04c@discuss.mydomain.community (60014.1ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 31)
Delivered mail 9030f87b-99df-4de2-9a60-2c57f7c752de@discuss.mydomain.community (60007.0ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Started PUT "/finish-installation/resend-email" for REDACTED-IP at 2020-09-03 06:31:22 +0000
Processing by FinishInstallationController#resend_email as HTML
  Parameters: {"authenticity_token"=>"NE21scxxyZz3/DxDkoF8kwi9GXoNKvnstNJdKZjQs7afigDKWcbw4XK/XnvvRHTApqExqUUghybE1oPfyo3aDA=="}
  Rendering finish_installation/resend_email.html.erb within layouts/finish_installation
  Rendered finish_installation/resend_email.html.erb within layouts/finish_installation (Duration: 0.9ms | Allocations: 163)
  Rendered layouts/_head.html.erb (Duration: 2.5ms | Allocations: 269)
Completed 200 OK in 63ms (Views: 6.5ms | ActiveRecord: 0.0ms | Allocations: 6408)
  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Delivered mail 127cc350-3fb0-4ef1-8759-391fb407b1cb@discuss.mydomain.community (60008.0ms)
Job exception: Net::ReadTimeout

Delivered mail d9c70dfd-5a8b-4f4c-bafa-5a540fc8ed4f@discuss.mydomain.community (60010.0ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 31)
Delivered mail e9e67ed1-d7b1-4e8a-ba11-30501c6fae89@discuss.mydomain.community (60012.4ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 31)
Delivered mail 82d0361e-0349-4a1a-928e-dcb16dcffdbc@discuss.mydomain.community (60008.6ms)
Job exception: end of file reached

J’ai contacté mon fournisseur d’hébergement pour voir si le problème venait de chez eux. Ils ont indiqué que, selon eux, cette configuration devrait fonctionner correctement, mais que le VPS n’avait généré aucune activité sur le serveur SMTP.

Voilà ma situation actuelle… je poste donc sur Meta.

Est-il possible que le trafic sortant vers le serveur de messagerie soit bloqué ? Pouvez-vous établir une connexion telnet vers ce serveur ? Depuis l’intérieur du conteneur ?

Oui, je peux me connecter avec succès au serveur SMTP en utilisant telnet depuis l’intérieur du conteneur Docker. Cependant, je ne peux pas envoyer un e-mail de test avec telnet, car mon fournisseur ne l’autorise pas (il ferme la connexion lors de l’envoi de commandes supplémentaires).

La solution semblait simple. Bien que mon fournisseur indique le port ci-dessus, j’ai fait un telnet sur le port 587 et cela a fonctionné. J’ai donc modifié app.yml, effectué une reconstruction… et tout a fonctionné correctement :smiley:

Avant de voir cela, j’allais recommander ce changement.

Le port 465 correspond à SMTP sur SSL, une méthode désormais obsolète.
Le port 587 est le port MSA (Mail Submission Agent) sur lequel STARTTLS (passage d’une connexion en clair à une connexion TLS) est généralement pris en charge.

Lorsque vous aviez configuré le port 465, Discourse tentait de communiquer en clair avec un port SSL.

Merci, @supermathie, j’ai accepté votre réponse comme solution. Explication claire.

Bonjour @supermathie,

Apparemment, le port 465 a été (ou est en train d’être) réhabilité conformément à la RFC 8314. Mon fournisseur de messagerie actuel (mailfence.com) semble suivre cette recommandation.

Existe-t-il un moyen de forcer TLS sur la connexion en utilisant le port 465 ? Cela devrait normalement résoudre mon problème, car j’ai vérifié avec swaks que l’utilisation de STARTTLS (–tls) échoue, tandis que l’utilisation de --tls-on-connect (–tlsc) fonctionne correctement depuis le conteneur :

swaks --to user@example.com --from myuser@mailfence.com --server smtp.mailfence.com:465 --auth LOGIN --tlsc --auth-user myuser@mailfence.com

Salutations,

Ah, il est réaffecté à la soumission sur TLS, ce qui est logique.

Pas pour le moment. Il semble que ActionMailer le prenne en charge lorsque vous définissez :ssl = true dans smtp_settings, mais nous n’avons pas actuellement de voie de code pour activer cette option.

Je suis certain que nous accueillerions avec plaisir une PR qui ajouterait cette prise en charge.