Discourse doctor parsing de credenciais SMTP não funcionando (+ email de registro de admin não funcionando)

Bem, para começar, isso é produção e não consigo enviar o primeiro e-mail de registro.

Tenho certeza de que minhas configurações SMTP estão corretas.
Consigo fazer ping e telnet no meu servidor de e-mail com a porta usada, mas assim que executo “EHLO mailserver”, a conexão é encerrada pelo host remoto.

No final dos meus logs, aparece:

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 32)
Delivered mail f3853b94-b772-48c2-b1b7-a78bbcbfc5c1@discourse.mywebsite.com (60177.6ms)
Job exception: Net::ReadTimeout

E tentei garantir que minhas configurações SMTP estivessem corretas, então executei /var/discourse/discourse-doctor, mas ele não consegue validar minhas configurações. Ele diz:

==================== YML SETTINGS ====================
awk: not an option: --field-separator=:
DISCOURSE_HOSTNAME=
awk: not an option: --field-separator=:
SMTP_ADDRESS=
awk: not an option: --field-separator=:
DEVELOPER_EMAILS=
awk: not an option: --field-separator=:
SMTP_PASSWORD=
awk: not an option: --field-separator=:
SMTP_PORT=
awk: not an option: --field-separator=:
SMTP_USER_NAME=
awk: not an option: --field-separator=:
LETSENCRYPT_ACCOUNT_EMAIL=

Mas meu YAML (./containers/app.yml) parece perfeitamente formatado.

  ## TODO: O servidor de e-mail 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.redacted.com
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: redacted@redacted.com
  DISCOURSE_SMTP_PASSWORD: "redacted"
  #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: redacted@redacted.com

Isso parece ser algo que precisa ser resolvido. Isso é consistente com o erro de rede que você descreveu.

Minha suposição é que caracteres especiais na sua senha estão confundindo o Discourse-doctor.

Este endereço não parece ser um endereço SMTP.
Acho que “mail.redacted.com” é o endereço HTTP.
Acho que você precisa verificar isso.

@irwinstar, removi o servidor de e-mail real para evitar expô-lo em um fórum público. Mas posso garantir que está correto, pois copiei as configurações do meu cliente de e-mail (que está funcionando) e também as comparei com as configurações SMTP do meu servidor de e-mail real.

Obrigado pela sua oferta de ajuda. Acredito que o problema esteja nos registros SPF/DKIM, então estou tentando corrigi-los.

Mesmo assim, o discourse-doctor ainda deveria estar analisando-o corretamente. Não tenho certeza do que está acontecendo ali, já que não editei o arquivo manualmente no vim/nano. Para deixar claro, o YAML foi gerado usando o discourse-setup.

E eu acho que o Discourse não suporta mais o protocolo na porta 465. Se o seu servidor de e-mail suportar a porta 587, você pode alterá-la para 587 em vez disso.
Infelizmente, meu servidor de e-mail não pode usar a porta 587, então adicionei um proxy de e-mail fora do Discourse.

@irwinstar, Esta é uma informação extremamente importante, caso esteja correta, e explicaria por que minha configuração de e-mail não está funcionando. Você tem uma fonte para essa informação?

Não tenho certeza sobre isso, mas tentei várias vezes na porta 465.
Finalmente, usei a imagem Docker “hieulq/mailproxy” como proxy de e-mail.
E utilizei esta configuração em app.yml para o Discourse.
Essa abordagem pode não ser ideal, mas funciona.
Tentei encontrar um plugin de e-mail hoje, mas não encontrei nenhum.

  DISCOURSE_SMTP_ADDRESS: x.x.x.x
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false

Olá @simbleau

Minha experiência é que o SendGrid funciona bem (porta 587).

Você também pode testar o SendGrid gratuitamente!

Agradeço as sugestões.

Estou tentando evitar a compra de servidores de e-mail em nuvem ou o uso de proxies (porque, se eu quisesse uma solução problemática, já teria criado uma conta de administrador neste ponto), já que possuo um servidor de e-mail na HostGator.

Tenho certeza de que os registros SPF estão configurados para o IP do meu servidor Discourse. Agora, estou apenas tentando validar os registros DKIM.

