python中的poplib模块详解

获取邮件主要有两种方式,一种是通过pop3,一种是通过imap。pop3协议相对来说简单,本章先讲如何用pop3收取邮件。 pop3全称是Post Office Protocol - Version 3,即pop协议的第三个版本。提供了SSL加密的POP3协议被称为POP3S。典型的通信过程如下:

  1. 用户启动客户端
  2. 客户端与邮件服务器建立TCP连接,默认端口是110
  3. 客户端向邮件服务器发送POP操作命令,如查询。具体的命令见后文
  4. 邮件服务器解析命令并执行相应操作,最后返回结果给客户端
  5. 客户端收到邮件服务器返回的结果并解析成用户可以阅读的形式
命令描述
USER用户名
PASS用户密码
APOPMD5消息摘要
STAT请求邮箱的统计数据,如邮件总数
UIDL返回邮件的唯一标识符
LIST返回邮件数量和每个邮件的大小
RETR返回由参数标识的邮件的全部文本
DELE将参数标识的邮件标记为删除,由quit命令执行
RSET重置所有标记为删除的邮件,用于撤消DELE命令
TOP返回由参数标识的邮件前n行内容,n必须是正整数
NOOP服务器返回一个肯定的响应
QUIT终止会话

POP3协议中有三种状态,认证状态,处理状态,和更新状态。命令的执行可以改变协议的状态,而对于具体的某命令,它只能在具体的状态下使用。客户机与服务器刚与服务器建立连接时,它的状态为认证状态;一旦客户机提供了自己身份并被成功地确认,即由认可状态转入处理状态; 在完成相应的操作后客户机发出QUIT命令(具体说明见后续内容),则进入更新状态,更新之后又重返认可状态;当然在认可状态下执行QUIT命令,可释放连接。

python的内建库中提供了poplib用于使用pop3协议进行邮件操作。传送门

poplib模块提供了两个类:

  1. class poplib.POP3(host,port = POP3_PORT [,timeout ] ) 该类实现了实际的POP3协议。初始化实例时会创建连接。如果省略端口,则使用标准POP3端口(110)。可选的timeout参数指定连接尝试的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。
  2. 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()
user 命令的返回值是:b'+OK core mail'
pass 命令的返回值是:b'+OK 1367 message(s) [331756844 byte(s)]'
stat 命令的返回值中message count 是1367,邮箱大小是331756844
第一封邮件的行数是3
Out[3]:
b'+OK core mail'
In [ ]: