得到 UID 的列表后,可以调用 IMAPClient 对象的 fetch()方法,获得实际的电
子邮件内容。
UID 列表是 fetch()的第一个参数。第二个参数应该是['BODY[]'],它告诉 fetch()
下载UID 列表中指定电子邮件的所有正文内容。
使用 IMAPClient 的 gmail_search()方法
如果登录到 imap.gmail.com 服务器来访问 Gmail 账户,IMAPClient 对象提供了一个额外的搜索函数,模拟 Gmail 网页顶部的搜索栏,如图 16-1 中高亮的部分所示。
除了用 IMAP 搜索键搜索,可以使用 Gmail 更先进的搜索引擎。Gmail 在匹配密切相关的单词方面做得很好(例如,搜索 driving 也会匹配drive 和
drove),并按照匹配的程度对搜索结果排序。也可以使用Gmail 的高级搜索操作符(更多信息请参见 http://nostarch.com/automatestuff/ )。如果登录到 Gmail
账户,向 gmail_search()方法传入搜索条件,而不是 search()方法,就像下面交互式环境的例子:
>>> UIDs = imapObj.gmail_search('meaning of life')
>>> UIDs
[42]
啊,是的,那封电子邮件包含了生命的意义!我一直在期待。
让我们继续交互式环境的例子。
>>> rawMessages = imapObj.fetch(UIDs, ['BODY[]'])
>>> import pprint
>>> pprint.pprint(rawMessages)
{40040: {'BODY[]': 'Delivered-To: my_email_address@gmail.com\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[]'键中的消息内容是相当难理解的。这种格式称为 RFC822,是专为 IMAP 服务器读取而设计的。但你并不需要理解 RFC 822 格式,本章稍后的 pyzmail
模块将替你来理解它。
如果你选择一个文件夹进行搜索,就用 readonly=True 关键字参数来调用 select_ folder()。这样做可以防止意外删除电子邮件,但这也意味着你用
fetch()方法获取邮件时,它们不会标记为已读。如果确实希望在获取邮件时将它们标记已读,就需要将 readonly=False 传入
select_folder()。如果所选文件夹已处于只读模式,可以用另一个 select_folder()调用重新选择当前文件夹,这次用 readonly=False 关键字参数:
>>> imapObj.select_folder('INBOX', readonly=False)