文章目录
- POP3(Post Office Protocol 3)是电子邮件客户端与邮件服务器之间的标准协议之一,主要功能是 从服务器下载邮件。常见特性: 默认端口 110(明文连接)。 POP3 over SSL/TLS 通常使用端口 995。 POP3 的设计哲学:邮件一旦下载,就存储在本地,服务器端可选择保留或删除。 与 IMAP 的对比: POP3:偏向下载 + 本地存储(轻量、简单)。 IMAP:偏向同步 + 服务器存储(多终端一致)。
- Python 标准库中的 poplib 模块提供了 POP3 客户端功能。主要特性: 建立与 POP3 服务器的连接。 登录邮箱。 获取邮件列表。 下载邮件内容。 删除邮件。 主要类和方法: poplib.POP3(host, port=110, timeout=None):普通连接。 poplib.POP3_SSL(host, port=995, timeout=None):SSL 加密连接。 user() / pass_():登录。 stat():获取邮件统计。 list():获取邮件列表。 retr(msg_id):下载指定邮件。 dele(msg_id):删除邮件。 quit():断开连接。
- import poplib # 普通连接 pop_conn = poplib.POP3(“pop.example.com”, 110) # SSL 加密连接 pop_conn = poplib.POP3_SSL(“pop.example.com”, 995) 常用端口: 110 → 普通 POP3 995 → POP3 over SSL
- pop_conn.user(“username@example.com”) pop_conn.pass_(“password_or_token”)
- print(pop_conn.stat()) # 返回 (邮件数量, 邮件总字节数)
- resp, mails, octets = pop_conn.list() print(mails) # mails = [b’1 1024′, b’2 2048′, …]
- resp, lines, octets = pop_conn.retr(1) msg_content = b”rn”.join(lines).decode(“utf-8”, “ignore”)
- pop_conn.dele(1) # 删除第 1 封邮件
- pop_conn.quit()
- import poplib from email.parser import Parser pop_conn = poplib.POP3_SSL(“pop.qq.com”) pop_conn.user(“your_email@qq.com”) pop_conn.pass_(“your_auth_code”) # 邮件数量 num_messages = len(pop_conn.list()[1]) print(“总邮件数:”, num_messages) # 获取最后一封邮件 resp, lines, octets = pop_conn.retr(num_messages) msg_content = b”rn”.join(lines).decode(“utf-8”, “ignore”) msg = Parser().parsestr(msg_content) print(“主题:”, msg[“Subject”]) print(“发件人:”, msg[“From”]) print(“收件人:”, msg[“To”]) pop_conn.quit()
- from email.header import decode_header for i in range(1, num_messages + 1): resp, lines, octets = pop_conn.retr(i) msg_content = b”rn”.join(lines).decode(“utf-8”, “ignore”) msg = Parser().parsestr(msg_content) subject, encoding = decode_header(msg[“Subject”])[0] if isinstance(subject, bytes): subject = subject.decode(encoding or “utf-8”, “ignore”) print(f”[{i}] 主题: {subject}”)
- import os from email import message_from_string msg = message_from_string(msg_content) for part in msg.walk(): content_type = part.get_content_type() disposition = part.get(“Content-Disposition”) if content_type == “text/plain” and not disposition: body = part.get_payload(decode=True).decode(“utf-8”, “ignore”) print(“正文:”, body) if disposition and “attachment” in disposition: filename = part.get_filename() if filename: filepath = os.path.join(“downloads”, filename) with open(filepath, “wb”) as f: f.write(part.get_payload(decode=True)) print(“保存附件:”, filepath)
- import csv rows = [] for i in range(1, num_messages + 1): resp, lines, octets = pop_conn.retr(i) msg_content = b”rn”.join(lines).decode(“utf-8”, “ignore”) msg = Parser().parsestr(msg_content) rows.append([i, msg.get(“From”), msg.get(“Subject”)]) with open(“emails.csv”, “w”, newline=””, encoding=”utf-8″) as f: writer = csv.writer(f) writer.writerow([“ID”, “From”, “Subject”]) writer.writerows(rows)
目录
- 一、前言
- 二、POP3 协议与 poplib 简介
- 2.1 POP3 协议概述
- 2.2 poplib 简介
- 三、环境准备
- 3.1 邮箱设置
- 3.2 Python 环境
- 四、poplib API 详解
- 4.1 建立连接
- 4.2 登录
- 4.3 获取服务器状态
- 4.4 获取邮件列表
- 4.5 下载邮件
- 4.6 删除邮件
- 4.7 断开连接
- 五、完整实战案例
- 5.1 获取最新一封邮件
- 5.2 遍历收取所有邮件
- 5.3 提取正文与附件
- 5.4 批量保存邮件信息到 CSV
- 六、最佳实践
- 七、常见问题与排查
- 八、进阶应用与扩展
- 九、总结
在现代开发场景中,自动化处理电子邮件已经是很多系统的刚需:客服系统自动收取邮件、财务自动获取账单邮件、个人写一个邮件归档脚本等等。除了 IMAP 协议,另一个常见的邮件收取协议就是 POP3(Post Office Protocol version 3)。
Python 内置的 poplib 模块,为我们提供了简单直接的 POP3 客户端接口。虽然相比 imaplib,POP3 的功能相对有限(主要是收取,而不是在服务器上同步和管理),但在轻量级应用场景中,poplib 足够高效和实用。
本文将带你从 POP3 协议 出发,逐步掌握 Python poplib 的核心用法,配合 完整代码案例,并在最后分享最佳实践与常见问题排查。
POP3(Post Office Protocol 3)是电子邮件客户端与邮件服务器之间的标准协议之一,主要功能是 从服务器下载邮件。常见特性:
- 默认端口 110(明文连接)。
- POP3 over SSL/TLS 通常使用端口 995。
- POP3 的设计哲学:邮件一旦下载,就存储在本地,服务器端可选择保留或删除。
- 与 IMAP 的对比:
- POP3:偏向下载 + 本地存储(轻量、简单)。
- IMAP:偏向同步 + 服务器存储(多终端一致)。
Python 标准库中的 poplib 模块提供了 POP3 客户端功能。主要特性:
- 建立与 POP3 服务器的连接。
- 登录邮箱。
- 获取邮件列表。
- 下载邮件内容。
- 删除邮件。
主要类和方法:
poplib.POP3(host, port=110, timeout=None):普通连接。poplib.POP3_SSL(host, port=995, timeout=None):SSL 加密连接。user()/pass_():登录。stat():获取邮件统计。list():获取邮件列表。retr(msg_id):下载指定邮件。dele(msg_id):删除邮件。quit():断开连接。
和 IMAP 一样,大多数邮箱服务商在 POP3 功能上都有额外要求:
- 开启 POP3 服务(如 QQ 邮箱要在设置中启用 POP3)。
- 生成授权码(通常不能用真实密码,必须用应用专用密码)。
由于 poplib 是标准库,无需安装额外依赖。但解析邮件正文与附件时,通常需要配合:
email:解析邮件内容。base64/quopri:解码邮件正文。os:保存附件。
import poplib
# 普通连接
pop_conn = poplib.POP3("pop.example.com", 110)
# SSL 加密连接
pop_conn = poplib.POP3_SSL("pop.example.com", 995)
常用端口:
110→ 普通 POP3995→ POP3 over SSL
pop_conn.user("username@example.com")
pop_conn.pass_("password_or_token")
print(pop_conn.stat())
# 返回 (邮件数量, 邮件总字节数)
resp, mails, octets = pop_conn.list()
print(mails)
# mails = [b'1 1024', b'2 2048', ...]
resp, lines, octets = pop_conn.retr(1)
msg_content = b"rn".join(lines).decode("utf-8", "ignore")
pop_conn.dele(1) # 删除第 1 封邮件
pop_conn.quit()
import poplib
from email.parser import Parser
pop_conn = poplib.POP3_SSL("pop.qq.com")
pop_conn.user("your_email@qq.com")
pop_conn.pass_("your_auth_code")
# 邮件数量
num_messages = len(pop_conn.list()[1])
print("总邮件数:", num_messages)
# 获取最后一封邮件
resp, lines, octets = pop_conn.retr(num_messages)
msg_content = b"rn".join(lines).decode("utf-8", "ignore")
msg = Parser().parsestr(msg_content)
print("主题:", msg["Subject"])
print("发件人:", msg["From"])
print("收件人:", msg["To"])
pop_conn.quit()
from email.header import decode_header
for i in range(1, num_messages + 1):
resp, lines, octets = pop_conn.retr(i)
msg_content = b"rn".join(lines).decode("utf-8", "ignore")
msg = Parser().parsestr(msg_content)
subject, encoding = decode_header(msg["Subject"])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding or "utf-8", "ignore")
print(f"[{i}] 主题: {subject}")
import os
from email import message_from_string
msg = message_from_string(msg_content)
for part in msg.walk():
content_type = part.get_content_type()
disposition = part.get("Content-Disposition")
if content_type == "text/plain" and not disposition:
body = part.get_payload(decode=True).decode("utf-8", "ignore")
print("正文:", body)
if disposition and "attachment" in disposition:
filename = part.get_filename()
if filename:
filepath = os.path.join("downloads", filename)
with open(filepath, "wb") as f:
f.write(part.get_payload(decode=True))
print("保存附件:", filepath)
import csv
rows = []
for i in range(1, num_messages + 1):
resp, lines, octets = pop_conn.retr(i)
msg_content = b"rn".join(lines).decode("utf-8", "ignore")
msg = Parser().parsestr(msg_content)
rows.append([i, msg.get("From"), msg.get("Subject")])
with open("emails.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["ID", "From", "Subject"])
writer.writerows(rows)
- 推荐使用 SSL:POP3 明文连接存在安全风险。
- 使用授权码:避免暴露真实密码。
- 合理批量拉取:POP3 只支持按顺序获取邮件,建议分页处理。
- 清理资源:每次操作完成后调用
quit()。
- 异常处理:捕获
poplib.error_proto 错误,保证健壮性。
quit()。poplib.error_proto 错误,保证健壮性。
登录失败
- 检查是否开启了 POP3 服务。
- 确认是否使用授权码而不是邮箱登录密码。
中文乱码
- 邮件头常用 Base64/QP 编码,需
decode_header()解析。
附件丢失
- 邮件多为 MIME 格式,需
msg.walk()遍历所有部分。
连接超时
- 使用
poplib.POP3_SSL(host, port, timeout=60)设置超时。
- 结合 smtplib:实现邮件收发一体化。
- 结合数据库:将邮件存入 MySQL/SQLite 方便检索。
- 结合调度工具:如
schedule 或 APScheduler 定时收取邮件。
- 结合 NLP:分析邮件内容,自动分类或提取关键信息。
schedule 或 APScheduler 定时收取邮件。
本文系统介绍了 POP3 协议 的原理与特点,并结合 Python poplib 库 的 API,展示了从登录、收取、解析到附件提取的完整流程。同时,还分享了常见问题与最佳实践。
相比 imaplib,poplib 的功能更轻量,适用于只需 简单收取邮件 的场景。如果你需要更强大的 邮件管理与同步,可以优先考虑 IMAP。但在快速开发脚本、批量收取邮件等任务中,poplib 仍然是一把利器。
以上就是Python通过poplib库实现POP3邮件收取的完整流程的详细内容,更多关于Python POP3邮件收取的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- python实现的接收邮件功能示例【基于网易POP3服务器】
- Python使用POP3和SMTP协议收发邮件的示例代码
- python实现下载pop3邮件保存到本地
- python+POP3实现批量下载邮件附件
- python登录pop3邮件服务器接收邮件的方法