Configurar correo electrónico entrante de entrega directa para sitios autohospedados con Mail-Receiver

¡Hola! Tengo un problema extraño en el que he configurado esto siguiendo la guía y ¡funciona de maravilla! Sin embargo, algo ha ido mal con el correo electrónico saliente, que pensé que no se vería afectado por nada de esto. Sidekiq arroja el siguiente error para cada intento de correo electrónico (todos atascados en la lista de Reintentos) desde que activé el receptor de correo:

Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_read: unexpected eof while reading

Mi búsqueda me lleva a creer que esto está relacionado de alguna manera con TLS. Había descomentado las líneas relacionadas con TLS en el archivo .yml, pero volver a comentarlas tampoco solucionó el problema. Intenté las instrucciones de la guía para resolver conflictos de Postfix, pero aparentemente no tengo Postfix (el directorio /etc/postfix de la guía no existe en mi instancia, ni reconoce postfix como un servicio). Y según los resultados de netstat, solo docker-proxy está usando el puerto 25.

Estamos usando Gmail como servicio SMTP saliente y, de hecho, estábamos usando Gmail para la recepción entrante por sondeo POP3 antes de esto. Eliminé un montón de registros MX que apuntaban a Google, pero la guía decía que hiciera eso.

Este es mi mail-receiver.yml, con ciertos detalles redactados, por supuesto:

## esta es la plantilla del contenedor del receptor de correo
##
## Después de realizar cambios en este archivo, DEBE reconstruir
## /var/discourse/launcher rebuild mail-receiver
##
## ¡TENGA MUCHO CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON MUY, MUY SENSIBLES A ERRORES DE ESPACIOS O ALINEACIÓN!
## visite http://www.yamllint.com/ para validar este archivo según sea necesario

base_image: discourse/mail-receiver:release
update_pups: false

expose:
  - "25:25"   # SMTP

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  ## A dónde debe enviarse el correo electrónico a tu foro. En general, está perfectamente bien
  ## usar el mismo dominio que el foro mismo aquí.
  MAIL_DOMAIN: discourse.[mydomain].org
# descomente estas (¡y el volumen de abajo!) para admitir TLS
  POSTCONF_smtpd_tls_key_file:  /letsencrypt/discourse.[mydomain].org/discourse.[mydomain].org.key
  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/discourse.[mydomain].org/fullchain.cer
  POSTCONF_smtpd_tls_security_level: may


  ## La URL base para esta instancia de Discourse.
  ## Esta será la URL de tu sitio de Discourse. Por ejemplo,
  ## https://discourse.example.com. Si estás ejecutando una configuración de subdirectorio,
  ## asegúrate de tenerlo en cuenta (es decir, https://example.com/forum).
DISCOURSE_BASE_URL: 'https://discourse.[mydomain].org'

  ## La clave API maestra de tu foro de Discourse. Puedes obtenerla de
  ## la pestaña "API" de tu panel de administración.
  DISCOURSE_API_KEY: [myapikey]

  ## El nombre de usuario a utilizar para procesar el correo electrónico entrante. A menos que hayas
  ## renombrado el usuario `system`, deberías dejarlo como está.
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# descomente para admitir TLS
  - volume:
      host: /var/discourse/shared/standalone/letsencrypt
      guest: /letsencrypt

La tecnología de correo electrónico está un poco fuera de mi experiencia, así que agradezco cualquier consejo, incluso si es para señalar que me perdí algo estúpido al configurarlo. ¡Gracias!

1 me gusta

Como pensaste, no tiene nada que ver con el receptor del cuello. El host a través del cual estás enviando el correo tiene un certificado SSL roto.

Bueno, lo resolví después de muchos problemas. El problema probablemente provino del hecho de que el dominio en el que alojamos nuestra instancia de Discourse no es el mismo que el dominio en el que estaban nuestros registros MX. Una vez que superé esa confusión, todo encajó.

Definitivamente es mi propio error estúpido, pero la guía contribuyó un poco a mi confusión con esto:

