Después de la instalación, Curl puede enviar correos electrónicos, pero Discourse no. ¿Ayuda para solucionarlo?

¡Hola!

En el texto a continuación, reemplaza \<DOT\> con . ya que soy un nuevo usuario y Discourse no me permite publicar enlaces.

Instalé Discourse en un servidor recién creado de Hetzner Cloud y la URL se resuelve correctamente: forum.thewizardofosc.com

Sin embargo, el correo electrónico con el que me registré nunca se envía. En el archivo de registro, el mensaje de Discourse es Net::ReadTimeout, si eso dice algo.

telnet se conecta: al escribir "telnet mail.thewizardofosc.com 465" obtengo "Connected to thewizardofosc.com".

¡Además, Curl envía un correo electrónico con éxito!

Escribiendo lo siguiente:
curl --ssl smtps://mail.thewizardofosc.com --mail-from discourse@thewizardofosc.com --mail-rcpt <VARIOS_FUNCIONARON> --upload-file email.txt --user 'discourse@thewizardofosc.com:<CONTRASEÑA>'

Se envía correctamente.

Pero, ¿por qué entonces Discourse no lo hace?

A continuación están las secciones que supongo son las relevantes de mi archivo de configuración de la aplicación:

## en el ejemplo de registro inicial 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'iliasb@thewizardofosc.com'

## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
# Se requieren la dirección SMTP, el nombre de usuario y la contraseña
# ¡ADVERTENCIA: el carácter '#' en la contraseña SMTP puede causar problemas!
DISCOURSE_SMTP_ADDRESS: mail.thewizardofosc.com
DISCOURSE_SMTP_PORT: 465
DISCOURSE_SMTP_USER_NAME: discourse@thewizardofosc.com
DISCOURSE_SMTP_PASSWORD: <CONTRASEÑA>
#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, por defecto true)

## Si agregaste la plantilla de Lets Encrypt, descomenta lo siguiente para obtener un certificado SSL gratuito
LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

necesitaríamos ver el registro de errores para saber qué está ocurriendo con tu configuración de correo

He seguido los pasos aquí: Troubleshoot email on a new Discourse install - #2

Sin mucho éxito. Al ejecutar discourse-doctor obtengo la misma salida: Net::ReadTimeout,
que también veo en shared/standalone/log/rails/production.log

¡Hola!

¿Te refieres a shared/standalone/log/rails/production.log?

Allí obtengo:

Entregado correo 5208d56b-b84b-4de6-a13e-76b60179af46@forum.thewizardofosc.com (60142.6ms)
Excepción del trabajo: Net::ReadTimeout

Estranho. Si puedes conectarte desde fuera del contenedor, puedes comprobar si ese comando curl funciona dentro del contenedor. Mi única suposición es que tienes algún problema de red con Docker.

Jay tiene razón.

El siguiente paso lógico, @onar3d, es intentar tu prueba con curl desde dentro del contenedor.

Acabo de comprobarlo por ti y curl ya está instalado en el contenedor, así que al menos no necesitas instalarlo.

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 esto ayude.

¡Interesante sugerencia!

Pero entré al contenedor Docker con “docker exec -it DOCKERID bash” y usé el mismo comando curl, lo cual también funcionó.

¡Gracias, acabo de probarlo y funcionó perfectamente!

Así que no puede ser que Docker esté bloqueado…

Hola @onar3d

Esto es un poco arriesgado, pero dado que estás usando el puerto 465 en lugar del 587, podrías probar esto en tu archivo yml del contenedor:

DISCOURSE_SMTP_ENABLE_START_TLS: false

y reconstruir el contenedor para ver si tienes suerte :slight_smile:

Referencia:

GMail (por ejemplo, para comparar) expone los siguientes puertos y métodos de autenticación.

  • TLS/STARTTLS (a veces llamado TLS explícito): usa el puerto 587
  • SSL (a veces llamado TLS implícito): usa el puerto 465

… apostando a esto… :slight_smile: pero quizás tengamos suerte

Si no funciona, siempre puedes volver a la configuración anterior.

1 me gusta

¡Gracias!

Acabo de probarlo y el correo no se envió desde Discourse :confused:

Sí, era un intento arriesgado… ¡perdona por hacerte perder el tiempo con eso!

Mi única otra «idea loca» en este momento es ver si puedes acceder a tu servidor de correo (sea quien sea el proveedor) y configurar el puerto en 587 (muchos proveedores SMTP ofrecen esa opción) y «tirar los dados de nuevo» con DISCOURSE_SMTP_ENABLE_START_TLS: true, por supuesto.

Francamente, normalmente no soy de «tirar los dados» y prefiero basarme en hechos; así que si no quieres intentarlo, lo entiendo perfectamente @onar3d !!

¡Gracias! Lamentablemente, no tengo acceso para cambiar eso; es una de esas soluciones “llave en mano” configuradas por mi proveedor.

Hola @onar3d

Entendido. En este momento se me han acabado las “ideas locas” y es hora de que me prepare para descansar esta noche; mucha suerte y espero que alguno de los miembros inteligentes del equipo aquí tenga algunas ideas mejores para probar.

Lo mejor para ti.

Después de algunos intentos más (¡muchas gracias, @IAmGav!), se confirmó que mi configuración de Discourse funciona con un servidor de correo diferente, lo que descarta varias opciones a probar.

Mi proveedor de servidor de correo me respondió con un mensaje de registro de error de su parte y una sugerencia:

El ingeniero ha revisado los registros y el error observado desde su IP está relacionado con la configuración de SSL. Lo más probable es que estén utilizando una versión antigua o configuraciones de conexión obsoletas.

Prueba:
Error de TLS en la conexión desde [95.216.139.49]:33568 SSL_accept: conexión TCP cerrada por el par.

Prueba con el modo SSL desactivado solo para ver si funciona.

Lo intenté con DISCOURSE_SMTP_ENABLE_START_TLS establecido en false, como se indicó anteriormente, tanto en el puerto 465 como en el 26 (listado por mi proveedor como el puerto para conexiones sin SSL), pero ninguno funcionó.

¿Podría ser porque no he comprado un certificado SSL para el dominio thewizardofosc.com? Me doy cuenta de esto ahora después de investigar un poco más.

Si no funciona con la opción sin SSL, tampoco funcionaría con un SSL de pago. Tu proveedor de correo electrónico debería proporcionarte un SSL gratuito de Let’s Encrypt.

Estimado @onar3d,

Podrías considerar ejecutar tus pruebas de curl con la opción de verbosidad -v activada, por lo que se me ocurre, para que puedas analizar completamente el handshake exitoso; y luego trabajar hacia atrás a partir de ese análisis.

Puedes usar esta opción de verbosidad para ingeniería inversa y descubrir qué funciona :slight_smile:

Espero que te sea útil.