Les mails SMTP ne s'envoient pas et la connexion échoue, mais openssl fonctionne

Salut ! Je suis désolé si ce problème a déjà une solution claire ; j’ai vraiment cherché et je n’ai pas trouvé de solution claire à mon problème.

J’ai donc auto-hébergé une instance Discord et, après quelques ajustements, j’ai obtenu la configuration correcte pour le SMTP, mais les e-mails aux nouveaux utilisateurs ne sont pas envoyés (même pas à l’utilisateur administrateur initial ; j’ai fini par en créer un avec la commande rake à l’intérieur du conteneur).

Au début, j’ai pensé que je ne pourrais pas me connecter au SMTP en raison de quelques problèmes de DNS, car lorsque j’ai joué avec ./discourse-doctor et que je suis finalement entré dans le shell du conteneur, il renvoie :

Testing sending to xxxx@gmail.com using smtp-relay.brevo.com:587, username:xxxxxxx@smtp-brevo.com with plain auth.
======================================== ERROR ========================================
Connection to port 587 failed.
====================================== SOLUTION =======================================
The most likely problem is that your server has outgoing SMTP traffic blocked.
If you are using a service like Mailgun or Sendgrid, try using port 2525.
=======================================================================================

Cependant, la commande openssl recommandée dans le guide de dépannage SMTP s’est non seulement connectée, mais j’ai également pu, avec les commandes EHLO, AUTH LOGIN et toutes ces commandes (que je ne savais pas qu’elles existaient jusqu’à présent, heh ^^'), envoyer un e-mail de test à moi-même depuis l’intérieur du conteneur lui-même. Je ne pense donc pas que le problème soit que le conteneur soit incapable de se connecter au serveur SMTP.

EDIT POUR CLARIFIER
J’ai pu le faire depuis l’intérieur du conteneur : je me suis connecté au conteneur en utilisant la commande ./launcher enter container. Depuis cette invite, j’ai effectué les commandes précédentes.

Voici mes paramètres SMTP, si cela peut aider. J’ai bien sûr masqué les informations de connexion.

  DISCOURSE_SMTP_ADDRESS: 'smtp-relay.brevo.com'
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: 'xxxxxxxx@smtp-brevo.com'
  DISCOURSE_SMTP_PASSWORD: 'xxxxxxxxxxxx'
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optionnel, par défaut true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requis par certains fournisseurs)
  DISCOURSE_NOTIFICATION_EMAIL: 'noreply@mydomain.xyz'    # (adresse d'envoi des notifications)
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

L’e-mail de notification était celui que j’ai testé via la commande openssl, et la dernière ligne, je l’ai lue quelque part dans un autre post et je l’ai ajoutée, mais je l’ai commentée et jamais essayée car c’était un vieux post.

Enfin, je suis vraiment perdu ici, j’espère que quelqu’un pourra m’aider, et je suis vraiment désolé si c’était un problème résolu que je n’ai pas trouvé !

Pourriez-vous essayer ce que l’erreur suggère, pour voir si cela fonctionne par hasard ?

2 « J'aime »

Salut ! J’ai déjà essayé ça, ça n’a pas marché :frowning:

J’ai pu envoyer un e-mail de test avec openssl, mais via le port 587. Cependant, via l’interface Discourse (à la fois via le bouton d’e-mail de test dans l’interface graphique et la commande rake tests:email[mail]), je n’ai pas pu le faire, ni via le port 287 ni via le 2525.

Par ailleurs, j’ai trouvé l’erreur Sidekiq pour l’e-mail non envoyé :

Jobs::HandledExceptionWrapper: Wrapped Net::OpenTimeout: execution expired

Found the shared/standalone/log/rails/production.log relevant lines:

Started POST "/admin/email/test" for 192.168.0.206 at 2024-10-18 23:49:02 +0000
Processing by Admin::EmailController#test as */*
  Parameters: {"email_address"=>"jggalindez@gmail.com"}
Completed 422 Unprocessable Entity in 5201ms (Views: 0.4ms | ActiveRecord: 0.0ms | Allocations: 12487)

Êtes-vous en mesure de vous connecter au port 587 depuis l’intérieur du conteneur ?

Il semble que vous puissiez vous connecter au port 587 depuis l’hôte, mais vous ne pourrez peut-être pas le faire depuis l’intérieur du conteneur, ce qui indiquerait un problème de réseau sur votre serveur.

2 « J'aime »

Salut ! Désolé, je n’ai pas été très clair. J’ai pu me connecter au port 587 depuis l’intérieur du conteneur, du moins d’après ce que j’ai compris, car j’ai fait ce qui suit :

  • Je me suis connecté au conteneur en utilisant ./launcher enter containername.
  • Depuis l’intérieur du conteneur, j’ai exécuté la commande openssl.
  • Depuis l’intérieur de l’invite pseudo telnet (je ne suis pas vraiment sûr de ce que c’est réellement), je me suis authentifié auprès du serveur SMTP (en faisant toute la conversion du nom d’utilisateur et du mot de passe en base64) et j’ai envoyé un e-mail.

Je n’ai pas vraiment essayé d’envoyer un e-mail depuis le serveur, cependant. Juste depuis l’intérieur du conteneur (d’après ce que je comprends), mais je me suis dit que s’il était capable de le faire depuis l’intérieur du conteneur, ce serait depuis l’intérieur du serveur.

Alors, j’ai réussi à le faire fonctionner. Il semble que c’était bien un problème avec le DNS, d’une manière ou d’une autre (car il pouvait résoudre l’URL en utilisant les commandes getent et openssl). J’ai donc exécuté getent pour obtenir l’adresse IP du relais SMTP et j’ai lancé le conteneur en changeant l’adresse du serveur pour l’adresse IP brute. Cela m’a conduit à une erreur différente, celle de ce fil de discussion. La solution suggérée là-bas, d’ajouter la ligne DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none au fichier yaml, a finalement permis de le faire fonctionner.

Je ne sais pas vraiment si le problème de DNS causera des problèmes à l’avenir, j’espère que non lol, mais merci à vous deux pour votre aide !

1 « J'aime »

Vous avez donc bien un problème de réseau dans le conteneur, mais il provient du DNS et non de la connectivité IP.

Êtes-vous en mesure de vous connecter à l’aide de openssl s_client au nom d’hôte depuis l’intérieur du conteneur ?

Vous devriez pouvoir exécuter :

openssl s_client -connect smtp-relay.brevo.com:587 -starttls smtp

et obtenir :

…
Verify return code: 0 (ok)
…

C’est attendu puisque vous vous connectez à une adresse IP et que cette adresse IP ne sera pas sur le certificat.

Oui, ce sera le cas.

1 « J'aime »

Ouais, j’avais deviné, alors j’ai fini par ajouter la balise docker_args au fichier de configuration et en spécifiant directement des serveurs DNS.

Pour ceux qui se demandent (j’ai dû chercher où allait la balise docker_args), voici une partie du fichier app.yml :

*******Lignes omises ci-dessus*********
## SOYEZ *TRÈS* PRUDENT LORS DE LA MODIFICATION !
## LES FICHIERS YAML SONT EXTRÊMEMENT SENSIBLES AUX ERREURS D'ESPACE BLANC OU D'ALIGNEMENT !
## visitez http://www.yamllint.com/ pour valider ce fichier si nécessaire

docker_args: "--dns 1.1.1.1 --dns 8.8.4.4 --dns 8.8.8.8"

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Décommentez la ligne suivante pour activer l'écoute IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
*******Reste du fichier omis ci-dessous*********

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.