E-mails recebidos com assinaturas/tabelas/imagens inline rejeitados com "Acesso negado"

Estou vendo e-mails recebidos sendo rejeitados pelo Discourse com:

Email can not be processed: Access Denied

O recebimento de e-mails parece estar funcionando corretamente. A mensagem chega ao receptor de e-mail, e SPF, DKIM e DMARC passam. O Discourse então o processa através de Jobs::ProcessEmail.

O comportamento parece depender do conteúdo MIME/corpo:

  • e-mail simples/plano → aceito
  • e-mail contendo assinatura do Outlook, tabela e/ou imagens inline → rejeitado com Access Denied

O log de e-mail rejeitado mostra a falha ocorrendo em Email::Processor#process!.

Versão do aplicativo Discourse:

4143157a17dc3ff63c909c64d0cf578243d38861

Esta instalação foi recentemente migrada/restaurada para outro servidor, mas a entrega SMTP recebida em si está funcionando e o comportamento parece estar especificamente relacionado a corpos de e-mail mais ricos.

Posso fornecer uma mensagem MIME bruta sanitizada e diagnósticos adicionais de IncomingEmail/Email::Receiver, se for útil.

Atualização: Reproduzi a causa das falhas de Access Denied que estava observando e abri um PR:

A parte importante da minha observação original foi:

  • e-mail simples/plano recebido → aceito
  • e-mail mais rico contendo mídia incorporada → rejeitado com Access Denied

As mensagens rejeitadas estavam sendo processadas como usuários em fase de staging/estrangeiros em uma categoria que permite e-mails de entrada de estrangeiros.

Desde #42079, o NewPostManager detecta mídia incorporada diretamente no conteúdo da publicação quando os metadados de tamanho de imagem estão ausentes. Isso faz com que essas mensagens entrem corretamente no fluxo de revisão :contains_media.

No entanto, antes de enfileirar a publicação para revisão, o NewPostManager.default_handler realiza a verificação normal do Guardian para criação de tópicos na categoria.

Para um usuário de e-mail de entrada em fase de staging, essa verificação pode falhar, mesmo que o Email::Receiver já tenha aceitado o caminho de e-mail de estrangeiros da categoria e passado skip_validations.

Isso produz o erro que estava observando:

Email::Receiver::InvalidPost: Access Denied

Adicionei um teste de regressão end-to-end do receiver para um e-mail contendo mídia enviado por um estrangeiro.

No main atual, antes da correção, o teste reproduz:

Email::Receiver::InvalidPost: Access Denied

Também testei o mesmo caso imediatamente antes de #42079, onde o e-mail de entrada é aceito, confirmando que esta é uma regressão introduzida por aquela alteração.

O PR preserva a moderação de mídia pretendida, em vez de contorná-la. Com a correção, o e-mail de entrada é enfileirado como um ReviewableQueuedPost e seu motivo de revisão permanece:

contains_media

Os specs relevantes do Email::Receiver e do NewPostManager passam localmente:

261 exemplos, 0 falhas

Portanto, isso parece explicar o comportamento de Access Denied que relatei acima, incluindo por que os e-mails simples funcionavam enquanto as mensagens mais ricas contendo mídia incorporada não.