Auto-hébergé, version 2026.1.5 (commit 2727e4d). Nous gérons une communauté en mode liste de diffusion et traitons les réponses par e-mail.
Un membre a répondu depuis Outlook avec un message assez long, et la copie affichée sur le site — et renvoyée à la liste — a été tronquée en plein milieu. Tout le contenu à partir de sa première liste numérotée avait simplement disparu. Aucune erreur, rien dans les logs, le message s’arrêtait simplement en plein milieu d’une phrase.
Ce qui m’a interpellé au premier abord : les listes à puces plus tôt dans le même e-mail étaient passées correctement. Seule la liste numérotée a été coupée, ainsi que tout ce qui suivait.
Le problème vient de extract_from_word dans lib/email/receiver.rb. Pour les e-mails Outlook/Word, il considère le premier enfant de .WordSection1 qui n’est ni un <p> ni un <ul> comme le début d’une signature ou d’un message transféré, et le supprime ainsi que tous les frères suivants :
elided =
doc.css(
".WordSection1 > :not(p):not(ul):first-of-type, .WordSection1 > :not(p):not(ul):first-of-type ~ *",
).remove
Outlook rend les listes numérotées sous forme de <ol>, et le sélecteur n’exclut pas <ol>. Ainsi, la liste numérotée est le premier élément « ni <p> ni <ul> », et le récepteur coupe le message à cet endroit. Les listes à puces (<ul>) sont exclues, ce qui explique pourquoi elles sont conservées et non la liste numérotée.
Reproduction
- Depuis Outlook (version bureau), répondez à une notification. Rédigez un paragraphe, puis une liste numérotée, puis un autre paragraphe.
- Le message créé conserve le texte jusqu’à la liste numérotée et supprime la liste ainsi que tout ce qui suit.
Corps HTML minimal qui déclenche le bug (facile à intégrer dans un test du récepteur) :
<div class=WordSection1>
<p class=MsoNormal>Paragraphe d’introduction.</p>
<p class=MsoNormal>Étapes :</p>
<ol><li>Premier</li><li>Deuxième</li></ol>
<p class=MsoNormal>Ce paragraphe final disparaît également.</p>
</div>
Vous ne récupérez que les deux paragraphes d’introduction.
Le bug est toujours présent sur la branche main — le sélecteur n’a pas changé. J’ai d’abord cherché dans la catégorie des bugs et n’ai trouvé aucun rapport similaire.
Correction suggérée
Traiter <ol> de la même manière que <ul>, car une liste numérotée fait partie du contenu, et non de la signature :
".WordSection1 > :not(p):not(ul):not(ol):first-of-type, .WordSection1 > :not(p):not(ul):not(ol):first-of-type ~ *"
Cela conserve la liste tout en supprimant toujours les véritables marqueurs de signature/transfert (tableaux, divs, hr, images). Je suis prêt à ouvrir une PR avec un e-mail de test et un test échouant si cela peut aider.