【问题标题】:How does the email header field 'thread-index' work?电子邮件标题字段“线程索引”如何工作?
【发布时间】:2011-01-17 17:03:29
【问题描述】:

我想知道是否有人知道电子邮件标头中的线程索引字段是如何工作的?

这是一个简单的电子邮件线程索引链,我用它给自己发消息。

Email 1 Thread-Index: AcqvbpKt7QRrdlwaRBKmERImIT9IDg==
Email 2 Thread-Index: AcqvbpjOf+21hsPgR4qZeVu9O988Eg==
Email 3 Thread-Index: Acqvbp3C811djHLbQ9eTGDmyBL925w==
Email 4 Thread-Index: AcqvbqMuifoc5OztR7ei1BLNqFSVvw==
Email 5 Thread-Index: AcqvbqfdWWuz4UwLS7arQJX7/XeUvg==

我似乎无法确定如何将这些电子邮件链接在一起。通常,我会使用 in-reply-to 字段或 references 字段,但我最近发现 Blackberrys 不包含这些字段。唯一包含 Thread-Index 字段。

【问题讨论】:

  • 如果您正在寻找如何实现消息线程,这非常有帮助:jwz.org/doc/threading.html
  • 我的经验是使用 .EML,因为它们没有 MSG 那样的 ConversationIndex。我做了大约 20,000 个,如果前 32 个字符匹配,那么它们似乎在同一个电子邮件链中。

标签: email


【解决方案1】:

如果有邮件客户端无法将 Blackberry 的邮件链接到他们的线程,我不会感到惊讶。 Thread-Index 标头似乎是 Microsoft 扩展。

无论哪种方式,Novell Evolution 都实现了这一点。看看this short description 他们是如何做到的,或者看看this piece of code 找到给定消息的线程父级。

我假设,因为您的示例中 Thread-Index 标头的长度都相同,所以这些消息都是线程开始的?奇怪的是它们只有 22 字节,不过我想您可以尝试对它们应用 5-bytes-per-message 规则,看看它是否适合您。

【讨论】:

  • 似乎非 Outlook 电子邮件客户端无法正确处理线程索引。上面的线程索引来自雷鸟。我检查了outlook,它遵循你所说的规则。很麻烦。
  • 通过查看一堆 Outlook 生成的 Thread-Index 标头,我觉得链接的描述有点错误:线程启动器有一个 22 字节解码的 Thread-Index,而不是 27。
  • 这是 Mozilla (Thunderbird) 错误跟踪器中的一个相关错误:bugzilla.mozilla.org/show_bug.cgi?id=331207
【解决方案2】:

this post 及其链接中,对这个非标准“线程索引”标头的使用方式进行了很好的分析,包括this pdf(在 CEAS 2006 会议上发表的一篇论文)和@987654323 @,其中包括来自 evolution 源代码的对该问题的评论(这似乎反映了对这个未记录的标头的大量逆向工程)。

执行摘要:本质上,作者最终放弃了使用这个头文件并推荐并展示了一种不同的方法,它也在c-client库中实现,它是UW IMAP Toolkit开源包的一部分(即仅适用于 IMAP -- 不要被名称欺骗,它也适用于 POP、NNTP、本地邮箱等。

【讨论】:

  • 根据我的博客文章中留下的较新的comment,您提到 “这是一个 OLE 时间戳(22 个字节),附加了 timediffs(5 个字节)。这很糟糕,因为时间戳不保证唯一。”
  • 此处描述了在 c 客户端中实现的“不同方法”:jwz.org/doc/threading.html
  • 尽管微软至少从 2003 年 (msdn.microsoft.com/en-us/library/ms528174(v=exchg.10).aspx) 就已经记录了这一点,而且很可能比这更早(CDO该库已包含在 NT 4.0 中,其文档可能包含相同的信息)。
  • @poizan42 它可能被记录在案,但它没有回答一个简单的问题:如果我不使用 MS 的技术堆栈,我该如何生成它。
  • @Alex,你为什么要这么做?只需使用标准化的 References 和 In-Reply-To 标头即可。无论如何,确切的二进制格式记录在msdn.microsoft.com/en-us/library/ee202481(v=exchg.80).aspx,所以只需填写?
【解决方案3】:

它们是 base64 编码的对话索引值。无需对它们进行逆向工程,因为它们由 Microsoft 记录在例如http://msdn.microsoft.com/en-us/library/ms528174(v=exchg.10).aspxhttp://msdn.microsoft.com/en-us/library/ee202481(v=exchg.80).aspx 的更多详细信息

您示例中的索引似乎不代表相同的对话,这可能意味着发送邮件的软件无法将它们链接在一起。

编辑:不幸的是,我没有足够的声誉来添加评论,但adamo 是正确的,它包含一个时间戳——一个有点深奥的编码部分文件时间。但它也包含一个 GUID,因此几乎可以保证该邮件是唯一的(当然,同一封邮件可以存在多个副本)。

【讨论】:

  • 对话索引是 OutLook (MAPI)。 Outlook Express 不存在。至少我找不到它。
【解决方案4】:

如果您有兴趣在 C# 中解析 Thread-Index,请查看这篇文章

http://forum.rebex.net/questions/3841/how-to-interprete-thread-index-header

您将在那里找到的 sn-p 将让您解析 Thread-Index 并检索 Thread GUID 和消息 DateTime。但是有一个问题,它不适用于所有线程索引。问题是为什么某些线程索引会生成无效的 DateTime 以及如何支持所有这些?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2015-03-16
    • 2019-04-30
    相关资源
    最近更新 更多