以下所有内容都是基于Python 2
主要内容:imaplib 查看未读邮件
email 下载邮件附件
啰嗦在前面:
python 邮件查收功能相关的模块有poplib和imaplib。分别支持POP3协议和IMAP协议。poplib更简单,支持更稳定,但是功能没有imaplib完善。没有用poplib是因为,poplib查看未读邮件更复杂一点点 ,imaplib里面有seach()方法可以通过UnSeen标签轻松获得未读邮件^ ^。
1.imaplib接收邮件
首先代码下。
imaplib模块有三个类:IMAP4 , IMAP2_SSL 和IMAP_stream,本次使用 IMAP2_SSL。
在IMAP协议中,邮件有两种标识符。一种是该封邮件在其所在文件夹里的序列号,从1到N。文件夹清空时会改变。
另一种是Unique Idengifiers(UIDs),UIDs是IMAP服务器分配给每一封邮件的,它会在不同session中保持不变。文件夹清空时仍保持不变。
IMAP4.select([mailbox[, readonly]])¶
首先选一个mailbox,默认的是'INBOX'。如果设置readonly , 表示不可对邮箱内邮件信息做更改。当你想要把读过的邮件设置为已读,此处需设置readonly = False。图片的代码没有改参数,默认是True。
IMAP4.search(charset,criterion[,..])
该方法返回值是一个tuple。像酱紫 ('OK', ['196 198 199']) ,对我们有用的是1位的list,数字就是邮件的UIDs。利用该UIDs我们可以对特定的邮件进行操作。
IMAP4.fetch(message_set, message_parts)¶
获取邮件,返回值是邮件的信封和数据的元组,颇为复杂,可以自行print,慢慢理解。
截至到这里,已经获得了邮件信息,第一个图片的最后一行调用的是email模块。
邮件信息的解析共用到email的两个类:email.parser 和 email.message
首先,msg = email.message_from_string(content) 使用的实为email模块中的email.parser类
导入方法:from email.parser import Parser
可以作为email.parser实例的邮件信息对象有两类:str 和 fp
解析后的返回值同样有两种类型:MIME doc 或 包含邮件文本的字符串
(具体返回类型要看邮件是否是multi-part,即is_multipart是True,则为MIME doc;is_multipart是False 返回的是字符串。)
两种包含邮件信息对象的解析方法分别为:parsestr(text[, headersonly])¶
parse(fp[, headersonly])¶
此外,提供两种便捷方式:email.message_from_string(s[, _class[, strict]])¶ 与Parser().parsestr(s)作用相同。
(第一张图片中语句:msg = email.message_from_string(content) 等同于Parser().parsestr(content))email.message_from_file(fp[, _class[, strict]])¶ 与Parser().parse(fp)效果相同。
其次,其他的均为 email.message类
导入方法:from email.message import Message
概念上,邮件对象由headers和payloads组成。headers是RFC 2822样式字段名称和值,其中字段名称和值由冒号分隔。冒号不是字段名称或字段值的一部分。
标题被保存在表单中,匹配时不区分大小写。简单的邮件对象,payload是一个字符串。非简单邮件,payload也是MIME容器文档的Message对象列表(例如multipart / *和message / rfc822)。
下面是用到的Message 类的方法:
is_multipart()¶
如果邮件的payload是sub-message对象的列表,则返回True,否则返回False。当is_multipart()返回False时,payload是一个字符串对象。
get_payload([i[, decode]])¶
返回当前payload,当is_multipart()为True时,它将是Message对象的列表,或当is_multipart()为False时返回一个字符串。