用 Python 解析 Thread-Index 邮件头

Posted

技术标签:

【中文标题】用 Python 解析 Thread-Index 邮件头【英文标题】:Parsing Thread-Index Mail Header with Python 【发布时间】:2015-02-07 01:23:21 【问题描述】:

某些邮件客户端,不要设置References 标头,而是设置Thread-Index

有没有办法在 Python 中解析这个标头?

相关:How does the email header field 'thread-index' work?

邮件 1

Date: Tue, 2 Dec 2014 08:21:00 +0000
Thread-Index: AdAOBz5QJ/JuQSJMQTmSQ8+dVs2IDg==

邮件 2(与邮件 1 相关)

Date: Mon, 8 Dec 2014 13:12:13 +0000
Thread-Index: AdAOBz5QJ/JuQSJMQTmSQ8+dVs2IDgE4StZw

更新

我希望能够在我的应用程序中链接这两个邮件。它已经非常适合众所周知的 ReferencesIn-Reply-To 标头。

【问题讨论】:

你到底想用 Thread-Index 做什么?您要检索什么样的信息?似乎没有 python 包来解析这个头文件,你必须实现一些适合你需要的东西。 This post 作为使用 python 解析此标头的第一个指南可能很有用。如果您指定您的需求,也许我可以提供帮助。祝你好运! @maccinza 我更新了问题:我希望能够在我的应用程序中链接这两个邮件。它已经非常适用于众所周知的 References 和 In-Reply-To 标头。 【参考方案1】:

使用信息here,我能够将以下内容放在一起:

import struct, datetime

def parse_thread_index(index):

    s = index.decode('base64')

    guid = struct.unpack('>IHHQ', s[6:22])
    guid = '%08X-%04X-%04X-%04X-%12X' % (guid[0], guid[1], guid[2], (guid[3] >> 48) & 0xFFFF, guid[3] & 0xFFFFFFFFFFFF)

    f = struct.unpack('>Q', s[:6] + '\0\0')[0]
    ts = [datetime.datetime(1601, 1, 1) + datetime.timedelta(microseconds=f//10)]

    for n in range(22, len(s), 5):
        f = struct.unpack('>I', s[n:n+4])[0]
        ts.append(ts[-1] + datetime.timedelta(microseconds=(f<<18)//10))

    return guid, ts

给定一个线程索引,它返回一个元组(guid, [list of dates])。对于您的测试数据,结果是:

 > parse_thread_index('AdAOBz5QJ/JuQSJMQTmSQ8+dVs2IDgE4StZw')
('27F26E41-224C-4139-9243-CF9D56CD880E', [datetime.datetime(2014, 12, 2, 8, 9, 6, 673459), datetime.datetime(2014, 12, 8, 13, 11, 0, 807475)])

我手头没有足够的测试数据,所以这段代码可能有问题。请随时告诉我。

【讨论】:

非常感谢。工作正常! 'kp4o6SAzO6Xc19R5OPjnmqbg6v2utA==' 失败:OverflowError:日期值超出范围 @guettli:这看起来不像是一个有效的标头(第一个字节必须是 1)。 我找到了解决这个问题的另一种方法,我认为它比你的更具可读性。但目前,您的解决方案在生产几年后就可以正常工作,没有任何问题。因此,如果其他人或我自己在将来的任何时候需要备份解决方案,这仅供参考。 [technical.nttsecurity.com/post/102enx6/…你可以在链接页面的底部找到代码。

以上是关于用 Python 解析 Thread-Index 邮件头的主要内容,如果未能解决你的问题,请参考以下文章

用python编写一个快速解析器

怎样用python解析二维码?

用Python解析RSS

用 JACKSON 解析 python dicts

用 PLY 解析 python,如何编码缩进和缩进部分

c#生成的Json如何用python解析