我正在尝试解析 GMail 电子邮件,但有一个问题:我如何知道回复对应于哪条消息?
我尝试按主题对电子邮件进行排序。例如,如果邮件的主题为“hi Jack”,那么所有主题为“Re: hi Jack”的邮件都是对该邮件的回复。
但是,如果我有很多相同主题的电子邮件怎么办?我怎么知道他们回复了哪封电子邮件?
电子邮件是否可能具有用于回复内容的唯一代码?也许有一个 ID 或类似的东西可以知道消息的孩子是什么(?)。
按主题划分线程不是一个好主意,因为您可能注意到基于相同主题的多个不同线程。
您需要检查消息中的 3 个标头以使线程(或其他类型的分组)成为可能:
Message-ID:
<
在由和字符包围的字符串中包含唯一消息标识符(您称之为“唯一代码”),>
例如<123456@User1PC>
大多数 MUA 将创建上述形式或类似形式的标识符。此标头应在发送新消息时生成。
In-Reply-To:
包含与此特定回复相关的消息,例如<789abcd@User2PC>
。应该从Message-ID
它的回复中复制此标头。
References:
包含最近引用此“线程”中的消息的列表。格式与上面类似,只是它们是分开的,例如<123456@User1PC> <789abcd@User2PC>
它在那里,以便您可以使用它来定位线程中的消息。
如果几天后回复或发布了一条消息,如果没有参考列表,可能很难找到它。通常,邮件客户端会将参考列表修剪到合理的大小。合理,我的意思是,修剪它足以能够在线程中定位消息,但将标题保持在合理的大小(没有太多引用)。例如,它可能包含 5-10 个引用,这通常足以将其连接到其他消息。References:
如果原始消息(第一条)已被删除,那么即使没有它,您仍然可以利用References:
列表来构建线程(分组)消息。
因此,为了对消息进行线程化,您需要阅读所有消息,然后根据您可以从上述标题中提取的信息对线程进行排序。
如果引用或消息 ID 不是您可以识别的形式(例如<example@something>
,您可以通过不线程化这些消息并将它们显示为未线程化来摆脱困境。因此线程/定位的通用算法可能看起来像这样:
Date:
, 或Received:
header您可能需要一段时间才能正确完成这项工作,但现在至少您有一个起点可以研究。