Outlookのメール返信で番号付きリスト以降の情報がすべて消える

セルフホスト、2026.1.5 (コミット 2727e4d)。私たちはメーリングリストモードでコミュニティを運営しており、返信はメールで行っています。

あるメンバーが Outlook からかなり長い投稿で返信したところ、サイトに表示されたコピー(そしてリストに再配信されたもの)は途中までしか表示されませんでした。最初の番号付きリスト以降のすべての内容は完全に消えていました。エラーもログにも何も記録されておらず、投稿はただ文の途中で終わっていました。

最初に気になったのは、同じメールの前半にあった箇条書きリストが正常に表示されていたことです。番号付きリストとその後の内容だけが切り捨てられていました。

これは lib/email/receiver.rb の extract_from_word メソッドが原因です。Outlook/Word メールの場合、.WordSection1 の子要素のうち、

    ではない最初の要素を署名または転送メッセージの開始と見なし、それとその後のすべての兄弟要素を削除します:

    elided =
    doc.css(
    “.WordSection1 > :not(p):not(ul):first-of-type, .WordSection1 > :not(p):not(ul):first-of-type ~ *”,
    ).remove

    Outlook は番号付きリストを

      としてレンダリングしますが、セレクターは ol を除外していません。そのため、番号付きリストは「p でも ul でもない」最初の要素となり、レシーバーはそこでメッセージを切り捨ててしまいます。箇条書きリスト (
        ) は除外されているため、それらは残りますが、番号付きリストは残らないのです。

        再現手順

        1. Outlook(デスクトップ版)から通知に返信します。段落、番号付きリスト、そして別の段落の順に記述します。
        2. 作成された投稿は番号付きリストまでのテキストを保持し、リストとその下のすべてを削除します。

        これを引き起こす最小限の HTML ボディ(レシーバーのテストに簡単に組み込めます):

        導入の段落。

        手順:

        1. 1番目
        2. 2番目

        この末尾の段落も消えてしまいます。

        結果として得られるのは、2つの導入段落のみです。

        これは main ブランチでもまだ存在しており、セレクターは変更されていません。まずバグカテゴリを検索しましたが、すでに報告されているものは見つかりませんでした。

        修正案

        番号付きリストはコンテンツであり署名ではないため、

            と同じように扱います:

            “.WordSection1 > :not(p):not(ul):not(ol):first-of-type, .WordSection1 > :not(p):not(ul):not(ol):first-of-type ~ *”

            これにより、リストは保持され、実際の署名や転送マーカー(テーブル、div、hr、画像)は引き続き省略されます。必要であれば、フィクスチャメールと失敗するテストを含む PR を作成できます。