Je constate que les courriels entrants sont rejetés par Discourse avec le message :
Email can not be processed: Access Denied
La réception des courriels entrants semble fonctionner correctement. Le message atteint le récepteur de messagerie, et les vérifications SPF, DKIM et DMARC passent toutes. Discourse le traite ensuite via Jobs::ProcessEmail.
Le comportement semble dépendre du contenu MIME/corps du message :
courriel simple/plain → accepté
courriel contenant une signature Outlook, un tableau et/ou des images en ligne → rejeté avec Access Denied
Le journal des courriels rejetés indique que l’échec se produit dans Email::Processor#process!.
Version de l’application Discourse :
4143157a17dc3ff63c909c64d0cf578243d38861
Cette installation a récemment été migrée/restaurée sur un autre serveur, mais la livraison SMTP entrante fonctionne correctement, et le problème semble spécifiquement lié aux corps de courriel plus riches.
Je peux fournir un message MIME brut anonymisé ainsi que des diagnostics supplémentaires sur IncomingEmail/Email::Receiver si nécessaire.
Mise à jour : j’ai maintenant reproduit la cause des échecs Access Denied que je rencontrais et j’ai ouvert une PR :
La partie importante de mon observation initiale était :
e-mail entrant simple/plain → accepté
e-mail plus riche contenant des médias intégrés → rejeté avec Access Denied
Les messages rejetés étaient traités en tant qu’utilisateurs en attente/étrangers dans une catégorie qui accepte les e-mails entrants des étrangers.
Depuis #42079, NewPostManager détecte les médias intégrés directement depuis le contenu du message lorsque les métadonnées de taille d’image sont absentes. Cela entraîne correctement l’entrée de ces messages dans le parcours de révision :contains_media.
Cependant, avant de mettre le message en file d’attente pour révision, NewPostManager.default_handler effectue la vérification normale de création de sujet de catégorie via Guardian.
Pour un utilisateur en attente recevant un e-mail, cette vérification peut échouer même si Email::Receiver a déjà accepté le parcours d’e-mail pour les étrangers de la catégorie et transmis skip_validations.
Cela produit l’erreur que je rencontrais :
Email::Receiver::InvalidPost: Access Denied
J’ai ajouté un test de régression bout en bout pour un e-mail contenant des médias provenant d’un étranger.
Sur la branche main actuelle, avant la correction, le test reproduit :
Email::Receiver::InvalidPost: Access Denied
J’ai également testé le même cas juste avant #42079, où l’e-mail entrant est accepté, confirmant qu’il s’agit d’une régression introduite par ce changement.
La PR préserve la modération des médias prévue plutôt que de la contourner. Avec la correction, l’e-mail entrant est mis en file d’attente en tant que ReviewableQueuedPost et sa raison de révision reste :
contains_media
Les specs pertinentes de Email::Receiver et NewPostManager passent localement :
261 exemples, 0 échecs
Cela semble donc expliquer le comportement Access Denied que j’ai signalé ci-dessus, y compris pourquoi les e-mails simples fonctionnaient tandis que les messages plus riches contenant des médias intégrés ne fonctionnaient pas.