2009-03-31 6 views
8

Hat jemand ein gutes Beispiel für die Verwendung der HeaderParser-Klasse in Python für eine Nachricht, die Sie mit imaplib.fetch herunterziehen?Verwendung von email.HeaderParser mit imaplib.fetch in Python?

Ich konnte viele verwandte Dinge finden, aber nichts, was nur das tut.

Muss ich den RFC822 vollständig herunterholen? Ich hatte gehofft, die Themen einfach herunterzuziehen.

Danke!

Antwort

18

Gute Nachrichten: Sie haben Recht ... Sie müssen nicht den RFC822 herunterziehen. Der message_parts Parameter zu fetch() lässt Sie ziemlich feinkörnig werden.

Hier ist ein einfaches Beispiel, wie einfach die Header zu holen:

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

Die vollständige Liste der Nachrichtenteile, die als zweites Argument an fetch weitergegeben werden kann, ist in der IMAP4-Spezifikation: http://tools.ietf.org/html/rfc1730#section-6.4.5

+1

In In meinem Fall musste ich 'header_data = data [0] [1] .decode ('utf-8')' machen. Hoffe, das hilft jemandem. –

+0

@AndreiStalbe Ja, das ist notwendig mit Python 3, da 'IMAP.fetch()' Bytezeichenfolgen zurückgibt und 'HeaderParser.parsestr()' eine Zeichenfolge erwartet. –

+0

@AndreiStalbe, oh, ok, ich habe gerade eine halbe Stunde damit verbracht, das herauszufinden. Ich muss die Kommentare in Zukunft lesen! Übrigens ist 'utf-8' die Standardcodierung, also muss das nicht angegeben werden. – mihai