Los correos entrantes con firmas/tablas/imágenes incrustadas son rechazados con «Acceso denegado»

Estoy viendo que Discourse rechaza los correos entrantes con:

No se puede procesar el correo electrónico: Acceso denegado

El correo entrante parece funcionar correctamente por sí mismo. El mensaje llega al receptor de correo, y SPF, DKIM y DMARC pasan sin problemas. Luego, Discourse lo procesa a través de Jobs::ProcessEmail.

El comportamiento parece depender del contenido MIME/cuerpo:

  • correo simple/plano → aceptado
  • correo que contiene una firma de Outlook, una tabla y/o imágenes incrustadas → rechazado con Acceso denegado

El registro del correo rechazado muestra que el fallo ocurre en Email::Processor#process!.

Versión de la aplicación Discourse:

4143157a17dc3ff63c909c64d0cf578243d38861

Esta instalación fue migrada/restaurada recientemente a otro servidor, pero la entrega SMTP entrante en sí funciona y el comportamiento parece estar específicamente relacionado con cuerpos de correo más ricos.

Puedo proporcionar un mensaje MIME crudo anonimizado y más diagnósticos de IncomingEmail/Email::Receiver si es útil.

Actualización: He reproducido la causa de los fallos de Access Denied que estaba viendo y he abierto un PR:

La parte importante de mi observación original fue:

  • correo electrónico entrante simple/plano → aceptado
  • correo electrónico más rico que contiene medios incrustados → rechazado con Access Denied

Los mensajes rechazados se estaban procesando como usuarios en espera/desconocidos en una categoría que permite correos electrónicos entrantes de desconocidos.

Desde #42079, NewPostManager detecta los medios incrustados directamente desde el contenido del mensaje cuando faltan los metadatos de tamaño de imagen. Esto hace correctamente que estos mensajes entren en la ruta de revisión :contains_media.

Sin embargo, antes de poner el mensaje en cola para su revisión, NewPostManager.default_handler realiza la comprobación normal de Guardian para la creación de temas en la categoría.

Para un usuario de correo electrónico entrante en espera, esa comprobación puede fallar incluso aunque Email::Receiver ya haya aceptado la ruta de correo electrónico de desconocidos de la categoría y haya pasado skip_validations.

Eso produce el error que estaba viendo:

Email::Receiver::InvalidPost: Access Denied

He añadido una prueba de regresión de extremo a extremo del receptor para un correo electrónico que contiene medios de un desconocido.

En main actual, antes de la corrección, la prueba reproduce:

Email::Receiver::InvalidPost: Access Denied

También probé el mismo caso inmediatamente antes de #42079, donde el correo electrónico entrante es aceptado, confirmando que se trata de una regresión introducida por ese cambio.

El PR conserva la moderación de medios prevista en lugar de omitirla. Con la corrección, el correo electrónico entrante se pone en cola como ReviewableQueuedPost y su motivo de revisión sigue siendo:

contains_media

Las pruebas relevantes de Email::Receiver y NewPostManager pasan localmente:

261 ejemplos, 0 fallos

Así que esto parece explicar el comportamiento de Access Denied que informé anteriormente, incluido el motivo por el que los correos electrónicos simples funcionaban mientras que los mensajes más ricos que contenían medios incrustados no lo hacían.