2014-12-09 13 views
9

Alcuni client di posta, non impostare le intestazioni References, ma Thread-Index.Analisi delle intestazioni di indice dei thread con Python

C'è un modo per analizzare questa intestazione in Python?

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

posta 1

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

Mail 2 (che è legato al Invia ad 1)

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

Aggiornamento

voglio essere in grado di collega queste due mail nella mia app blicazione. Funziona perfettamente anche per le ben note intestazioni References e In-Reply-To.

+0

Che cosa stai cercando di fare con Thread-Index? Che tipo di informazioni stai cercando di recuperare? Sembra che non ci sia un pacchetto Python per analizzare questa intestazione e dovrai implementare qualcosa che si adatti alle tue esigenze. [Questo post] (http://www.solutionary.com/resource-center/blog/2014/04/thread-index-value-analysis/) può essere utile come prima guida sull'analisi di questa intestazione usando python. Se si specifica quali sono le vostre esigenze, forse potrei aiutare. In bocca al lupo! – maccinza

+0

@maccinza Ho aggiornato la domanda: voglio essere in grado di collegare queste due mail nella mia applicazione. Funziona già perfettamente per le famose intestazioni References e In-Reply-To. – guettli

risposta

9

utilizzando le informazioni here, sono stato in grado di mettere insieme le seguenti:

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 

Dato un indice di thread, restituisce una tupla (guid, [list of dates]). Per i vostri dati di test, il risultato è:

> 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)]) 

Non ho i dati di prova sufficienti a portata di mano, in modo da questo codice potrebbe essere buggy. Sentiti libero di farmelo sapere

+0

Grazie mille. Funziona bene! – guettli

+0

Errore per 'kp4o6SAzO6Xc19R5OPjnmqbg6v2utA ==': OverflowError: valore di data nell'intervallo – guettli

+0

@guettli: non sembra un'intestazione valida (il primo byte deve essere '1'). – georg