在Python中使用email.HeaderParser与imaplib.fetch?

11 投票
1 回答
14621 浏览
提问于 2025-04-15 11:04

有没有人能给个好例子,说明怎么在Python中使用HeaderParser类,特别是针对用imaplib.fetch拉取下来的消息?

我找到很多相关的内容,但没有一个是专门讲这个的。

我需要把fetch的内容完整下载成RFC822格式吗?我其实只是想简单地获取邮件的主题。

谢谢!

1 个回答

19

好消息:你说得对……你不需要下载RFC822。fetch()函数中的message_parts参数可以让你选择得非常细致。

这里有个简单的例子,教你怎么只获取邮件的头部信息:

import imaplib
from email.parser import HeaderParser

conn = imaplib.IMAP4('my.host.com')
conn.login('my@username.com', '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']

可以作为fetch第二个参数传入的所有邮件部分的完整列表,可以在IMAP4规范中找到:https://www.rfc-editor.org/rfc/rfc1730#section-6.4.5

撰写回答