Python邮件收取教程:使用POP3协议
1. 邮件收取协议概述
在电子邮件的生态里,发送靠SMTP,收取则有两大主流方案:
- POP3 (Post Office Protocol version 3) - 专注「下载+本地处理」的轻量级协议
- IMAP (Internet Message Access Protocol) - 支持「云端同步+多设备管理」的进阶方案
本教程聚焦于更简单易用的POP3,用Python内置模块快速实现从邮箱抓取邮件的全流程。
2. POP3极简工作流
不用太纠结细节,记住这几步就能理解代码逻辑:
- 客户端连服务器:110端口(明文,强烈不推荐)/995端口(SSL加密,生产必用)
- 验证身份(登录)
- 拉取所有邮件的ID和大小列表
- 按需下载指定邮件
- (可选)标记/删除服务器上的已下载邮件
- 主动断开连接
3. Python全流程实现
不需要安装第三方库,Python标准库poplib+email全家桶就够了。
3.1 模块引入
先把要用的工具全部备好:
3.2 安全连接函数
现代邮箱基本禁用明文POP3,封装一个默认走SSL的通用连接函数更方便:
3.3 获取邮件元数据列表
先不要下载大邮件,拉取ID和大小可以先判断下载范围:
3.4 下载单封原始邮件
拿到ID后直接下载邮件的字节流原始内容(方便后续用email模块解析):
3.5 核心解析工具
POP3只传原始字节,邮件头/正文/附件的解析全靠email模块,需要解决两个关键问题:
- 编码混乱:中文邮件头/正文经常用GBK/GB2312/UTF-8
- 多部分邮件:带附件、纯文本+HTML双格式的邮件是嵌套结构
3.5.1 通用字符串解码函数
3.5.2 猜测邮件部分的编码
3.5.3 递归打印邮件信息
处理嵌套的多部分邮件,只打印关键内容(正文前200字、附件名称):
4. 完整可运行的示例
把上面的函数串起来,封装成一个主入口:
5. 避坑指南(安全+实用)
5.1 安全第一
- 永远不要硬编码密码:用环境变量(
os.getenv("EMAIL_PWD"))、加密配置文件(如python-dotenv+本地Git忽略的.env) - 双重验证邮箱必须用「应用专用密码」:QQ/163/Gmail等都要单独生成,不能用主密码
- 必须开SSL:默认走995端口,明文110端口现在几乎都被封了
5.2 实用注意事项
- 避免频繁调用:短时间内重复连接会被邮箱服务商限流甚至拉黑
- 邮件ID是会话级的:每次重新登录,邮件ID可能会变,不要跨会话保存
- 删除邮件要谨慎:
server.dele(mail_id)只是标记,必须等server.quit()才会真删,反悔的话用server.rset() - 编码问题别慌:国内邮箱常用GBK,国外常用UTF-8,我们的代码已经加了两层兜底
6. 简单进阶方向
如果想拓展功能,可以试试:
- 附件下载:遍历多部分邮件,找到
Content-Disposition: attachment的部分,保存到本地 - 邮件过滤:先拉取所有邮件头(用
server.top(mail_id, 0)),根据主题/发件人/日期筛选后再下载正文 - 定时抓取:结合
schedule库做定时任务 - 数据持久化:把解析后的邮件存入SQLite/MySQL/Elasticsearch
7. 总结
这篇教程用Python内置模块实现了POP3收取邮件的核心功能:从建立安全连接、拉取元数据、下载解析,到避坑注意事项都覆盖到了。整个流程代码量不大,逻辑清晰,很适合作为邮件自动化的入门实践。

