PHP解析gmail邮件回复

时间:2013-10-07 17:07:57

标签: php parsing email gmail

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

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

但如果我有很多同一主题的电子邮件怎么办?我如何知道他们回复的电子邮件?

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

1 个答案:

答案 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>您可以通过不对这些消息进行线程化并将其显示为无线来进行拯救。因此,线程/定位的通用算法可能如下所示:

  1. 获取第一条消息ID
  2. 检查附近(按日期)消息,看看其中一条消息是否在其参考列表中包含消息ID或在回复中 - 如果没有 - 您无法对其进行分组,因此请将其保留为独立消息。
  3. 以某种方式对邮件进行分组,可能基于Date:Received:标题
  4. 将此消息放入&#34;完成&#34;列表,因此您不需要进一步检查(或相关参考)
  5. 继续,直到找不到更多参考文献,然后转到下一条尚未包含的消息&#34;完成&#34;列出并重复步骤,直到您处理整个邮件列表。
  6. 这可能需要一段时间才能正确完成,但现在至少你有一个起点要研究。