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

时间:2017-11-03 11:28:47

标签: email outlook pst java-libpst

我有一个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

但是,我不知道如何可靠地做到这一点。

我正在使用提供java-libpst对象的Official Documentation(请参阅PSTMessage)。有一种方法getConversationId(),但似乎只是该邮件原始主题的字符串,这意味着可能存在重复项(例如[Jenkins Build]*)。

所以,我不确定Outlook是如何重建对话的,以及这是否是微不足道的,但如果实际上有一种简单的方法可以做到这一点,我只是忽略了如果有人让我知道我会很高兴 - 否则这将最终解析大量的主题字段,解析它们并试图按照主题匹配电子邮件,同时存在丢失不同会话的危险,这些会话恰好具有相同的主题。

1 个答案:

答案 0 :(得分:1)

我认为您需要自己构建对话。您可能会发现此页面上引用的有关the Netscape Mail message threading algorithm的源代码很有帮助。

我将源代码复制到了Github。这是the email Threader.java file

有人在提供an explanation of how Gmail constructs conversations我的要旨是:

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

位置:

equivalent subject表示相同的主题,或可能导致回复或转发的主题。即“ FW:X”,“ RE:X”,“ Fwd:X”等。

explicit participants in an email:发件人或TO:或CC:字段中显示的任何电子邮件。 (也许也是BCC:字段...)

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

participants in any previous email:发送日期较早的电子邮件中参与邮件的不同电子邮件,以与当前电子邮件相同的邮件为准。

这里是另一个exposition of email fields relevant to email threading。我从中得到的是,除了References标头之外,还应该参考in-reply-to标头,它更可靠。 (也许,如果有的话,它应该取代in-reply-to标头。