Se alguém puder confirmar que a porta 465 não é permitida, seria uma ótima notícia, pois me impediria de seguir muito fundo em um problema que não existe. A porta 465 foi um problema, conforme mencionado na postagem abaixo.

Fiz algum progresso na instalação.

Usando a porta 587, consegui fazer telnet com sucesso em um e-mail completo e autenticar corretamente. Então, mudei.

Agora, quando o e-mail é enviado, recebo o seguinte erro:

Delivered mail d86b48cc-b0f4-4df3-8960-ab5ff96613a0@discourse.imbleau.com (251.0ms)
Job exception: hostname "mail.redacted.com" does not match the server certificate

Mas o que notei é que isso não é mais um timeout de conexão (disparado após 60 segundos inteiros), mas sim uma exceção diferente recebida em 250ms.

Isso provavelmente ocorre porque usei um e-mail que é system@discourse.redacted.com, mas esse e-mail internamente usa mail.redacted.com como servidor de e-mail.

Não tenho certeza de como corrigir isso, honestamente. Tentei o seguinte:

./launcher enter app
rails r "SiteSetting.notification_email = 'system@mail.redacted.com'"
exit

e recriando, para usá-lo apenas uma vez. Ainda sem sucesso. O mesmo erro.

PROBLEMA DO EMAIL RESOLVIDO! (o discourse-doctor ainda analisa incorretamente)

Pesquisei um pouco mais sobre Ruby e o motivo pelo qual esse erro estava acontecendo nos bastidores, o que me levou a essa questão no Stack Overflow.

Esse era o culpado. A solução envolveu alterar a negociação SSL, o que me deu a intuição de desativar essa configuração no arquivo app.yml:
DISCOURSE_SMTP_ENABLE_START_TLS: false # (opcional, padrão verdadeiro)

Depois disso, SUCESSO!

Isso desativará a criptografia TLS, enquanto o único problema é que você está usando um nome de host incorreto, ou seja, o servidor de e-mail está apresentando um certificado que diz algo diferente de mail.redacted.com. Muitos servidores de e-mail tendem a ser conhecidos por vários nomes de host diferentes; você só precisa descobrir qual deles está sendo usado para o certificado.

Você pode tentar descobrir qual nome de host ele declara ser e ajustar sua configuração de acordo.

echo | openssl s_client -connect mail.redacted.com:587 -starttls smtp -servername mail.redacted.com 2>/dev/null | openssl x509 -noout -subject

Se isso não funcionar, você pode deixar a criptografia TLS ativada e DESATIVAR APENAS a verificação de certificado:

DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false

Obrigado, @RGJ! Estranhamente, está dizendo que o CN é um dos meus subdomínios, totalmente desconectado do e-mail. Vale a pena investigar. Obrigado pela orientação.

Todos os seus usuários terão as mesmas informações.

Se você compartilhar comigo, de forma privada, seu app.yml, verei se consigo descobrir o que está confundindo o discourse-doctor.

Enviado. Tente resolver.

Ah. O problema é que você tem alguma versão do awk que não seja o GNU awk, e a opção --field-separator tem outro nome no seu awk.

Qual versão do awk você tem? Que sistema operacional você está usando?

man awk está me dizendo Version 1.3.4 2019-12-31 MAWK(1)

cat /etc/os-release me diz:

~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

Você poderia tentar editar discourse-doctor e substituir --field-separator por -F?

Parece que isso resolverá o problema. Se você confirmar, eu enviarei um PR.

Isso funcionou parcialmente. O erro desapareceu, mas ele parou de retornar qualquer coisa.

==================== CONFIGURAÇÕES YML ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=

Eu resolvi.

No discourse-doctor, altere a linha 213 para o seguinte:

  read_config_result=$(echo $config_line | awk  -F ":" '{print $2}')

Isso funciona porque o mawk odeia -F=":"; em vez disso, ele exige literalmente um espaço, como em -F ":". :roll_eyes:

Abri um PR: Changed awk config command to be more cross platform by nuzzles · Pull Request #513 · discourse/discourse_docker · GitHub