Erreurs "Unexplained Email::Receiver::InvalidPost" inexpliquées

Quelques listes de diffusion sont mises en miroir sur Mailing Lists - Tor Project Forum

Nous avons récemment remarqué que certains messages n’étaient pas mis en miroir de la liste de diffusion Mailman3 vers le forum.

Les journaux de rejet d’e-mails montrent que ces e-mails ont rencontré une erreur Email::Receiver::InvalidPost.

Le message d’erreur enregistré est l’un des deux suivants :

Nous sommes désolés, mais votre message électronique à [« tor-relays@lists.torproject.org »] (intitulé [tor-relays] mesures de bande passante et latence des relais) n’a pas fonctionné.

Raison :

Accès refusé

Si vous pouvez corriger le problème, veuillez réessayer.

ou :

Nous sommes désolés, mais votre message électronique à [« tor-relays@lists.torproject.org »] (intitulé [tor-relays] Re: ponts webtunnel pour le distributeur Telegram) n’a pas fonctionné.

Raison :

Quelque chose s’est mal passé. Peut-être que ce sujet a été fermé ou supprimé pendant que vous le consultiez ?

Si vous pouvez corriger le problème, veuillez réessayer.

Je n’ai rien trouvé de suspect dans ces messages en examinant les en-têtes, bien que dans certains cas, le corps extrait tel qu’enregistré ne contienne que le pied de page de la liste de diffusion, ou dans un autre cas, il s’agisse d’une série de caractères incompréhensibles comme s’il y avait eu un problème de décodage.

J’ai essayé de reproduire ce problème en utilisant une liste de diffusion de test et une catégorie de test, mais sans succès. Toute aide pour déboguer cela serait appréciée.

« accepter les e-mails de comptes anonymes » est-il activé dans les paramètres de chaque catégorie, et pourriez-vous s’il vous plaît envoyer le journal des e-mails de Discourse (légèrement modifié si possible)

1 « J'aime »

Oui, je peux confirmer que ce paramètre est activé.

et pourriez-vous s’il vous plaît envoyer le journal des e-mails de Discourse (légèrement modifié si possible)

Est-ce quelque chose que je dois extraire du conteneur ou de l’hôte ? Nous traitons également le courrier via le conteneur mail-receiver. Ou voulez-vous les journaux qui sont exposés dans l’interface Web (par exemple, /admin/email-logs/rejected) ?

Est-ce que cela vient d’Exchange ?

Parfois, Microsoft Exchange envoie des données corrompues s’il est mal configuré pour penser qu’il communique avec… Je ne suis pas sûr - un autre serveur Exchange ? Quelque chose d’autre au sein de sa propre infrastructure ?

Vous pouvez examiner le courrier brut depuis la console Discourse avec par exemple :

mid = 'message-id from the log'
puts IncomingEmail.find_by(message_id: mid).raw

Cela affiche le courrier brut que Discourse a reçu. Par exemple, le corps de ce message que je viens de retirer de notre liste de rejet entrants est vraiment du charabia :

This is a multi-part message in MIME format.
--=====003_Dragon855807841081_=====
Content-Type: text/plain;
 charset=utf-8
Content-Transfer-Encoding: base64

7bgir+m+vzzIDCLE0mDmZrfIXvvmXjY=

--=====003_Dragon855807841081_=====
Content-Type: text/html;
 charset=utf-8
Content-Transfer-Encoding: base64

LP/0L4tqmfZizO0DCDDE10uOzMZqzSHDjq04SLPaBjibLVHz+V94m1M45NDN
55aM8SMIf9XY4EFjP9CCFz+ojfmJqmubaz+bjrzmubw+bjWTiGSuLg==

--=====003_Dragon855807841081_=====--

car les parties ne se décodent pas en texte valide.

2 « J'aime »

les deux seraient parfaits. Si vous utilisez PuTTy SSH, vous pouvez extraire les journaux du conteneur, et vous pourriez extraire des extraits de l’interface utilisateur de Discourse. Cependant, vous ne pouvez pas facilement rechercher des mots dans la photo pour les masquer :face_exhaling:

