2009-03-31 13 views
8

Qualcuno ha un buon esempio di usare la classe HeaderParser in Python per un messaggio che si apre con imaplib.fetch?Utilizzo di email.HeaderParser con imaplib.fetch in python?

Sono stato in grado di trovare molte cose correlate, ma nulla che faccia proprio questo.

È necessario eseguire il down down del recupero tramite RFC822? Speravo semplicemente di abbattere i soggetti.

Grazie!

risposta

18

Buone notizie: hai ragione ... non è necessario abbassare l'RFC822. Il parametro message_parts su fetch() consente di ottenere una grana piuttosto fine.

Ecco un semplice esempio di come recuperare solo l'intestazione:

import imaplib 
from email.parser import HeaderParser 

conn = imaplib.IMAP4('my.host.com') 
conn.login('[email protected]', 'mypassword') 
conn.select() 
conn.search(None, 'ALL') # returns a nice list of messages... 
         # let's say I pick #1 from this 

data = conn.fetch(1, '(BODY[HEADER])') 

# gloss over data structure of return... I assume you know these 
# gives something like: 
# ('OK', [(1 (BODY[HEADER] {1662', 'Received: etc....')]) 
header_data = data[1][0][1] 

parser = HeaderParser() 
msg = parser.parsestr(header_data) 
<email.message.Message instance at 0x2a> 

print msg.keys() 
['Received', 'Received', 'Received', 'Cc', 'Message-Id', 'From', 'To', 
'In-Reply-To', 'Content-Type', 'Content-Transfer-Encoding', 'Mime-Version', 
'Subject', 'Date', 'References', 'X-Mailer', 
'X-yoursite-MailScanner-Information', 
'X-yoursite-MailScanner', 'X-yoursite-MailScanner-From', 'Return-Path', 
'X-OriginalArrivalTime'] 

L'elenco completo delle parti del messaggio che possono essere passati come secondo argomento al fetch è nelle specifiche IMAP4: http://tools.ietf.org/html/rfc1730#section-6.4.5

+1

In il mio caso ho dovuto fare 'header_data = data [0] [1] .decode ('utf-8')'. Spero che questo aiuti qualcuno. –

+0

@AndreiStalbe Sì, è necessario con Python 3, poiché 'IMAP.fetch()' restituisce stringhe di byte e 'HeaderParser.parsestr()' si aspetta una stringa. –

+0

@AndreiStalbe, oh, ok, ho appena passato mezz'ora a capirlo. Devo leggere i commenti in futuro! Btw, 'utf-8' è la codifica predefinita, quindi non è necessario specificarlo. – mihai