如何重建对话或群组电子邮件



我有一个PST文件,其中包含用户的电子邮件历史记录。任务是读取此PST文件并重建电子邮件历史记录,以在客户端中显示它。这包括正确显示电子邮件客户端的对话:

Meeting at 8:00               07:34 am
AW: Meeting at 8:00         09:12 am
AW: AW: Meeting at 8:00   13:45 pm
[Jenkins Build] Success       11:54 am
[Jenkins Build] Failed      12:13 pm
[Jenkins Build] Success   01:12 pm
[Jenkins Build] Success       10:34 am
[Jenkins Build] Failed      12:12 pm
[Jenkins Build] Success   05:12 pm

然而,我不知道我怎么能可靠地做到这一点。

我使用的是javalibpst(请参阅官方文档),它提供了一个PSTMessage对象。有一个方法getConversationId(),但它似乎只是该消息的原始主题的字符串,这意味着可能存在重复(例如[Jenkins Build]*)。

因此,我不确定Outlook是如何重建对话的,也不确定这是否微不足道,但如果真的有一种简单的方法可以做到这一点,而我只是忽略了它,如果有人告诉我,我会很高兴的——否则,这将导致我解析大量的主题字段,分析它们,并试图按主题匹配电子邮件,这样就有可能错过碰巧有相同主题的不同对话。

我认为您需要自己构建对话。您可能会发现本页中引用的有关Netscape邮件消息线程算法的源代码非常有用。

我把源代码复制到了Github。这是电子邮件Threader.java文件。

下面有人解释了Gmail是如何构建对话的。我的要点是:

  1. 在一封主题相同的电子邮件之后,来自任何先前电子邮件中的任何参与者的电子邮件都是同一对话的一部分
  2. in-reply-to电子邮件字段可以创建电子邮件对话的参与者,即使他们不是明确的参与者

其中:

equivalent subject表示相同的主题,或者表示将导致回复或转发的主题。即"FW:X"、"RE:X"one_answers"Fwd:X"等

explicit participants in an email:发件人或出现在"收件人:"或"抄送:"字段中的任何电子邮件。(也许还有BCC:字段…)

participants in an email:电子邮件中的明确参与者或使用in-reply-to字段稍后发送电子邮件的任何人。

participants in any previous email:发送日期较早的电子邮件参与者的不同电子邮件,其主题与当前电子邮件的主题相同。

以下是与电子邮件线程相关的电子邮件字段的另一个说明。我从中得到的是,除了in-reply-to报头之外,还应该参考References报头,并且它更可靠。(也许,如果存在,它应该取代in-reply-to报头。

最新更新