使用Python解析线程索引邮件头

gue*_*tli 10 python email-headers

有些邮件客户端,不要设置References标题,但是Thread-Index.

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

相关:电子邮件头字段'thread-index'如何工作?

邮件1

Date: Tue, 2 Dec 2014 08:21:00 +0000
Thread-Index: AdAOBz5QJ/JuQSJMQTmSQ8+dVs2IDg==
Run Code Online (Sandbox Code Playgroud)

邮件2(与邮件1相关)

Date: Mon, 8 Dec 2014 13:12:13 +0000
Thread-Index: AdAOBz5QJ/JuQSJMQTmSQ8+dVs2IDgE4StZw
Run Code Online (Sandbox Code Playgroud)

更新

我希望能够在我的应用程序中链接这两个邮件.它已经完全适用于众所周知的References和In-Reply-To头.

geo*_*org 9

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

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
Run Code Online (Sandbox Code Playgroud)

给定一个线程索引,它返回一个元组(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)])
Run Code Online (Sandbox Code Playgroud)

我手边没有足够的测试数据,因此这段代码可能有问题.请随时告诉我.