Python中的poplib模块能够连接POP3 服务器,可以用于读取邮箱信息,不过根据python官网文献(参考文献4)中的提醒:“POP3 已经过时,POP3 服务器的实现质量差异很大,而且大多很糟糕。如果邮件服务器支持 IMAP,则最好使用 imaplib.IMAP4 类,因为 IMAP 服务器一般实现得更好“。本文学习并验证参考文献1中的示例代码,后续会接着学习imaplib的用法。
以163邮箱为例,使用poplib模块以POP3方式连接邮箱服务器需要在邮箱中开启POP3/SMTP服务。如下图所示,登录163邮箱,点击设置链接,在弹出的菜单中选择POP3/SMTP/IMAP,在开启服务中开启POP3/SMTP服务即可。




163邮箱默认POP3/SMTP服务是开启的,此时使用poplib模块连接时使用的密码是邮箱登录密码。如果将其关闭,然后再次开启,则会得到一个随机的授权密码,此时再使用邮箱登录密码则无法连接,需要使用上述授权密码才能正常登录。
直接使用的参考文献1中的代码进行测试(主要功能为获取邮件数量),用到的主要函数说明及代码如下:
| 序号 | 函数 | 说明 |
|---|---|---|
| 1 | POP3_SSL | 经以SSL 加密方式连接到服务器 |
| 2 | set_debuglevel | 设置实例的调试级别,它控制着调试信息的数量。默认值 0 不产生调试信息。值 1 产生中等数量的调试信息,通常每个请求产生一行。大于或等于 2 的值产生的调试信息最多。 |
| 3 | user | 发送用户名 |
| 4 | pass_ | 发送密码 |
| 5 | stat | 获取邮箱状态。结果为 2 个整数组成的元组:(message count, mailbox size)。 |
| 6 | quit | 断开连接 |
# coding=utf-8
import poplib
host='pop.163.com'
username='XXXXXXXXXX@163.com'
password='XXXXXXXXXX'
pp=poplib.POP3_SSL(host)
pp.set_debuglevel(1)
pp.user(username)
pp.pass_(password)
ret=pp.stat()
mailCount=ret[0]
print('一共',mailCount,'封邮件')
pp.quit()
运行上述程序,看到返回的结果中邮件数量为0,但实际邮箱中邮件数量有将近100份左右,不清楚原因为何。

百度上述问题,在参考文献3中看到了解释,应该还是邮箱设置的问题,其默认设置为收取最新30天邮件,将其设置改为收取全部邮件即可(实际测试时从服务器接收的数量不稳定,有时明明设置了授权全部邮件,但要多次运行程序后才会收到正确的邮件数量)。

本文仅是根据参考文献对poplib模块进行简单测试。Python的官方文档建议使用IMAP,同时参考文献5和6都介绍IMAP比POP3方便使用,后续主要学习Python中的imaplib模块。
参考文献:
[1]Python从菜鸟到高手
[2]https://www.jianshu.com/p/544a35bc8c92
[3]https://www.cnblogs.com/robzh/p/14770497.html
[4]https://docs.python.org/zh-cn/3/library/poplib.html?highlight=poplib#module-poplib
[5]https://zhuanlan.zhihu.com/p/28377718
[6]http://help.163.com/10/0203/17/5UK7GVU100753VB9.html?servCode=6020251