Los correos SMTP no se envían y la conexión falla, pero openssl funciona

Hola. Lamento si este problema ya tiene una solución clara; he buscado mucho y no he encontrado una solución clara a mi problema.

Así que, autoalojé una instancia de Discord y, después de algunos ajustes, obtuve la configuración correcta para SMTP, pero los correos a los nuevos usuarios no se envían (ni siquiera al usuario administrador inicial; terminé creando uno con el comando rake dentro del contenedor).

Al principio pensé que no podría conectarse a SMTP debido a algunas artimañas de DNS, ya que al jugar con ./discourse-doctor y eventualmente ingresar al shell del contenedor, devuelve:

Testing sending to xxxx@gmail.com using smtp-relay.brevo.com:587, username:xxxxxxx@smtp-brevo.com with plain auth.
======================================== ERROR ========================================
Connection to port 587 failed.
====================================== SOLUTION =======================================
The most likely problem is that your server has outgoing SMTP traffic blocked.
If you are using a service like Mailgun or Sendgrid, try using port 2525.
=======================================================================================

Sin embargo, el comando openssl recomendado en la guía de solución de problemas de SMTP no solo se conectó, sino que pude, con EHLO, AUTH LOGIN y todos esos comandos (que no sabía que existían hasta ahora, jeje ^^'), enviar un correo de prueba a mí mismo desde dentro del propio contenedor. Así que no creo que el problema sea que el contenedor sea incapaz de conectarse con el servidor SMTP.

EDITAR PARA ACLARAR
Pude hacer esto desde dentro del contenedor: inicié sesión en el contenedor usando el comando ./launcher enter container. Desde ese prompt, ejecuté los comandos anteriores.

Aquí están mis configuraciones de SMTP, si ayuda. Edité la información de inicio de sesión, por supuesto.

  DISCOURSE_SMTP_ADDRESS: 'smtp-relay.brevo.com'
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: 'xxxxxxxx@smtp-brevo.com'
  DISCOURSE_SMTP_PASSWORD: 'xxxxxxxxxxxx'
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, por defecto true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (requerido por algunos proveedores)
  DISCOURSE_NOTIFICATION_EMAIL: 'noreply@mydomain.xyz'    # (dirección desde la que enviar notificaciones)
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

El correo de notificación fue el que probé a través del comando openssl, y la última línea la leí en otra publicación y la agregué, pero la comenté y nunca la probé porque era una publicación antigua.

De todos modos, estoy realmente perdido aquí, espero que alguien pueda echarme una mano, ¡y lamento mucho si este fue un problema resuelto que no encontré!

¿Podrías probar lo que sugiere el error, para ver si funciona por casualidad?

2 Me gusta

Hola! Ya intenté eso, no funcionó :frowning:

Pude enviar un correo de prueba con openssl, pero a través del puerto 587. Sin embargo, a través de la interfaz de Discourse (tanto a través del botón de prueba de correo electrónico en la GUI como del comando rake tests:email[mail]) no pude hacerlo, ni a través del puerto 287 ni del 2525.

Por otro lado, encontré el error de Sidekiq para el correo no enviado:

Jobs::HandledExceptionWrapper: Wrapped Net::OpenTimeout: execution expired

Se encontraron las líneas relevantes de shared/standalone/log/rails/production.log:

Started POST "/admin/email/test" for 192.168.0.206 at 2024-10-18 23:49:02 +0000
Processing by Admin::EmailController#test as */*
  Parameters: {"email_address"=>"jggalindez@gmail.com"}
Completed 422 Unprocessable Entity in 5201ms (Views: 0.4ms | ActiveRecord: 0.0ms | Allocations: 12487)

¿Puedes conectarte al puerto 587 desde dentro del contenedor?

Parece que puedes conectarte al puerto 587 desde el host, pero es posible que no puedas hacerlo desde dentro del contenedor, lo que significaría un problema de red en tu servidor.

2 Me gusta

¡Hola! Disculpa, no fui muy claro. Pude conectarme al puerto 587 desde dentro del contenedor, al menos según mi entendimiento, ya que hice lo siguiente:

  • Inicié sesión en el contenedor usando ./launcher enter containername.
  • Desde dentro del contenedor, ejecuté el comando openssl.
  • Desde dentro del pseudo prompt de telnet (no estoy muy seguro de qué es en realidad), me autentiqué con el servidor SMTP (haciendo toda la conversión de nombre de usuario y contraseña a base64) y envié un correo electrónico.

En realidad, no intenté enviar un correo electrónico desde el servidor, solo desde dentro del contenedor (según mi entendimiento), pero pensé que si podía hacerlo desde dentro del contenedor, sería desde dentro del servidor.

Así que, logré que funcionara. Parece que era un problema con el DNS, de alguna manera (porque podía resolver la URL al usar los comandos getent y openssl). Así que ejecuté getent para obtener la IP del host del relé SMTP y ejecuté el contenedor cambiando la dirección del servidor a la IP bruta. Eso me llevó a un error diferente, el de este hilo. La solución señalada allí, de añadir la línea DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none al archivo yaml, finalmente lo hizo funcionar.

Realmente no sé si el problema del DNS causará problemas en el futuro, espero que no, ¡pero gracias a ambos por su ayuda!

1 me gusta

Así que tienes un problema de red en el contenedor, pero se origina en el DNS y no en la conectividad IP.

¿Puedes conectarte usando openssl s_client al nombre de host desde dentro del contenedor?

Deberías poder ejecutar:

openssl s_client -connect smtp-relay.brevo.com:587 -starttls smtp

y obtener:

…
Verify return code: 0 (ok)
…

Eso es esperado ya que te estás conectando a una dirección IP y esa dirección IP no estará en el certificado.

Lo hará.

1 me gusta

Sí, lo imaginé, así que terminé agregando la etiqueta docker_args de YAML al archivo de configuración y especificando algunos servidores DNS directamente.

Para cualquiera que se pregunte (tuve que buscar dónde iba la etiqueta docker_args), aquí hay una parte del archivo app.yml:

*******Líneas omitidas arriba*********
## ¡TENGA *MUCHO* CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON SUPER SUPER SENSIBLES A ERRORES DE ESPACIO EN BLANCO O ALINEACIÓN!
## visite http://www.yamllint.com/ para validar este archivo según sea necesario

docker_args: "--dns 1.1.1.1 --dns 8.8.4.4 --dns 8.8.8.8"

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Descomente la siguiente línea para habilitar el oyente IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
*******Resto del archivo omitido abajo*********

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.