Os e-mails SMTP não enviam e a conexão falha, mas o openssl funciona

Olá! Desculpe se este problema já tem uma solução clara; eu realmente procurei e não encontrei uma solução clara para o meu problema.

Então, eu auto-hospedei uma instância do Discord e, após algumas mexidas, consegui a configuração correta para SMTP, mas os e-mails para novos usuários não são enviados (nem mesmo para o usuário administrador inicial; acabei criando um com o comando rake dentro do container).

No início, pensei que não conseguiria me conectar ao SMTP devido a alguns problemas de DNS, pois ao mexer com ./discourse-doctor e eventualmente entrar no shell do container, ele retorna:

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.
=======================================================================================

No entanto, o comando openssl recomendado no guia de solução de problemas de SMTP não apenas conectou, mas eu pude, com EHLO, AUTH LOGIN e todos esses comandos (que eu não sabia que existiam até agora, heh ^^'), enviar um e-mail de teste para mim mesmo de dentro do próprio container. Então, não acho que o problema seja o container ser incapaz de se conectar ao servidor SMTP.

EDIT PARA CLAREZA
Eu consegui fazer isso de dentro do container: fiz o login no container usando o comando ./launcher enter container. A partir desse prompt, executei os comandos anteriores.

Aqui estão minhas configurações de SMTP, se ajudar. Editei as informações de login, é claro.

  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           # (opcional, padrão true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requerido por alguns provedores)
  DISCOURSE_NOTIFICATION_EMAIL: 'noreply@mydomain.xyz'    # (endereço para enviar notificações)
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

O e-mail de notificação foi o que testei via comando openssl, e a última linha eu li em outro post e adicionei, mas comentei e nunca tentei porque era um post antigo.

Enfim, estou realmente perdido aqui, espero que alguém possa me dar uma mão, e sinto muito se este foi um problema resolvido que eu não encontrei!

Você poderia tentar o que o erro sugere, para ver se funciona por acaso?

2 curtidas

Oi! Já tentei isso, não funcionou :frowning:

Consegui enviar um e-mail de teste com openssl, mas pela porta 587. No entanto, através da interface do Discourse (tanto pelo botão de teste de e-mail na GUI quanto pelo comando rake tests:email[mail]) não consegui fazer isso, nem pela porta 287 nem pela 2525.

Em outra nota, encontrei o erro do Sidekiq para o e-mail não enviado:

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

Encontradas as linhas relevantes em shared/standalone/log/rails/production.log:

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)

Você consegue se conectar à porta 587 de dentro do contêiner?

Parece que você consegue se conectar na porta 587 do host, mas talvez não consiga fazer isso de dentro do contêiner, o que significaria um problema de rede no seu servidor.

2 curtidas

Olá! Desculpe, eu fui um pouco vago. Consegui me conectar à porta 587 de dentro do contêiner, pelo menos para o que eu entendo, pois fiz o seguinte:

  • Fiz login no contêiner usando ./launcher enter nome_do_container.
  • De dentro do contêiner, executei o comando openssl.
  • De dentro do prompt pseudo telnet (não tenho certeza do que realmente é), autentiquei-me com o servidor SMTP (fazendo toda a conversão de nome de usuário e senha para base64) e enviei um e-mail.

Na verdade, não tentei enviar um e-mail do servidor, apenas de dentro do contêiner (pelo que entendo), mas imaginei que se fosse capaz de fazer isso de dentro do contêiner, seria de dentro do servidor.

Então, consegui fazer funcionar. Parece que era um problema com o DNS, de alguma forma (porque conseguia resolver o URL ao usar os comandos getent e openssl). Então, executei o getent para obter o IP do host do relay SMTP e executei o contêiner alterando o endereço do servidor para o IP bruto. Isso me levou a um erro diferente, o deste tópico. A solução apontada lá, para adicionar a linha DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none ao arquivo yaml, fez funcionar no final.

Não sei realmente se o problema do DNS causará problemas no futuro, espero que não kkk, mas obrigado a ambos pela ajuda!

1 curtida

Então você está tendo um problema de rede no contêiner, mas ele decorre do DNS, não da conectividade IP.

Você consegue se conectar usando openssl s_client ao nome do host de dentro do contêiner?

Você deve ser capaz de executar:

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

e obter:

…
Verify return code: 0 (ok)
…

Isso é esperado, já que você está se conectando a um endereço IP e esse endereço IP não estará no certificado.

Causará.

1 curtida

Sim, eu imaginei, então acabei adicionando a tag docker_args no arquivo de configuração e especificando alguns servidores DNS diretamente.

Para quem estiver se perguntando (tive que procurar onde a tag docker_args ficava), aqui está uma parte do arquivo app.yml:

*******Linhas omitidas acima*********
## TENHA *MUITO* CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário

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"
  ## Descomente a próxima linha para habilitar o ouvinte IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
*******Restante do arquivo omitido abaixo*********

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