お気づきのように、同一の主題に基づく複数の異なるスレッドが存在する可能性があるため、主題ごとにスレッド化することはお勧めできません。
スレッド化 (または他の種類のグループ化) を可能にするには、メッセージ内の 3 つのヘッダーを調べる必要があります。
Message-ID:
文字で囲まれた文字列に一意のメッセージ識別子 (「一意のコード」と呼ばれるもの) が含まれます。<
たとえば、>
ほとんど<123456@User1PC>
の MUA は上記の形式またはそれに類似した形式で識別子を作成します。このヘッダーは、新しいメッセージが送信されるときに生成される必要があります。
In-Reply-To:
この特定の返信が関連するメッセージが含まれています<789abcd@User2PC>
。このヘッダーはMessage-ID
、返信先からコピーする必要があります。
References:
この「スレッド」内のメッセージへの最近の参照のリストが含まれています。形式は上記と似ていますが、それらが分離されていることを除いて、たとえば<123456@User1PC> <789abcd@User2PC>
、スレッド内のメッセージを見つけるために使用できるようになっています。
1 つのメッセージが数日後に返信または投稿された場合、参照のリストがないと見つけるのが難しい場合があります。通常、参照のリストは、メール クライアントによって適切なサイズにトリミングされます。合理的とは、スレッド内のメッセージを見つけることができるように十分にトリミングするが、ヘッダーを適切なサイズに保つ (参照が多すぎない) ことを意味します。たとえば、5 ~ 10 の参照が含まれている場合がありますが、これは通常、他のメッセージに関連付けるのに十分な数です。References:
元のメッセージ (最初のメッセージ) が削除された場合にも役立つので、それがなくても、References:
リストを使用してスレッド化 (グループ化) メッセージを作成できます。
したがって、メッセージをスレッド化するには、メッセージをすべて読み取り、上記のヘッダーから抽出できる情報に基づいてスレッドをソートする必要があります。
参照またはメッセージ ID が認識できる形式でない場合 (たとえば<example@something>
、これらのメッセージをスレッド化せず、スレッド化されていないものとして表示することで救済できます。したがって、スレッド化/検索の一般的なアルゴリズムは次のようになります。
- 最初のメッセージ ID を取る
- 近くの (日付ごとに) メッセージを調べて、参照リストまたは in-reply-to にメッセージ ID が含まれているかどうかを確認します。含まれていない場合は、グループ化できないため、スタンドアロンのメッセージとして保持します。
Date:
おそらく、またはReceived:
ヘッダーに基づいて、何らかの方法でメッセージをグループ化します
- このメッセージを「完了」リストに入れて、それ以上 (または関連する参照) を調べる必要がないようにします。
- 参照が見つからなくなるまで続行し、「完了」リストにまだない次のメッセージに移動し、メッセージ リスト全体を処理するまで手順を繰り返します。
これを適切に行うには、おそらくしばらく時間がかかるでしょうが、少なくとも調査の出発点はここにあります。