我正在尝试解析 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>
您可以通过不线程化这些消息并将其显示为非线程来纾困。因此,用于线程/定位的通用算法可能如下所示:
- 获取第一个消息 ID
- 检查附近的(按日期(邮件,查看其中一个邮件是否在其引用列表中包含邮件 ID 或回复 - 如果没有 - 您无法对其进行分组,因此将其保留为独立邮件。
- 以某种方式对邮件进行分组,可能基于
Date:
或Received:
标头 - 将此消息放入"完成"列表中,这样您就无需进一步检查它(或相关参考( 继续,直到找不到
- 更多引用,然后移动到"完成"列表中尚未包含的下一条消息,并重复步骤,直到处理整个消息列表。
可能需要一段时间才能正确完成,但现在至少你有一个起点可以研究。