Pós-instalação, Curl consegue enviar e-mail, mas Discourse não. Ajuda para consertar?

Olá!

No texto abaixo, substitua <DOT> por . - como sou um novo usuário, o Discourse não permite que eu publique links.

Instalei o Discourse em um servidor recém-criado na nuvem da Hetzner, e o URL resolve corretamente: forum.thewizardofosc.com

No entanto, o e-mail com o qual me registrei nunca é enviado. No arquivo de log, a mensagem do Discourse é Net::ReadTimeout, se isso disser algo.

O telnet conecta - ao digitar "telnet mail.thewizardofosc.com 465", o resultado é "Connected to thewizardofosc.com".

Além disso, o Curl envia um e-mail com sucesso!

Ao digitar o seguinte:
curl --ssl smtps://mail.thewizardofosc.com --mail-from discourse@thewizardofosc.com --mail-rcpt <VÁRIOS FUNCIONARAM> --upload-file email.txt --user 'discourse@thewizardofosc.com:<SENHA>'

O envio é bem-sucedido.

Mas, então, por que o Discourse não envia?

Abaixo estão o que acredito serem as seções relevantes do meu arquivo de aplicativo:

## no exemplo de cadastro inicial 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'iliasb@thewizardofosc.com'

## TODO: O servidor SMTP usado para validar novas contas e enviar notificações
# Endereço, nome de usuário e senha SMTP são obrigatórios
# AVISO: o caractere '#' na senha SMTP pode causar problemas!
DISCOURSE_SMTP_ADDRESS: mail.thewizardofosc.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: discourse@thewizardofosc.com
DISCOURSE_SMTP_PASSWORD: <SENHA>
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)

## Se você adicionou o modelo Lets Encrypt, descomente abaixo para obter um certificado SSL gratuito
LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

precisaria ver o log de erro para ver o que está acontecendo com sua configuração de e-mail

Já segui os passos aqui: Troubleshoot email on a new Discourse install - #2

Sem muita sorte. Executar o discourse-doctor me dá a mesma saída: Net::ReadTimeout,
que também vejo em shared/standalone/log/rails/production.log

Oi!

Você quer dizer shared/standalone/log/rails/production.log?

Lá eu recebo:

E-mail entregue 5208d56b-b84b-4de6-a13e-76b60179af46@forum.thewizardofosc.com (60142,6ms)
Exceção do trabalho: Net::ReadTimeout

Estranho. Se você consegue se conectar de fora do contêiner, verifique se o comando curl funciona dentro dele. Minha única suposição é que você tenha algum problema de rede com o Docker.

Jay está correto.

O próximo passo lógico, @onar3d, é tentar seu teste curl de dentro do contêiner.

Acabei de verificar para você e o curl já está instalado no contêiner, então, pelo menos, você não precisa instalá-lo.

docker exec -it app bash
root@hostname-app/# curl --version
curl 7.64.0 (x86_64-pc-linux-gnu) libcurl/7.64.0 OpenSSL/1.1.1d zlib/1.2.11 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh2/1.8.0 nghttp2/1.36.0 librtmp/2.3
Release-Date: 2019-02-06
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 

Espero que isso ajude.

Sugestão interessante!

Mas entrei no Docker com “docker exec -it DOCKERID bash” e usei o mesmo comando curl, o que também funcionou.

Obrigado, acabei de testar e funcionou perfeitamente!

Então não pode ser que o Docker esteja bloqueado…

Olá @onar3d

É um tiro no escuro, mas como você está usando a porta 465 em vez da 587, pode tentar adicionar isso ao seu arquivo yml do container:

DISCOURSE_SMTP_ENABLE_START_TLS: false

Em seguida, reconstrua o container e veja se dá sorte :slight_smile:

Referência:

O Gmail (por exemplo, para comparação) expõe as seguintes portas e métodos de autenticação:

  • TLS/STARTTLS (às vezes chamado de TLS Explícito): usa a porta 587
  • SSL (às vezes chamado de TLS Implícito): usa a porta 465

… apostando na sorte com isso… :slight_smile: mas talvez tenhamos sorte

Se não funcionar, você sempre pode reverter.

Obrigado!

Tentei isso agora mesmo, o e-mail não foi enviado pelo Discourse :confused:

Sim, era uma aposta arriscada… desculpe por ter feito você perder tempo com isso!

Minha única outra “ideia maluca” no momento é ver se você consegue acessar seu servidor de e-mail (seja quem for) e definir a porta para 587 (muitos provedores SMTP oferecem essa opção) e “tentar a sorte novamente” com DISCOURSE_SMTP_ENABLE_START_TLS: true, é claro.

Francamente, normalmente não sou de “jogar dados” e sou mais orientado por fatos; então, se você não quiser tentar, eu entendo perfeitamente, @onar3d!!

Obrigado! Infelizmente, não tenho permissão para alterar isso; é um dos tipos “pronto para uso” configurado pelo meu provedor.

Oi @onar3d

Entendido. No momento, estou sem “ideias malucas” e é hora de eu me preparar para dormir; boa sorte e espero que algum dos membros inteligentes da equipe aqui tenha algumas ideias melhores para tentar.

Tudo de bom.

Após mais algumas tentativas (muito obrigado, @IAmGav!), minha configuração do Discourse foi confirmada como funcional com um servidor de e-mail diferente, o que elimina várias possibilidades a serem testadas.

Meu provedor de servidor de e-mail me retornou com uma mensagem de log de erro da parte deles e uma sugestão:

O engenheiro verificou os logs e o erro visto a partir do IP deles está relacionado às configurações de SSL. Provavelmente, estão usando uma versão antiga ou configurações de conexão inadequadas.

Prova:
Erro de TLS na conexão de [95.216.139.49]:33568 SSL_accept: conexão TCP fechada pelo peer

Tente desativar o modo SSL apenas para ver se funciona.

Tentei com DISCOURSE_SMTP_ENABLE_START_TLS definido como false, conforme sugerido acima, nas portas 465 e também na 26 (listada pelo meu provedor como a porta para conexão sem SSL), mas nenhuma funcionou.

Será que isso ocorre porque não comprei um certificado SSL para o domínio thewizardofosc.com? Percebi isso agora, depois de pesquisar um pouco mais.

Se não funcionar com a opção sem SSL, também não funcionará com um SSL pago. Seu provedor de e-mail deve fornecer um SSL gratuito do Let’s Encrypt.

Prezado @onar3d,

Você pode considerar executar seus testes curl com a opção detalhada -v ativada, para que possa analisar completamente o handshake bem-sucedido e, em seguida, trabalhar de trás para frente a partir dessa análise.

Você pode usar essa opção detalhada para fazer engenharia reversa do que funciona :slight_smile:

Espero que ajude.