01.场景
老板让你调查个情况,你把excel表发出去了,结果反馈回来的邮件有数百之多,如果一个一个的点开保存,肯定要加班了,让 python 来帮忙吧。
02.批量下载
python 提供的 email 包十分好用,功能完备,搞定我们这个需求,小菜一碟。
# 账户信息
email = 'xxx@chinastock.com.cn'
password = 'xxx'
pop3_server = 'mail.xxx.com.cn'
# 连接到POP3服务器,带SSL的:
server = poplib.POP3_SSL(pop3_server)
# 可以打开或关闭调试信息:
server.set_debuglevel(0)
# POP3服务器的欢迎文字:
print(server.getwelcome())
# 身份认证:
server.user(email)
server.pass_(password)
# stat()返回邮件数量和占用空间:
msg_count, msg_size = server.stat()
print('message count:', msg_count)
print('message size:', msg_size, 'bytes')
执行上面的代码,如果连接没有问题,那么应该能看到邮箱中邮件个数和邮件的总大小,单位是字节。
这里先简化处理,不纠结于怎么过滤邮件了,主要考虑把附件下载到本地(收件箱里的全部邮件)。
for i in range(1, msg_count):
resp, byte_lines, octets = server.retr(i)
# 转码
str_lines = []
for x in byte_lines:
str_lines.append(x.decode())
# 拼接邮件内容
msg_content = '\n'.join(str_lines)
# 把邮件内容解析为Message对象
msg = Parser().parsestr(msg_content)
headers = get_email_headers(msg)
attachments = get_email_content(msg, r'E:\py\sendmail\attach')
# 输出
print('subject:', headers['Subject'])
print('from:', headers['From'])
print('to:', headers['To'])
if 'cc' in headers:
print('cc:', headers['Cc'])
print('date:', headers['Date'])
print('attachments: ', attachments)
print('-----------------------------')
retr() 的参数是个数字,可看成是编号,我们总共有 msg_