No está muy claro que las dos entradas forum.example.com no tengan que ser idénticas, y en mi caso necesitaban ser diferentes. Tal vez las personas que usan esta guía deberían tener la experiencia suficiente para saberlo, pero yo no la tenía. Así que lo dejo aquí para cualquiera que pueda encontrarse con un problema similar. Aprendí algunas cosas sobre DNS que no sabía, así que fue una buena experiencia de aprendizaje, y ahora todo funciona perfectamente. :slight_smile:

Bueno, hablé demasiado pronto. El correo electrónico saliente funciona bien, las respuestas entrantes parecen funcionar bien, pero el envío a la dirección de correo electrónico de una categoría falla silenciosamente. Copié y pegué la dirección directamente de la configuración en un nuevo correo electrónico, así que sé que no hay errores tipográficos.

Los registros de mi mail-receiver tienen básicamente tres tipos de entradas. La exitosa, que fue una respuesta por correo electrónico a una publicación existente, se ve así:

Sep 20 16:59:44 discourse-mail-receiver postfix/smtpd[277]: connect from server168-1.web-hosting.com[68.65.122.144]
Sep 20 16:59:45 discourse-mail-receiver postfix/smtpd[277]: NOQUEUE: reject: RCPT from server168-1.web-hosting.com[68.65.122.144]: 454 4.7.1 <[category]@discourse.[domain].org>: Relay access denied; from=<ryan@[redacted].com> to=<[category]@discourse.[domain].org> proto=ESMTP helo=<server168-1.web-hosting.com>
<22>Sep 20 16:59:45 policyd-spf[288]: : prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=[redacted]; helo=server168-1.web-hosting.com; envelope-from=ryan@[redacted].com; receiver=discourse.[domain].org Sep 20 16:59:45 discourse-mail-receiver postfix/cleanup[281]: 4CCED114200: message-id=<20240920165945.4CCED114200@discourse-mail-receiver.localdomain>
Sep 20 16:59:45 discourse-mail-receiver postfix/smtpd[277]: disconnect from server168-1.web-hosting.com[68.65.122.144] ehlo=1 starttls=0/1 mail=1 rcpt=0/1 data=0/1 quit=1 commands=3/6

Aparte de eso, hay dos tipos de (lo que supongo que son) errores, cada uno de los cuales se repite bastante. El primero se ve así:

Sep 20 17:00:23 discourse-mail-receiver postfix/qmgr[124]: 5D162FC26D: from=<double-bounce@discourse-mail-receiver.localdomain>, size=960, nrcpt=1 (queue active)

Y el otro:

Sep 20 17:00:23 discourse-mail-receiver postfix/error[293]: 8DC3BFC141: to=<postmaster@discourse-mail-receiver.localdomain>, orig_to=<postmaster>, relay=none, delay=126622, delays=126622/0.05/0/0, dsn=4.4.3, status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=discourse-mail-receiver.localdomain type=MX: Host not found, try again)

Y así es como se ve mi mailq, solo entradas como esta una y otra vez:

3D07BFC23D      960 Fri Sep 20 06:42:23  double-bounce@discourse-mail-receiver.localdomain
(delivery temporarily suspended: Host or domain name not found. Name service error for name=discourse-mail-receiver.localdomain type=MX: Host not found, try again)
                                         postmaster@discourse-mail-receiver.localdomain

Parte de esto parece tener que ver con correos electrónicos que envía Discourse, que luego son devueltos por alguna razón. ¿Tiene mail-receiver alguna funcionalidad para procesar estos rebotes, o se quedarán en el mailq para siempre?

En segundo lugar, ¿por qué funcionan las respuestas, pero no el envío de correos electrónicos directamente a una categoría? Gracias de nuevo por tu ayuda y tu paciencia. :slight_smile:

[quote=“Ryan Hyer, post:514, topic:49487, username:Ryan_Hyer”]La que tuvo éxito, que fue una respuesta por correo electrónico a una publicación existente, se ve así:

