Configuración SMTP no funciona con 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 Me gusta

Aunque creo que el error de @kvsf ya está solucionado o que se han cambiado algunas cosas fundamentales en tu configuración, me gustaría continuar este hilo publicando mi propia configuración, mi enfoque adicional y mi búsqueda de ayuda dentro del mismo dominio de problemas.

Configuración Básica

  • Google Workspace Business Starter
  • Configurar Gmail-Routing > SMTP-Relay con i) solo usuarios registrados dentro del dominio, ii) lista blanca de IP con la IP de mi servidor de alojamiento de foros y forzar autenticación SMTP, iii) forzar TLS
  • Instalación de discourse docker según la documentación de discourse
  • Configuración de app.yml según
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

Mis Pruebas

Al ejecutar ./discourse-doctor, esta configuración genera el error

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

Primero revisé los diferentes registros de discourse y de correo electrónico
Probando manualmente el mismo proceso desde dentro de docker (conectando usando docker exec -it <CONTAINER_ID> bash) a través de

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

no presenta problemas y funciona bien. Así que creo que o mi configuración de parámetros en app.yml es extraña O discourse internamente tiene alguna mala comunicación de scripts O … tantas posibilidades. ^^
Para no tener que ejecutar siempre ./launcher rebuild app después de cambiar app.yml para probar diferentes configuraciones, comencé a editar directamente /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb cambiando el código existente a:

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

lo que lleva al mismo comportamiento que el anterior (dadas las configuraciones personalizadas de app.yml).

Búsqueda de ayuda

Y ahora estoy atascado. Por supuesto, podría jugar más con las configuraciones restantes (e incluso podría volver a usar SSL solamente, aunque esto está obsoleto por discourse), pero me gustaría:

  1. aprender cómo analizar este problema más profunda y extensamente
  2. comprender así qué está pasando realmente y cuál es el problema
  3. solucionarlo y poder usar todo sin problemas (+ finalmente poner en marcha el foro correctamente)

Gracias de antemano por tu ayuda.

push*
¿Alguna idea/sugerencia?