21-取邮件并标记为已读
18.5.4 取邮件并标记为已读
得到UID的列表后,可以调用 IMAPClient
对象的 fetch()
方法,来获得实际的电子邮件内容。
UID列表是 fetch()
的第一个参数。第二个参数应该是 ['BODY[]']
,它告诉 fetch()
下载UID列表中指定电子邮件的所有正文内容。
让我们继续演示交互式环境的例子:
>>> rawMessages = imapObj.fetch(UIDs, ['BODY[]'])
>>> import pprint
>>> pprint.pprint(rawMessages)
{40040: {'BODY[]': 'Delivered-To: [email protected]\r\n'
'Received: by 10.76.71.167 with SMTP id '
--snip--
'\r\n'
'------=_Part_6000970_707736290.1404819487066--\r\n',
'SEQ': 5430}}
导入 pprint
,将 fetch()
的返回值(保存在变量 rawMessages
中)传入 pprint. pprint()
,“美观地输出”它。你会看到,这个返回值是消息的嵌套字典,其中以UID作为键。每条消息都保存为一个字典,包含两个键: 'BODY[]'
和 'SEQ'
。 'BODY[]'
键映射到电子邮件的实际正文。 'SEQ'
键是序列号,它与UID的作用类似。你可以放心地忽略它。
如你所见,在 'BODY[]'
键中的消息内容是相当难理解的。这种格式称为RFC 822,是专为IMAP服务器读取而设计的。但你并不需要理解RFC 822格式,本章稍后的 pyzmail
模块将替你来理解它。
如果你选择一个文件夹进行搜索,就用 readonly=True
关键字参数来调用 select_ folder()
。这样做可以防止意外删除电子邮件,但这也意味着你用 fetch()
方法获取邮件时,它们不会标记为已读。如果确实希望在获取邮件时将它们标记为已读,就需要将 readonly=False
传入 select_folder()
。如果所选文件夹已处于只读模式,可以用另一个 select_folder()
调用重新选择当前文件夹,这次用 readonly=False
关键字参数:
>>> imapObj.select_folder('INBOX', readonly=False)