...
454 4.7.1 <[category]@discourse.[domain].org>: Relay access denied;
...

[/quote]

Esas parecen ser las entradas de registro de un fallo a la dirección de una categoría en lugar de un éxito al responder a una publicación.

[quote=“Ryan Hyer, post:514, topic:49487, username:Ryan_Hyer”]En segundo lugar, ¿por qué funcionan las respuestas, pero no la publicación de correos electrónicos directamente a una categoría?
[/quote]

No estoy 100% seguro, pero creo que relay access denied sugiere que discourse.[domain].org probablemente no sea el dominio utilizado para MAIL_DOMAIN en mail-receiver.yml. Posiblemente la dirección de respuesta esté permitida a través de otros medios.

Sé que lo que se usa en MAIL_DOMAIN termina en al menos un lugar en un archivo de configuración de postfix, por lo que cambiarlo probablemente requiera reconstruir el contenedor. ¿Ha cambiado MAIL_DOMAIN y, si es así, ejecutó ./launcher rebuild mail-receiver después?

2 Me gusta

[Disculpe por presionar accidentalmente Enter prematuramente antes de terminar mi publicación anterior]

Todavía me estoy devanando los sesos con este problema. Pero tengo una nueva idea sobre cuál podría ser el problema. Estoy trabajando con dos dominios, llamémoslos [domain1] y [domain2]. Mi retransmisión SMTP de Gmail está alojada en [domain1]. Mi instancia de Discourse, así como mi mail-receiver, está alojada en [domain2].

¿Cómo configuro el ajuste reply-by-email-address en Discourse para forzar una dirección de respuesta en [domain2], cuando el correo se envía desde [domain1]? Obtengo el error SSL EOF mencionado anteriormente al intentar hacer esto. Supongo que hay algún truco de autenticación DNS o algo que me estoy perdiendo.

Parece que finalmente lo he resuelto. Para que la dirección ‘reply-to’ esté en un dominio diferente al del retransmisor SMTP, tuve que relajar algunas configuraciones en Google Workspace. Todo parece estar funcionando según lo previsto en ambas direcciones.

1 me gusta

Una última pregunta. Aunque todo funciona correctamente ahora, todavía tengo un montón de entradas antiguas en mi mailq. Lo más probable es que sean correos electrónicos que se generaron con la configuración incorrecta y, por lo tanto, quedarán atascados en el limbo para siempre. Preferiría simplemente eliminarlos y seguir adelante. Entonces, ¿cómo limpio el mailq?

Una publicación un poco antigua, pero quizás la razón más común del error SSL EOF es un conflicto entre versiones de OpenSSL: v1.1.1f vs v3. Actualizar esa antigua 1.1.1f será la solución. Y la mala noticia es que, por ejemplo, Ubuntu 20.x no puede usar una más nueva, por lo que todo Ubuntu debe ser actualizado.

1 me gusta

Estoy al límite con esto, después de pasar horas. No parece que pueda superar este error del Lanzador, a pesar de que los nombres de mis archivos de configuración están todos en minúsculas.

“ERROR: El nombre de la configuración no debe contener caracteres en mayúsculas, espacios ni caracteres especiales. Corrija el nombre de la configuración y vuelva a ejecutar ./launcher.”

mientras ejecuto

./launcher rebuild mail-receiver

o

./launcher bootstrap mail-receiver

o

./launcher start mail-receiver

Puedo verlo aquí en el código fuente del lanzador

¡Grrrrrrrrrr! ¡Por favor, ayúdenme!

Probé todo en la publicación enlazada anteriormente relacionado con la configuración regional y todo lo que pude encontrar en otros lugares.

./launcher rebuild app___ ¡funcionan bien!

Tengo una posible pista: esto comenzó a suceder inmediatamente después de que accidentalmente presioné Bloq Mayús (pero solo con mayúsculas 2 de las letras) mientras nombraba el archivo de configuración, lo cual inmediatamente deshabilité Bloq Mayús y volví a escribir las 2 letras antes incluso de guardarlo.

