Configuração SMTP não funciona com smtp-relay do 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 curtidas

Embora eu acredite que o erro de @kvsf já foi corrigido ou que algumas coisas fundamentais em sua configuração foram alteradas, gostaria de continuar esta thread postando minha própria configuração, minha abordagem adicional e minha busca por ajuda dentro do mesmo domínio de problema.

Configuração Básica

  • Google Workspace Business Starter
  • Configurar Gmail-Routing > SMTP-Relay com i) apenas usuários registrados de dentro do domínio, ii) lista de permissões de IP com o IP do meu servidor de hospedagem de fórum e imposição de autenticação SMTP, iii) imposição de TLS
  • Instalação do Docker do Discourse de acordo com a documentação do Discourse
  • Configuração do app.yml de acordo com
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

Meus Testes

Ao executar ./discourse-doctor, esta configuração leva ao erro

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

Eu então primeiro verifiquei os diferentes logs do Discourse e de e-mail
Testando manualmente o mesmo processo de dentro do Docker (conectando usando docker exec -it <CONTAINER_ID> bash) via

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

não encontra problemas e funciona bem. Então, acredito que ou minha configuração de parâmetros no app.yml está estranha OU o Discourse internamente tem alguma falha de comunicação de script OU… tantas possibilidades. ^^
Para não ter que sempre executar ./launcher rebuild app após alterar app.yml para testar diferentes configurações, comecei a editar diretamente /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb alterando o código existente para:

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

o que leva ao mesmo comportamento acima (dadas as configurações personalizadas do app.yml).

Busca por ajuda

E agora estou preso. Claro, eu poderia brincar mais com as configurações restantes (e até mesmo voltar a usar apenas SSL, embora isso seja depreciado pelo Discourse), mas eu gostaria de:

  1. aprender como analisar este problema mais profundamente
  2. assim entender o que realmente está acontecendo e qual é o problema
  3. corrigi-lo e ser capaz de usar tudo sem problemas (+ finalmente fazer o fórum funcionar corretamente)

Obrigado antecipadamente pela sua ajuda.

push*
Alguma ideia/sugestão?