大家好。在上一篇文章中,我们学习了如何在代码操作之前对自己的邮箱进行一些基本的配置,也学习了通过yagmail发送邮件。本文将介绍两个非常实用的接收和阅读邮件的库:imbox和poplib。主要会讲解:《imbox接收邮件poplib接收邮件和keyring存储密码》,我们在上一篇文章中也提到过需要开启基础配置,POP3/SMTP/IMAP对于不同的邮箱有不同的操作,使用网易163邮箱和QQ邮箱为例进行说明,不熟悉的可以查看Python发送邮件的基本代码讲解,确认配置后可以继续阅读今天的文章。1.poplib库poplib模块提供poplib.POP3和poplib.POP3_SSL两个类,分别用于连接普通POP服务器和基于SSL的POP服务器,连接到服务器后,按照POP3协议与服务器进行交互。注:虽然POP3被广泛使用受支持,但已过时。POP3服务器实现的质量差异很大,而且很多都很差。后面会介绍基于IMAP服务器的imbox库。下面将以QQ邮箱为例,演示如何完整使用poplib库。',995)2.登录服务器时注意输入邮箱授权码,不要输入真实QQ密码真实QQ密码3.获取邮件列表响应,maillist,r=conn.list()print('response:',response)print('mailinglist:',maillist)4.遍历邮件multipart表示邮件内容的容器,不需要处理msg=email.parser.BytesParser(policy=email.policy.default)。parsebytes(data)forpartinmsg.walk():#multipart表示邮件内容的容器,不用处理ifpart.get_content_type().split("/",1)[0]=='multipart':continueelifpart.get_content_type().split("/",1)[0]=='text':print(part.get_content())else:filename=part.get_filename()print(filename)withopen(filename,'wb')asf:f.write(part.get_payload(decode=True))多级判断的目的主要是跳过容器,输出文本,本地下载附件5,退出服务器conn.quit的一些常用代码()有点麻烦,but整体还是比较容易理解的。2.imbox库在正式介绍imbox库之前,我先分享一个技巧。从上面的poplib代码也可以看出,在输入密码(授权码)的时候,在代码中是明文显示的,这就带来了风险:如果不小心把这段代码未经处理就发给了别人,或者上传了github,那么任何人得到这段代码都可以操纵你的邮箱。这是一件可怕的事情。这里用来读邮件的模块imbox也和poplib一样需要password这个参数,但是我不想在代码中使用。明文显示密码怎么办?”解决办法是使用keyring库通过系统keyring提前将密码(授权码)存储在本地,然后在代码中调用keyring库的方法通过账号作为变量找回密码就可以了,这样即使别人有所有的密码,但是他本地没有预先配置的密码,也不会有信息泄露的风险。具体使用方法如下:首先打开命令行输入:importkeyringkeyring.set_password("qqmail","username","password")这样密码就保存在本地了,只需要获取keyring.get_password后面作为变量:importkeyringpassword=keyring.get_password('qqmail','username')用imbox读取邮件的代码如下:importkeyringfromimboximportImboxpassword=keyring.get_password('qqmail','username')withImbox('imap.qq.com','xxx@qq.com',password,ssl=True)asimbox:#获取所有邮件all_inbox_messages=imbox.messages()foruid,messageinall_inbox_messages:print(message.subject)#mailsubjectprint(message.body['plain'])#mailtextformattextImbox('imap.qq.com','xxx@qq.com',password,ssl=True)这行代码需要填写服务器,用户名,email,password,SSL加密循环体中的uid参数是每个emailNumber的ID,邮件编号很重要,可以用来标记和删除邮件。除了邮件主题和文本格式之外,我们主要常见的获取以下内容:除了获取all_inbox_messages=imbox.messages()的所有邮件外,我们还经常选择性的获取已读、未读、红旗邮件:unread_inbox_messages=imbox.messages(unread=True)#未读邮件read_inbox_messages=imbox.messages(unread=False)#已读邮件flagged_inbox_messages=imbox.messages(flagged=True)#红旗标记邮件也可以通过邮件接收时间:inbox_message_before获取=imbox.messages(date__lt=datetime.date(2021,1,18))inbox_message_after=imbox.messages(date__gt=datetime.date(2021,1,18))inbox_message_on_date=imbox.messages(date__on=datetime.date(2021,1,18))那么如何过滤指定发件人发送的邮件呢?答案在于对message.sent_from的理解。message.sent_from是一个字典元组。在遍历的过程中,只需要简单的通过message.sent_from[0]['email']提取发件人的邮箱地址,然后进行判断即可达到目的:withImbox('imap.qq.com','xxx@qq.com',password,ssl=True)asimbox:all_inbox_messages=imbox.messages()foruid,messageinall_inbox_messages:print(message.subject)print(message.sent_from)print(message.body['plain'])#提取邮箱email=message.sent_from[0]['email']ifemail==特定邮箱:pass邮件号uid的重要性上面也有讲到。基于数字的两个重要方法:markreadimbox.mark_seen(uid)deletemailimbox.delete(uid)》以删除邮件为例:foruid,messageinall_inbox_messages:如果邮件满足一定条件:imbox.delete(uid)以上就是基于POP3的poplib和基于IMAP的imbox接收邮件的常用操作!以后会更新更多基于邮件的自动化办公系列文章!
