2009-03-31 27 views
8

Có ai có một ví dụ điển hình về việc sử dụng lớp HeaderParser trong Python cho một thông điệp mà bạn kéo xuống bằng imaplib.fetch không?Sử dụng email.HeaderParser với imaplib.fetch trong python?

Tôi đã có thể tìm thấy rất nhiều thứ liên quan, nhưng không có gì thực hiện điều này.

Tôi có cần phải nạp toàn bộ lần tìm nạp có RFC822 không? Tôi đã hy vọng chỉ đơn giản là kéo xuống các đối tượng.

Cảm ơn!

Trả lời

18

Tin tốt: bạn nói đúng ... bạn không cần phải kéo xuống RFC822. Thông số message_parts đến fetch() cho phép bạn khá chi tiết.

Dưới đây là một ví dụ đơn giản về cách để lấy chỉ tiêu đề:

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

Danh sách đầy đủ của các bộ phận thông điệp mà có thể được thông qua như là đối số thứ hai để fetch là trong spec IMAP4: http://tools.ietf.org/html/rfc1730#section-6.4.5

+1

Trong trường hợp của tôi, tôi đã phải làm 'header_data = data [0] [1] .decode ('utf-8')'. Hy vọng điều này sẽ giúp một ai đó. –

+0

@AndreiStalbe Vâng, đó là điều cần thiết với Python 3, vì 'IMAP.fetch()' trả về các chuỗi byte và 'HeaderParser.parsestr()' mong đợi một chuỗi. –

+0

@AndreiStalbe, oh, ok, tôi đã dành nửa giờ để tìm hiểu điều đó. Tôi phải đọc những bình luận trong tương lai! Btw, 'utf-8' là mã hóa mặc định, vì vậy không cần phải xác định điều đó. – mihai

Các vấn đề liên quan