python⾃动读取邮件_Python⾃动化读取邮件基础代码讲解⼤家好,在之前的⽂章中我们已经了解如何对⾃⼰的邮箱做⼀些代码操作前的基础配置,也学会了通过 yagmail 发送邮件。这篇⽂章将分别介绍两个很实⽤的收取及读取邮件的库:imbox 和 poplib,主要将讲解:
imbox 收取邮件
poplib 收取邮件
keyring 存储密码
之前的⽂章中我们也提到了,基础配置需要打开 POP3/SMTP/IMAP,针对不同邮箱有不同的操作,并以⽹易 163 邮箱和 QQ 邮箱 举例说明,如果你不熟悉,可以查看 Python发送邮件基础代码讲解
确定配置好了之后就可以继续阅读今天的⽂章!
⼀、poplib库
poplib 模块提供了 poplib.POP3 和 poplib.POP3_SSL 两个类,分别⽤于连接普通的 POP 服务器和基于 SSL 的 POP 服务器。连接到服务器后,按照 POP3 协议与服务器交互。
注意:虽然 POP3 得到了⼴泛⽀持,但已过时。POP3 服务器的实现质量差异很⼤,⽽且太多的服务器都很差。后⾯会介绍基于 IMAP 服务器的 imbox 库
下⾯以 QQ 邮箱为例⽰范如何完整 poplib 库的使⽤
1、创建连接
使⽤poplib.POP3_SSL创建连接
import poplib
import email.parser, email.policy
conn = poplib.POP3_SSL('pop.qq', 995)
2、登录服务器
注意输⼊的是邮箱授权码⽽不是真实 QQ 密码
conn.user('xxxx@qq')
conn.pass_('xxxx') # 注意输⼊的是邮箱授权码⽽不是真实 QQ 密码
3、获取邮件列表
response, maillist, r = conn.list()
print('响应:', response)
print('邮件列表:', maillist)
4、遍历邮件
multipart 代表邮件内容的容器,⽆需处理
msg = email.parser.BytesParser(policy=email.policy.default).parsebytes(data)
for part in msg.walk():
# multipart 代表邮件内容的容器,⽆需处理
_content_type().split("/", 1)[0] == 'multipart':
continue
_content_type().split("/", 1)[0] == 'text':
_content())
else:
filename = _filename()
print(filename)
with open(filename, 'wb') as f:
f._payload(decode=True))
多级判断的⽬的主要是跳过容器、输出正⽂、下载附件的本地
5、退出服务器
conn.quit()
常⽤的代码中有部分稍微繁琐,但整体还是⽐较好理解的
⼆ 、imbox库
在正式介绍 imbox 库之前,再分享⼀个技巧。从上⾯ poplib 的代码中也可以看到,当输⼊密码(授权码)的时候是在代码中明⽂显⽰,这就带来了风险:
假如你不⼩⼼把这个代码没有处理就发给别⼈,或者上传的 github,那么所有拿到这段代码的⼈都可以对你的邮箱⼤肆操作,这是很可怕的事情
这⾥读取邮件⽤的模块 imbox 也和 poplib ⼀样需要密码这个参数,但不希望在代码中明⽂呈现密码,怎么办?
”解决办法是利⽤ keyring 库,通过系统密钥环将密码(授权码),预先在本地存储好,后⾯在代码中调⽤ keyring 库的⽅法,通过账号把密码取出来作为变量就可以。
这样即使别⼈拿到了全部代码,但他的本地中没有预先配置好密码,就不会有泄露信息的风险了。具体使⽤⽅法为,⾸先打开命令⾏输⼊:
import keyring
keyring.set_password("qqmail", "username", "password")
这样 password 在本地存储好了,后⾯只需要 _password 获取作为变量即可:
import keyring
password = _password('qqmail', 'username')
⽤ imbox 读取邮件的代码如下:
import keyring
qq怎么发邮件from imbox import Imbox
password = _password('qqmail', 'username')
with Imbox('imap.qq', 'xxx@qq', password, ssl=True) as imbox:
# 获取全部邮件
all_inbox_messages = ssages()
for uid, message in all_inbox_messages:
print(message.subject)  # 邮件主题
print(message.body['plain']) # 邮件⽂本格式正⽂
Imbox(‘imap.qq’, ‘xxx@qq’, password, ssl=True) 这⾏代码中需要填写服务器、⽤户名邮箱、密码、SSL加密循环体中 uid 参数是每封邮件的编号,邮件编号⼗分重要,可以⽤于邮件的标记和删除。除了邮件主题及⽂本格式正⽂外,我们主要常⽤获取以下内容:
除了获取全部邮件⽤ all_inbox_messages = ssages() 外,我们常常会有选择性获取已读、未读和红旗标记邮件:
unread_inbox_messages = ssages(unread=True) # 未读邮件
read_inbox_messages = ssages(unread=False) # 已读邮件
flagged_inbox_messages = ssages(flagged=True) # 红旗标记邮件
也可以通过邮件的收件时间获取邮件:
inbox_message_before = ssages(date__lt=datetime.date(2021, 1, 18))
inbox_message_after = ssages(date__gt=datetime.date(2021, 1, 18))
inbox_message_on_date = ssages(date__on=datetime.date(2021, 1, 18))
那么如何筛选指定发件⼈发送的邮件呢?答案就在于对 message.sent_from 的理解了。message.sent_from 是⼀个字典元组,在遍历的过程中只需要简单通过 message.sent_from[0][’email’] 就能够将发件⼈邮箱提取出来,接着做判断就能够达到⽬的:
with Imbox('imap.qq', 'xxx@qq', password, ssl=True) as imbox:
all_inbox_messages = ssages()
for uid, message in all_inbox_messages:
print(message.subject)
print(message.sent_from)
print(message.body['plain'])
# 把邮箱提取出来
email = message.sent_from[0]['email']
if email == 某个特定的邮箱:
pass
上⽂还提到了邮件编号 uid 的重要性。基于编号的两个重要⽅法:
标记已读 imbox.mark_seen(uid)
删除邮件 imbox.delete(uid)
”使⽤以删除邮件为例:
for uid, message in all_inbox_messages:
if 满⾜某种条件的邮件:
imbox.delete(uid)
以上就是基于 POP3 的 poplib 和基于 IMAP 的 imbox 针对收取邮件的常⽤操作!之后我们将更新更多基于邮件的⾃动化办公系列⽂章!