J’ai pu extraire deux e-mails avec les en-têtes complets. L’un est d’Apple Mail et l’autre de Claws Mail.

Je serais heureux de les transférer à l’adresse e-mail privée de quelqu’un pour le débogage, afin d’éviter de les coller partout sur Internet.

Je pense que dans les deux cas, c’est probablement Discourse qui ne parvient pas à analyser correctement le contenu de l’e-mail.

Pour information, cela reste un problème. Discourse rejette régulièrement les messages des listes de diffusion de divers expéditeurs avec l’erreur Email::Receiver::InvalidPost, pour des raisons que je n’arrive pas à comprendre.

Si vous cliquez sur l’erreur dans les journaux, la raison du rejet s’affiche-t-elle ?

par exemple :

Si vous cliquez sur l’erreur dans les journaux, est-ce que la raison du rejet l’indique ?

Ces messages se présentent sous deux formes :

Nous sommes désolés, mais votre message électronique à [\"tor-relays@lists.torproject.org\"] (intitulé [tor-relays] Re: rapport d'abus des relais de la famille 7EAAC49A7840D33B62FA276429F3B03C92AA9327) n'a pas fonctionné.

Raison :

Quelque chose s'est mal passé. Ce sujet a peut-être été fermé ou supprimé pendant que vous le consultiez ?

Si vous pouvez corriger le problème, veuillez réessayer.

Je peux confirmer qu’aucune de ces choses (sujet fermé ou supprimé) ne s’est produite dans ces cas.

D’autres fois, la raison est simplement Accès refusé.

Bonjour lavamind - désolé de déterrer un vieux fil de discussion, mais je voulais d’abord vérifier avant d’aller plus loin dans le débogage.

Rencontrez-vous toujours les rejets Email::Receiver::InvalidPost sur la mise en miroir des listes de diffusion à l’heure actuelle (fin 2025 / début 2026) ?

Si oui, pourriez-vous partager un bref aperçu de :

  • à quelle fréquence cela se produit (par exemple, quotidiennement / hebdomadairement, % des messages)
  • si la « Raison » de l’e-mail rejeté est toujours principalement « Accès refusé » par rapport à « sujet fermé/supprimé »
  • si cela affecte une liste/catégorie ou plusieurs

Une fois que nous aurons confirmé que cela se produit toujours, nous pourrons passer à la collecte de l’ensemble minimal de diagnostics pour un échec récent (Message-ID + l’e-mail brut stocké correspondant, etc.).

Pas besoin de vous excuser, je suis très heureux que vous examiniez cela.

Bonjour lavamind - désolé de déterrer un vieux fil de discussion, mais je voulais vérifier avant d’aller plus loin dans le débogage.

Voyez-vous toujours les rejets Email::Receiver::InvalidPost sur la mise en miroir de la liste de diffusion à l’heure actuelle (fin 2025 / début 2026) ?

Oui, le problème persiste.

environ à quelle fréquence cela se produit-il (par exemple, quotidiennement / hebdomadairement, % des messages)

La fréquence est difficile à déterminer exactement, mais le problème affecte au moins plusieurs messages par semaine, une estimation approximative se situe peut-être entre 5 et 10 % des messages ? Certains expéditeurs semblent être surreprésentés dans les journaux d’erreurs, donc au moins cela n’a pas l’air totalement aléatoire.

si la « Raison » de l’e-mail rejeté est toujours principalement « Accès refusé » par rapport à « sujet fermé/supprimé »

C’est toujours un mélange des deux.

si cela affecte une liste/catégorie ou plusieurs

Cela affecte principalement la catégorie tor-relays, mais cette liste reçoit des contributions régulières de plusieurs expéditeurs contrairement aux autres listes que nous mettons en miroir, qui reçoivent beaucoup moins de trafic.

Une fois que nous aurons confirmé que cela se produit toujours, nous pourrons passer à la collecte de l’ensemble minimal de diagnostics pour un échec récent (Message-ID + l’e-mail brut stocké correspondant, etc.).

Nous pourrions examiner ce fil de discussion récent. L’archive de Mailman indique qu’il a reçu 5 messages, mais le sujet miroir du forum n’en contient que 3 publications. Les journaux de rejet contiennent 3 erreurs InvalidPost pour ce sujet (2 du même expéditeur, étrangement) et pour toutes, la raison du rejet affichée est « Quelque chose s’est mal passé. Ce sujet a peut-être été fermé ou supprimé pendant que vous le consultiez ? »

Merci lavamind - c’est un point de données vraiment utile, surtout d’avoir un fil d’Ariane concret du type « L’archive Mailman montre 5, le sujet du forum montre 3 » sur lequel s’ancrer.

Étant donné que vous constatez cela plusieurs fois par semaine (environ 5 à 10 % des messages) et que, pour cet incident, la raison du rejet est constamment la variante trompeuse « sujet fermé/supprimé », la meilleure prochaine étape consiste à capturer un message de bout en bout afin que nous puissions voir ce que Discourse pensait faire.


Pour l’un des 3 e-mails rejetés associés à ce fil miroir, pourriez-vous récupérer ce qui suit :

  1. Depuis /admin/email-logs/rejected, ouvrez l’une des lignes InvalidPost pour cet incident et copiez :

    • le Message-ID
    • la date/heure
    • le (rédigé) À / De / Objet affiché dans la ligne
    • le texte complet de la raison du rejet (tel qu’affiché)
  2. Depuis la console Rails (dans le conteneur de l’application Discourse), extrayez l’e-mail brut stocké par Discourse :

@supermathie, IncomingEmail est-il toujours l’endroit canonique pour récupérer le brut, et y a-t-il autre chose que vous voudriez en plus pour le débogage d’InvalidPost ?

mid = "<collez le Message-ID du journal des e-mails rejetés ici>"
ie  = IncomingEmail.find_by(message_id: mid)

puts ie&.raw
  1. Extrayez également les attributs EmailLog appariés pour le même Message-ID (cela révèle souvent si Discourse l’a traité comme une réponse ou un nouveau sujet, et quels identifiants de sujet/catégorie il a résolus) :
mid = "<même Message-ID que ci-dessus>"

log = EmailLog.where(message_id: mid).order(created_at: :desc).first
pp log&.attributes&.slice(
  "id",
  "email_type",
  "to_address",
  "from_address",
  "subject",
  "post_id",
  "topic_id",
  "user_id",
  "status",
  "bounce_error_code",
  "bounce_key",
  "created_at"
)

Pourquoi ce trio ?

  • IncomingEmail.raw nous indique si l’e-mail est arrivé mal formaté / encodé bizarrement / seulement le pied de page, par opposition à Discourse choisissant la mauvaise partie MIME.
  • EmailLog nous indique ce que Discourse a tenté (nouveau sujet vs réponse, identifiants de sujet/catégorie résolus, etc.).
  • La ligne de l’interface utilisateur de l’e-mail rejeté confirme que nous examinons le même incident et préserve ce que les opérateurs voient.

Si la confidentialité est une préoccupation, n’hésitez pas à masquer les adresses et tout texte de corps de message à l’intérieur du brut, mais veuillez conserver :

  • Les en-têtes MIME (Content-Type, limites, charset, Content-Transfer-Encoding)
  • La structure multipartite (afin que nous puissions voir quelles parties existent)
  • Le Message-ID et les en-têtes de routage de base (vous pouvez masquer les domaines si nécessaire)

Une fois que nous aurons un Message-ID défaillant + IncomingEmail.raw + la tranche EmailLog, nous devrions être en mesure de déterminer rapidement s’il s’agit :

  • d’une incohérence de clé de réponse / routage de sujet,
  • d’un cas limite de permissions,
  • ou d’un échec d’analyse d’e-mail / sélection de partie MIME / décodage.