获取邮件主要有两种方式,一种是通过pop3,一种是通过imap。pop3协议相对来说简单,本章先讲如何用pop3收取邮件。 pop3全称是Post Office Protocol - Version 3,即pop协议的第三个版本。提供了SSL加密的POP3协议被称为POP3S。典型的通信过程如下:
- 用户启动客户端
- 客户端与邮件服务器建立TCP连接,默认端口是110
- 客户端向邮件服务器发送POP操作命令,如查询。具体的命令见后文
- 邮件服务器解析命令并执行相应操作,最后返回结果给客户端
- 客户端收到邮件服务器返回的结果并解析成用户可以阅读的形式
命令 | 描述 |
USER | 用户名 |
PASS | 用户密码 |
APOP | MD5消息摘要 |
STAT | 请求邮箱的统计数据,如邮件总数 |
UIDL | 返回邮件的唯一标识符 |
LIST | 返回邮件数量和每个邮件的大小 |
RETR | 返回由参数标识的邮件的全部文本 |
DELE | 将参数标识的邮件标记为删除,由quit命令执行 |
RSET | 重置所有标记为删除的邮件,用于撤消DELE命令 |
TOP | 返回由参数标识的邮件前n行内容,n必须是正整数 |
NOOP | 服务器返回一个肯定的响应 |
QUIT | 终止会话 |
POP3协议中有三种状态,认证状态,处理状态,和更新状态。命令的执行可以改变协议的状态,而对于具体的某命令,它只能在具体的状态下使用。客户机与服务器刚与服务器建立连接时,它的状态为认证状态;一旦客户机提供了自己身份并被成功地确认,即由认可状态转入处理状态; 在完成相应的操作后客户机发出QUIT命令(具体说明见后续内容),则进入更新状态,更新之后又重返认可状态;当然在认可状态下执行QUIT命令,可释放连接。
python的内建库中提供了poplib用于使用pop3协议进行邮件操作。传送门
poplib模块提供了两个类:
- class poplib.POP3(host,port = POP3_PORT [,timeout ] ) 该类实现了实际的POP3协议。初始化实例时会创建连接。如果省略端口,则使用标准POP3端口(110)。可选的timeout参数指定连接尝试的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。
- class poplib.POP3_SSL(host,port = POP3_SSL_PORT,keyfile = None,certfile = None,timeout = None,context = None ) 这是POP3通过SSL加密套接字连接到服务器的子类。如果未指定端口 995,则使用标准的POP3-over-SSL端口。 超时在POP3构造函数中起作用。 context是一个可选ssl.SSLContext对象,它允许将SSL配置选项,证书和私钥绑定到单个(可能是长期存在的)结构中。keyfile和certfile是上下文的传统替代方案- 它们可以分别指向用于SSL连接的PEM格式的私钥和证书链文件。
由于126的邮箱默认是支持POP3的,所以本文以126邮箱为例
In [3]:
import poplib
uname='*****'
upwd='*****'
M=poplib.POP3('pop.126.com')#与服务器建立TCP连接
res_user_cmd=M.user(uname)#发送用户命令,返回应指示需要发送密码
print('user 命令的返回值是:{}'.format(res_user_cmd))
res_pass_cmd=M.pass_(upwd)#发送密码命令,返回邮件封数和邮箱大小
print('pass 命令的返回值是:{}'.format(res_pass_cmd))
res_stat_cmd=M.stat()#获取邮箱状态。结果是2个整数的元组:。(message count, mailbox size)
print('stat 命令的返回值中message count 是{},邮箱大小是{}'.format(res_stat_cmd[0],res_stat_cmd[1]))
ret = M.list()# 列出服务器上邮件信息,这个会对每一封邮件都输出id和大小,形如 b'1366 16325'。不象stat输出的是总的统计信息
res_first_mail = M.retr(1)# 取第一封邮件完整信息
print('第一封邮件的行数是{}'.format(len(res_first_mail)))
for line in res_first_mail[1]:
# 输出邮件
pass
M.quit()
Out[3]:
In [ ]: