PHP 解析 Gmail 邮件回复


PHP parsing gmail mail reply

我正在尝试解析 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>您可以通过不线程化这些消息并将其显示为非线程来纾困。因此,用于线程/定位的通用算法可能如下所示:

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

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