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.