Configuration SMTP ne fonctionne pas avec smtp-relay de GMail

I can’t get SMTP setup working with Discourse and GMail’s SMTP

I enabled SMTP Relay in Google’s settings, allowed sending from my domain (no IP whitelisting), using SMTP auth + encryption.

Discourse is hosted on forum.example.com

DISCOURSE_SMTP_ADDRESS: smtp-relay.gmail.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: noreply@example.com
DISCOURSE_SMTP_PASSWORD: password
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_DOMAIN: mydomain.io
DISCOURSE_NOTIFICATION_EMAIL: noreply@example.com
DISCOURSE_SMTP_ENABLE_START_TLS: true

I had generic error Job exception: end of file reached, when I added NOTIFICATION_EMAIL and SMTP_DOMAIN envs, now I’m seeing

503 5.5.1 bad sequence of commands x20sm63393lfr.126 - gsmtp

when running doctor and trying to send email to myself.

Changed DISCOURSE_SMTP_DOMAIN to match forum.mydomain.io and still have the same error.

How I’m supposed to debug this further other than changing env, rebuilding and hoping that it works?

Thanks in advance.

Instead of rebuilding you can

./launcher destroy app 
./launcher start app 

There are some topics about getting the Google whatever working. It’s possible, but not easy. And it probably changes every month. :wink:

3 « J'aime »

Bien que je pense que l’erreur de @kvsf soit déjà corrigie ou que des éléments fondamentaux de votre configuration aient été modifiés, j’aimerais poursuivre cette discussion en publiant ma propre configuration, mon approche supplémentaire et ma demande d’aide dans le même domaine problématique.

Configuration de base

  • Google Workspace Business Starter
  • Configuration du routage Gmail > Relais SMTP avec i) uniquement les utilisateurs enregistrés du domaine, ii) liste blanche d’adresses IP avec l’IP de mon serveur d’hébergement de forum et authentification SMTP forcée, iii) TLS forcé
  • Installation de Discourse Docker conformément à la documentation de Discourse
  • Configuration de app.yml selon
expose:
  - "80:80"   # http
  - "443:443" # https

env:
  DISCOURSE_HOSTNAME: "forum.mydomain.com"
  DISCOURSE_DEVELOPER_EMAILS: 'dev@mydomain.com'

  DISCOURSE_SMTP_ADDRESS: "smtp-relay.gmail.com"
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: "user@mydomain.com"
  DISCOURSE_SMTP_PASSWORD: "mypass"
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_AUTHENTICATION: login
  DISCOURSE_SMTP_OPEN_TIMEOUT: 25
  DISCOURSE_SMTP_READ_TIMEOUT: 25
  DISCOURSE_SMTP_DOMAIN: "mydomain.com"
  DISCOURSE_NOTIFICATION_EMAIL: "noreply@mydomain.com"
  LETSENCRYPT_ACCOUNT_EMAIL: dev@mydomain.com

Mes tests

Lors de l’exécution de ./discourse-doctor, cette configuration entraîne l’erreur :

Testing sending to ...
SMTP server connection successful.
Sending to artificial.testadress@gmail.com. . .
Sending mail failed.
end of file reached

J’ai ensuite vérifié les différents journaux de Discourse et d’e-mail
En testant manuellement le même processus depuis Docker (en me connectant avec docker exec -it <CONTAINER_ID> bash) via

openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587

cela ne rencontre aucun problème et fonctionne bien. Je pense donc que soit ma configuration de paramètres dans app.yml est étrange, soit Discourse a une mauvaise communication interne de script, soit… tant de possibilités. ^^
Pour ne pas avoir à exécuter ./launcher rebuild app à chaque fois après avoir modifié app.yml pour tester différents paramètres, j’ai commencé à modifier directement /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb en modifiant le code existant pour :

class SMTP
  attr_accessor :settings

  DEFAULTS = {
    :address              => 'smtp-relay.gmail.com',
    :port                 => 587,
    :domain               => 'mydomain.com',
    :user_name            => 'user@mydomain.com',
    :password             => 'mypass',
    :authentication       => 'login',
    :enable_starttls      => nil,
    :enable_starttls_auto => true,
    :openssl_verify_mode  => 'peer',
    :ssl                  => nil,
    :tls                  => nil,
    :open_timeout         => 25,
    :read_timeout         => 25
  }

  def initialize(values)
    self.settings = DEFAULTS #.merge(values)
  end

ce qui conduit au même comportement que ci-dessus (étant donné les paramètres personnalisés de app.yml).

Recherche d’aide

Et maintenant, je suis bloqué. Bien sûr, je pourrais jouer davantage avec les paramètres restants (et même revenir à l’utilisation de SSL uniquement, bien que cela soit déprécié par Discourse), mais j’aimerais :

  1. apprendre comment analyser ce problème plus en profondeur
  2. comprendre ainsi ce qui se passe réellement et quel est le problème
  3. le résoudre et pouvoir tout utiliser de manière fluide (+ enfin faire fonctionner le forum correctement)

Merci d’avance pour votre aide.

push*
Des idées/suggestions ?