【问题标题】:PHP parsing gmail mail replyPHP解析gmail邮件回复
【发布时间】:2013-10-14 08:55:22
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我试图为你澄清一些措辞,但你能解释一下最后一句话的意思吗?具体来说,“所有电子邮件都有唯一的代码和回复”部分让我感到困惑。是陈述还是问题?你的意思是“to”还是“too”?
  • 第 1 步:Read this。第 2 步:讨厌生活。
  • @Gray 这句话的意思是,消息有没有id分配回复消息?
  • @TomasLietuva 好的,我更新了它。这对你还有意义吗?
  • @Gray 我正在讨论线程消息...

标签: php parsing email gmail


【解决方案1】:

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

您需要检查消息中的 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. 继续直到找不到更多引用,然后移至不在“完成”列表中的下一条消息并重复步骤,直到处理完整个消息列表。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多