2014-12-09 2 views
9

Некоторые почтовые клиенты не устанавливают заголовки References, но Thread-Index.Разбор заголовка заголовка строки с Python

Есть ли способ разобрать этот заголовок в 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 

Update

Я хочу, чтобы иметь возможность связать эти две письма в моем приложении заревой. Он уже отлично работает для хорошо известных заголовков References и In-Reply-To.

+0

Что именно вы пытаетесь сделать с помощью Thread-Index? Какую информацию вы пытаетесь получить? Кажется, что нет пакета python для синтаксического анализа этого заголовка, и вам нужно будет реализовать то, что соответствует вашим потребностям. [Это сообщение] (http://www.solutionary.com/resource-center/blog/2014/04/thread-index-value-analysis/) может быть полезным в качестве первого руководства по разбору этого заголовка с использованием python. Если вы укажете, в чем ваши потребности, может быть, я могу помочь. Удачи! – maccinza

+0

@maccinza Я обновил вопрос: я хочу уметь связывать эти две письма в своем приложении. Он уже отлично работает для известных ссылок и заголовков In-Reply-To. – guettli

ответ

9

Используя данные 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)]) 

У меня нет достаточного количества тестовых данных под рукой, так что этот код может быть ошибка. Не стесняйтесь, дайте мне знать.

+0

Большое спасибо. Работает отлично! – guettli

+0

Ошибка для 'kp4o6SAzO6Xc19R5OPjnmqbg6v2utA ==': OverflowError: значение даты вне диапазона – guettli

+0

@guettli: это не похоже на допустимый заголовок (первый байт должен быть '1'). – georg

Смежные вопросы