El doctor de Discourse no analiza las credenciales SMTP (+ el correo electrónico de registro de administrador no funciona)

Bueno, para empezar, esto es un entorno de producción y no puedo enviar el primer correo de registro.

Estoy seguro de que mis configuraciones SMTP son correctas.
Puedo hacer ping y telnet a mi servidor de correo con el puerto utilizado, pero tan pronto como ejecuto “EHLO mailserver”, la conexión es cerrada por el host remoto.

Al final de mis registros dice:

  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

Y traté de asegurarme de que mis configuraciones SMTP fueran correctas, así que ejecuté /var/discourse/discourse-doctor, pero no puede validar mis configuraciones. Dice:

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

Pero mi YAML (./containers/app.yml) parece estar perfectamente formateado.

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  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           # (optional, default true)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  LETSENCRYPT_ACCOUNT_EMAIL: redacted@redacted.com

Eso suena a algo que hay que solucionar. Es consistente con el error de red que describiste.

Mi suposición es que los caracteres especiales en tu contraseña están confundiendo a Discourse-doctor.

Esta dirección no parece ser una dirección SMTP.
Supongo que “mail.redacted.com” es la dirección HTTP.
Creo que necesitas verificarlo.

@irwinstar, he eliminado el servidor de correo real para evitar exponerlo en un foro público. Pero puedo garantizar que es correcto, ya que copié la configuración de mi cliente de correo (que funciona) y también la comparé con la configuración SMTP de mi servidor de correo real.

Gracias por tu oferta de ayuda. Creo que el problema son los registros SPF/DKIM, así que estoy intentando solucionarlos.

No obstante, discourse-doctor debería seguir analizando correctamente. No estoy seguro de qué está ocurriendo, ya que no edité el archivo yo mismo en vim/nano. Para aclarar, el YAML fue generado usando discourse-setup.

Y creo que Discourse no soporta el protocolo en el puerto 465 actualmente. Si tu servidor de correo soporta el puerto 587, puedes cambiarlo a 587 en su lugar.
Desafortunadamente, mi servidor de correo no puede usar el puerto 587, así que agregué un proxy de correo fuera de Discourse.

@irwinstar, esta información es extremadamente importante si es correcta, y explicaría por qué no funciona mi configuración de correo. ¿Tienes una fuente para esta información?

No estoy seguro al respecto, pero he intentado el puerto 465 varias veces.
Finalmente, usé la imagen de Docker “hieulq/mailproxy” como proxy de correo.
Y utilicé esta configuración en app.yml para Discourse.
Este uso parece incorrecto, pero funciona.
Hoy intenté encontrar un plugin de correo, pero no encontré ninguno.

  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

Hola @simbleau

Mi experiencia es que SendGrid funciona bien (puerto 587).

¡También puedes probar con SendGrid de forma gratuita!

Agradezco las sugerencias.

Estoy tratando de evitar comprar servidores de correo en la nube o usar proxies (porque si quisiera una solución sucia, simplemente tomaría una cuenta de administrador en este punto) cuando ya tengo un servidor de correo en HostGator.

Estoy seguro de que los registros SPF están configurados para la IP de mi servidor Discourse. Ahora solo estoy tratando de validar los registros DKIM.

Si alguien puede confirmar que el puerto 465 no está permitido, sería una noticia fantástica, ya que me ahorraría seguir profundizando en un problema que no existe. El puerto 465 sí fue un problema, como se indica en la publicación de abajo.

He avanzado un poco en la instalación.

Usando el puerto 587, puedo hacer telnet a un correo completo y autenticarme correctamente. Así que cambié la configuración.

Ahora, cuando se envía el correo, recibo el siguiente error:

Correo entregado d86b48cc-b0f4-4df3-8960-ab5ff96613a0@discourse.imbleau.com (251.0ms)
Excepción del trabajo: el nombre de host "mail.redacted.com" no coincide con el certificado del servidor

Pero lo que he notado es que esto ya no es un tiempo de espera de conexión (disparado después de 60 segundos completos), sino una excepción diferente recibida en 250 ms.

Probablemente sea porque he utilizado un correo que es system@discourse.redacted.com, pero este correo utiliza internamente mail.redacted.com como servidor de correo.

Realmente no sé cómo solucionarlo. He intentado lo siguiente:

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

y luego reconstruir, para usarlo solo esta vez. Sin embargo, no ha servido de nada. El mismo error.

¡PROBLEMA DE CORREO SOLUCIONADO! (discourse-doctor aún analiza incorrectamente)

Investigé un poco más sobre Ruby y por qué ocurría este error en segundo plano, lo que me llevó a este problema en Stack Overflow.

Este fue el culpable. La solución implicó cambiar la negociación SSL, lo que me dio la intuición de desactivar esta configuración en el archivo app.yml:
DISCOURSE_SMTP_ENABLE_START_TLS: false # (opcional, por defecto true)

¡Después, ÉXITO!

Eso desactivará el cifrado TLS, mientras que el único problema es que estás utilizando un nombre de host incorrecto; es decir, el servidor de correo está presentando un certificado que dice algo diferente a mail.redacted.com. Muchos servidores de correo suelen conocerse por varios nombres de host diferentes; solo necesitas averiguar cuál utiliza para su certificado.

Podrías intentar averiguar qué nombre de host indica y ajustar tu configuración en consecuencia.

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

Si eso no funciona, puedes dejar el cifrado TLS habilitado y SOLO desactivar la verificación del certificado:

DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false

¡Gracias @RGJ! Extrañamente, dice que el CN es uno de mis subdominios, completamente ajeno al correo. Vale la pena investigarlo. Gracias por la orientación.

Todos tus usuarios tendrán la misma información.

Si me compartes en privado tu app.yml, veré si puedo averiguar qué está confundiendo a discourse-doctor.

Enviado. Inténtalo.

Ah. El problema es que tienes alguna versión de awk que no es GNU awk y la opción --field-separator se llama de otra manera en tu awk.

¿Qué versión de awk tienes? ¿Qué sistema operativo estás ejecutando?

man awk me indica Version 1.3.4 2019-12-31 MAWK(1)

cat /etc/os-release me muestra:

~$ 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

¿Podrías intentar editar discourse-doctor y reemplazar --field-separator con -F?

Parece que eso solucionará el problema. Si lo confirmas, enviaré una PR.

Eso funcionó parcialmente. El error desapareció, pero dejó de devolver cualquier cosa.

==================== CONFIGURACIÓN YML ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=

Lo resolví.

En discourse-doctor, cambia la línea 213 por lo siguiente:

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

Esto funciona porque mawk odia -F=":"; en su lugar, exige literalmente un espacio, como -F ":". :roll_eyes:

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