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
Nguồn
2009-03-31 23:27:07
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 đó. –
@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. –
@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