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