python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python POP3邮件收取

Python通过poplib库实现POP3邮件收取的完整流程

作者:萧鼎

本文介绍了Python中通过poplib模块实现POP3协议邮件收取的完整流程,首先概述了POP3协议的特点(端口110/995、邮件下载后本地存储),对比了与IMAP的区别,详细讲解了poplib的核心API,需要的朋友可以参考下

一、前言

在现代开发场景中,自动化处理电子邮件已经是很多系统的刚需:客服系统自动收取邮件、财务自动获取账单邮件、个人写一个邮件归档脚本等等。除了 IMAP 协议,另一个常见的邮件收取协议就是 POP3(Post Office Protocol version 3)

Python 内置的 poplib 模块,为我们提供了简单直接的 POP3 客户端接口。虽然相比 imaplib,POP3 的功能相对有限(主要是收取,而不是在服务器上同步和管理),但在轻量级应用场景中,poplib 足够高效和实用。

本文将带你从 POP3 协议 出发,逐步掌握 Python poplib 的核心用法,配合 完整代码案例,并在最后分享最佳实践与常见问题排查。

二、POP3 协议与 poplib 简介

2.1 POP3 协议概述

POP3(Post Office Protocol 3)是电子邮件客户端与邮件服务器之间的标准协议之一,主要功能是 从服务器下载邮件。常见特性:

2.2 poplib 简介

Python 标准库中的 poplib 模块提供了 POP3 客户端功能。主要特性:

主要类和方法:

三、环境准备

3.1 邮箱设置

和 IMAP 一样,大多数邮箱服务商在 POP3 功能上都有额外要求:

  1. 开启 POP3 服务(如 QQ 邮箱要在设置中启用 POP3)。
  2. 生成授权码(通常不能用真实密码,必须用应用专用密码)。

3.2 Python 环境

由于 poplib 是标准库,无需安装额外依赖。但解析邮件正文与附件时,通常需要配合:

四、poplib API 详解

4.1 建立连接

import poplib

# 普通连接
pop_conn = poplib.POP3("pop.example.com", 110)

# SSL 加密连接
pop_conn = poplib.POP3_SSL("pop.example.com", 995)

常用端口:

4.2 登录

pop_conn.user("username@example.com")
pop_conn.pass_("password_or_token")

4.3 获取服务器状态

print(pop_conn.stat())  
# 返回 (邮件数量, 邮件总字节数)

4.4 获取邮件列表

resp, mails, octets = pop_conn.list()
print(mails)
# mails = [b'1 1024', b'2 2048', ...]

4.5 下载邮件

resp, lines, octets = pop_conn.retr(1)
msg_content = b"\r\n".join(lines).decode("utf-8", "ignore")

4.6 删除邮件

pop_conn.dele(1)  # 删除第 1 封邮件

4.7 断开连接

pop_conn.quit()

五、完整实战案例

5.1 获取最新一封邮件

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"\r\n".join(lines).decode("utf-8", "ignore")

msg = Parser().parsestr(msg_content)
print("主题:", msg["Subject"])
print("发件人:", msg["From"])
print("收件人:", msg["To"])

pop_conn.quit()

5.2 遍历收取所有邮件

from email.header import decode_header

for i in range(1, num_messages + 1):
    resp, lines, octets = pop_conn.retr(i)
    msg_content = b"\r\n".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}")

5.3 提取正文与附件

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)

5.4 批量保存邮件信息到 CSV

import csv

rows = []
for i in range(1, num_messages + 1):
    resp, lines, octets = pop_conn.retr(i)
    msg_content = b"\r\n".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)

六、最佳实践

  1. 推荐使用 SSL:POP3 明文连接存在安全风险。
  2. 使用授权码:避免暴露真实密码。
  3. 合理批量拉取:POP3 只支持按顺序获取邮件,建议分页处理。
  4. 清理资源:每次操作完成后调用 quit()
  5. 异常处理:捕获 poplib.error_proto 错误,保证健壮性。

七、常见问题与排查

登录失败

中文乱码

附件丢失

连接超时

八、进阶应用与扩展

九、总结

本文系统介绍了 POP3 协议 的原理与特点,并结合 Python poplib 库 的 API,展示了从登录、收取、解析到附件提取的完整流程。同时,还分享了常见问题与最佳实践。

相比 imaplibpoplib 的功能更轻量,适用于只需 简单收取邮件 的场景。如果你需要更强大的 邮件管理与同步,可以优先考虑 IMAP。但在快速开发脚本、批量收取邮件等任务中,poplib 仍然是一把利器。

以上就是Python通过poplib库实现POP3邮件收取的完整流程的详细内容,更多关于Python POP3邮件收取的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文