Es difícil imaginar cómo este breve error tipográfico/corrección podría haber causado esto, pero tal vez las mayúsculas estén atascadas en un búfer en algún lugar, o ???

Está muy por encima de mis conocimientos, pero me sorprende que el mensaje de error no muestre la variable $config :thinking:
Seguro que ayudaría a depurar.

1 me gusta

¡Gracias @Canapin! - esto es lo que estoy intentando configurar:

https://www.perplexity.ai/search/provide-the-code-lJcI4BrFQ2auuD42ehYFwA

¿Puedes copiar y pegar todo el contenido de tu línea de comandos?

Desde tu ./launcher start mail-receiver hasta el mensaje de error, así como el nombre exacto del archivo .yml.

Si renombro el archivo de configuración como Mail-receiver.yml, ./launcher start Mail-receiver generará

ERROR: El nombre de configuración 'Mail-receiver' no debe contener caracteres en mayúsculas, espacios o caracteres especiales. Corrige el nombre de configuración y vuelve a ejecutar ./launcher.

Aquí el mensaje de error contiene el nombre del archivo.

Además, si ejecutas ./launcher start aaa, no encontrará ningún archivo correspondiente y listará los disponibles. Solo los elige de la carpeta, así que no hay magia aquí, pero tal vez genere algo interesante :person_shrugging:

ERROR: containers/aaa.yml no existe o no es legible.

Configuraciones disponibles ( app, mail-receiver )

Muchas gracias, lo he solucionado y ya funciona.

¿Cuál fue el problema al final? Podría ayudar a otros :slight_smile:

No hubo ningún problema, en realidad fue solo una curva de aprendizaje para entender cómo interactúan los diversos componentes del servidor para enrutar dominios y correos electrónicos. Nunca antes me había adentrado en el aprendizaje sobre postfix. Fue divertido y aprendí mucho.

La receta que finalmente logré es usar un archivo mail-receiver.yml (un contenedor de docker) emparejado a cada instancia de Discourse, todos compartiendo el puerto 25 utilizando la función de transporte en postfix para manejar el enrutamiento.

2 Me gusta

En mi servidor dedicado (con Ubuntu 22.04 y Postfix instalado) utilizo un archivo mail-receiver.yml independiente asociado a cada instancia de Discourse donde he habilitado la función de publicación por correo electrónico.

Esta configuración crea un contenedor separado para cada instancia de Discourse en mi servidor (además del contenedor app típico) que recibe y procesa los correos electrónicos para su instancia de Discourse correspondiente.

Los correos electrónicos entrantes para todos los foros de Discourse en el servidor son recibidos por Postfix a través del puerto estándar 25, donde el archivo de configuración principal de Postfix utiliza un “transport map” para “reenviar” cada correo electrónico a su foro de Discourse previsto analizando el nombre de dominio en la dirección de correo electrónico “Para:”.

Por lo tanto, además de las instrucciones de este Tema, yo…

  1. modifiqué el archivo de configuración de postfix existente en: /etc/postfix/main.cf

  2. luego, añadí el archivo postfix transport map correspondiente en: /etc/postfix/transport

  1. por último, añadí los archivos correspondientes para crear el contenedor de correo electrónico para cada uno de los foros:
    /var/discourse/containers/mail-receiver-domain1.yml
    /var/discourse/containers/mail-receiver-domain2.yml
    /var/discourse/containers/mail-receiver-domain3.yml
    /var/discourse/containers/mail-receiver-domain4.yml
    /var/discourse/containers/mail-receiver-domain5.yml

3 Me gusta

No hay DISCOURSE_MAIL_ENDPOINT en mail-receiver.yml, y también está DISCOURSE_BASE_URL para cambiar.

2 Me gusta

Utilizo un servicio de reenvío de correo electrónico que admite el reenvío de correos electrónicos en formato JSON a un webhook.

¿Es esta una opción para la entrega directa de correo electrónico?

1 me gusta