前言
之前老是用Python发邮件,用起来挺方便的。但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊。所以写个脚本来做下定时任务,一旦有相关的主题邮件,结合GUI控件,声音组件,给出提醒。
想来还是不错的。
封装好的客户端源码放到了我的GitHub上,有兴趣的可以下载下来试一试。
先来看下效果吧
收邮件其实是被Python内置支持的,名为poplib。安装了Python的话,就会默认存在于标准库中,用起来也很方便。下面就一步步的来实现今天的任务吧。
准备
由于要使用非官方客户端的方式来收取邮件,所以需要打开相应的服务。我本人使用的邮箱是163邮箱,其他的邮箱操作也是类似的。如下:
点击设置
开启pop/smtp/imap协议
先发一封邮件
给目标邮箱发一封邮件吧。我的内容如下:
至此,准备阶段就算是完成了。
初体验
初体验嘛,肯定是会比较简单的了。比如下面我先获取一些常用的信息:
# coding: utf8
import poplib
# 邮箱个人信息
useraccount = '你的邮箱'
password = '你的密码(注意这个密码是授权码,不是你客户端直接登录用的密码)'
# 邮件服务器地址。如果你的邮箱是163,那么可以这么写。qq的话就是pop.qq.com
pop3_server = 'pop.163.com'
# 开始连接到服务器
server = poplib.POP3(pop3_server)
# 可选项: 打开或者关闭调试信息,1为打开,会在控制台打印客户端与服务器的交互信息
server.set_debuglevel(1)
# 可选项: 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器
print(server.getwelcome().decode('utf8'))
# 开始进行身份验证
server.user(useraccount)
server.pass_(password)
# 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可
print("Mail counts: {0}, Storage Size: {0}".format(server.stat()))
# 使用list()返回所有邮件的编号,默认为字节类型的串
resp, mails, octets = server.list()
print("响应信息: ", resp)
print("所有邮件简要信息: ", mails)
print("list方法返回数据大小(字节): ", octets)
# 关闭与服务器的连接,释放资源
server.close()
运行结果呢?如下:
+OK Welcome to coremail Mail Pop3 Server (163coms[726cd87d72d896a1ac393507346040fas])
*cmd* 'USER 我的邮箱账号'
*cmd* 'PASS 哈哈不给你看'
*cmd* 'STAT'
*stat* [b'+OK', b'9', b'52140']
Mail counts: (9, 52140), Storage Size: (9, 52140)
*cmd* 'LIST'
响应信息: b'+OK 9 52140'
所有邮件简要信息: [b'1 1595', b'2 1631', b'3 1568', b'4 26710', b'5 2851', b'6 6856', b'7 1494', b'8 6685', b'9 2750']
list方法返回数据大小(字节): 73
试水
经过刚才的初体验,想必已经会和邮件服务器互动了吧。下面正式开始获取邮件。
比如我想获取邮件服务器上其中一封邮件,那么指定一下索引就可以了。
划水
# coding: utf8
import poplib
from email.parser import Parser
import base64
def get_parsed_msg():
# 邮箱个人信息
useraccount = '我的邮箱账号'
password = '密码不告诉你'
# 邮件服务器地址
pop3_server = 'pop.163.com'
# 开始连接到服务器
server = poplib.POP3(pop3_server)
# 可选项: 打开或者关闭调试信息,1为打开,会在控制台打印客户端与服务器的交互信息
server.set_debuglevel(1)
# 可选项: 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器
print(server.getwelcome().decode('utf8'))
# 开始进行身份验证
server.user(useraccount)
server.pass_(password)
# 使用list()返回所有邮件的编号,默认为字节类型的串
resp, mails, octets = server.list()
print('邮件总数: {}'.format(len(mails)))
# 下面单纯获取最新的一封邮件
total_mail_numbers = len(mails)
# 默认下标越大,邮件越新,所以total_mail_numbers代表最新的那封邮件
response_status, mail_message_lines, octets = server.retr(total_mail_numbers)
print('邮件获取状态: {}'.format(response_status))
print('原始邮件数据:\n{}'.format(mail_message_lines))
print('该封邮件所占字节大小: {}'.format(oc