Não consigo enviar e-mail - problema com a porta 465

Gostaria de alterar o provedor de SMTP, mas não parece funcionar, embora tenha certeza de que o servidor pode enviar e-mails.

Tenho isto em app.yml:

  DISCOURSE_SMTP_ADDRESS: <<SMTP SERVER>>
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: <<USER>>
  DISCOURSE_SMTP_PASSWORD: <<PASSWORD>>

Usando telnet <<SMTP SERVER>> 465 conecta OK, mas quando tento enviar e-mails, o Discourse retorna com:

ERROR - Net::ReadTimeout with #<Socket:(closed)>

Alguém tem alguma dica sobre o que preciso configurar?

Verifiquei o servidor com base neste tópico: Troubleshoot email on a new Discourse install

Parece conectar ao servidor e enviar um e-mail de teste corretamente se eu fizer isso manualmente:

> sudo ./launcher enter app
root@support-app:/var/www/discourse# openssl s_client -connect mail.xxxxxxxx.com:465
  :
  :
  quantidade massiva de lixo
  :
  :
220 xxxxxxx.com Anti-spam GT for Coremail System (mispb-6da2110f-64b0-4d67-acf1-2d302bd594f9-xxxxxxx.com[20220915])
EHLO mail.xxxxxxxxx.com
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrUDI0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrpDiNKUCa0xDrUUUUj
250-STARTTLS
250-SMTPUTF8
250 8BITMIME
AUTH PLAIN xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
235 Authentication successful
mail from: <xxx@xxxxxx.com>
250 Mail OK
rcpt to: <xxxx@xxxxxxx.com>
250 Mail OK
data
354 End data with <CR><LF>.
content

.
250 Mail OK queued as AQAAfwBXr9nSGHdj3hEgAA--.7073S2

Quanto tempo leva para a saída aparecer?

Quase imediatamente depois que eu envio um comando.

EDITAR: Existe uma maneira de obter logs mais detalhados para descobrir qual etapa está causando o erro?

É provável que a porta de saída esteja sendo bloqueada pelo seu provedor de hospedagem. Se você estiver usando algum serviço como o Mailgun (ou a maioria dos outros), a porta 2525 deverá funcionar. Se for um servidor de e-mail que você gerencia, você pode configurá-lo para escutar em outra porta (como a 2525).

Ou (provavelmente o mais difícil) você pode abrir um ticket com quem hospeda seu servidor e pedir para eles abrirem a porta.

Bem, considerando que posso ./launcher enter app e então openssl conectar ao servidor de e-mail, fazer login via SMTP e enviar um e-mail com sucesso de dentro do contêiner discourse, duvido que seja a porta que não funciona…

Eu rastreeei o código e parece que EHLO nem foi alcançado. O servidor SMTP está conectado, mas o handshake SSL parece estar faltando, então o servidor se desconecta e o Discourse não recebe nenhuma resposta, daí o erro.

Portanto, suspeitei que o suporte da porta 465 parece ter um bug (ele usa SSL por padrão, mas acho que o Discourse não reconhece isso), então provavelmente a conexão SSL nunca é estabelecida.

Mudar para a porta 25 parece pelo menos eliminar o erro, embora eu ainda não esteja recebendo nenhum e-mail enviado…

EDIT: Posso confirmar que a porta 25 funciona corretamente (assim como a 587, mas infelizmente meu servidor smtp não expõe a 587).

Eu não estava recebendo nenhum e-mail antes devido ao fato de que o endereço IP do servidor Discourse foi temporariamente colocado na lista negra pelo servidor smtp por causa de muitas tentativas falhas.

Acho que você está certo.

E, ao que parece, você não é o primeiro… ao pesquisar por DISCOURSE_SMTP_PORT 465, encontrei um monte de problemas semelhantes.

O último contém um link para a (possível?) solução.

Com este patch, é possível definir
DISCOURSE_SMTP_FORCE_TLS=true para usar TLS implícito na porta 465

Também vi vários tópicos sobre o ‘problema 465’. No entanto, minha depuração de e-mail para qualquer coisa além do óbvio não é ótima, então tenho citado o guia de solução de problemas:

Há algo que possamos adicionar a isso para ajudar as pessoas?

Bem, se o @schungx puder confirmar que DISCOURSE_SMTP_FORCE_TLS=true é de fato uma solução, podemos adicioná-lo.

Vou tentar imediatamente!

EDIT: @RGJ Posso confirmar que DISCOURSE_SMTP_FORCE_TLS: true em app.yml resolveu o problema com sucesso! :champagne:

Sugiro um aviso em negrito dizendo Se você usa a porta 465, defina DISCOURSE_SMTP_FORCE_TLS: true, ou o Discourse não deveria ser inteligente o suficiente para detectar isso?