2

我正在尝试解析 GMail 电子邮件,但有一个问题:我如何知道回复对应于哪条消息?

我尝试按主题对电子邮件进行排序。例如,如果邮件的主题为“hi Jack”,那么所有主题为“Re: hi Jack”的邮件都是对该邮件的回复。

但是,如果我有很多相同主题的电子邮件怎么办?我怎么知道他们回复了哪封电子邮件?

电子邮件是否可能具有用于回复内容的唯一代码?也许有一个 ID 或类似的东西可以知道消息的孩子是什么(?)。

4

1 回答 1

3

按主题划分线程不是一个好主意,因为您可能注意到基于相同主题的多个不同线程。

您需要检查消息中的 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>,您可以通过不线程化这些消息并将它们显示为未线程化来摆脱困境。因此线程/定位的通用算法可能看起来像这样:

  1. 获取第一个消息 ID
  2. 检查附近的(按日期)消息,以查看其中一条消息是否在其引用列表或回复中包含消息 ID - 如果没有 - 您无法将其分组,因此将其保留为独立消息。
  3. 以某种方式对消息进行分组,可能基于Date:, 或Received:header
  4. 将此消息放入“完成”列表中,这样您就不需要进一步检查它(或相关参考)
  5. 继续,直到您找不到更多引用,然后移至下一条不在“完成”列表中的消息,并重复步骤,直到您处理整个消息列表。

您可能需要一段时间才能正确完成这项工作,但现在至少您有一个起点可以研究。

于 2013-10-07T18:47:16.950 回答