Python 库手册:imaplib 邮件服务器通信模块

发布于:2025-07-25 ⋅ 阅读:(20) ⋅ 点赞:(0)

imaplib 是 Python 标准库中用于与邮件服务器进行 IMAP 协议通信的模块。它提供了完整的 IMAP 客户端支持,可用于访问、搜索、下载和管理服务器上的电子邮件,适用于需要高效访问多封邮件的场景。

imaplib 提供了一个基于 IMAP4(Internet Message Access Protocol)的客户端类 IMAP4 和 IMAP4_SSL,可通过标准的命令与邮件服务器进行通信,读取和操作远程邮箱中的邮件内容,是编写邮件收取程序的基础模块之一。

常见应用场景:

(1)登录邮箱并查看服务器上的邮件标题、发件人等信息。

(2)精确搜索并筛选符合条件的邮件(如未读、指定时间等)。

(3)下载邮件原文或附件。

(4)自动化管理邮件(标记已读、删除等)

(5)与 email 模块配合处理 MIME 邮件内容。

  ◆  ◆

核心概念

1、IMAP 协议

相较于 POP3,IMAP 支持邮件的远程管理(读取、标记、移动),不会直接删除服务器上的邮件,更适用于多设备邮件同步。

2、邮箱文件夹(Mailbox Folder)

如 "INBOX", "Sent", "Trash" 等,每个都是一个邮件集合。

3、UID 与序号

IMAP 使用邮件的 UID(唯一编号)进行精确操作。

4、状态与响应

IMAP 命令通常返回三项:状态码(OK、NO、BAD)、响应代码与数据结果。

  ◆  ◆

应用举例

例 1:连接并登录邮箱

import imaplib
imap = imaplib.IMAP4_SSL("imap.qq.com")imap.login("your_email@qq.com", "your_auth_code")print("登录成功")imap.logout()

例 2:获取所有邮件 UID

import imaplib
imap = imaplib.IMAP4_SSL("imap.qq.com")imap.login("your_email@qq.com", "your_auth_code")imap.select("INBOX")status, data = imap.search(None, "ALL")print("所有邮件 UID:", data[0].split())imap.logout()

例 3:获取最新一封邮件的主题

from email.parser import BytesParserfrom email.header import decode_headerimport imaplib
imap = imaplib.IMAP4_SSL("imap.qq.com")imap.login("your_email@qq.com", "your_auth_code")imap.select("INBOX")
# 获取最新一封邮件的编号status, data = imap.search(None, "ALL")latest_id = data[0].split()[-1]
# 获取邮件内容status, msg_data = imap.fetch(latest_id, "(RFC822)")raw_email = msg_data[0][1]msg = BytesParser().parsebytes(raw_email)
# 解析主题subject = msg.get("Subject", "")decoded = decode_header(subject)subject = ''.join([    part.decode(encoding or 'utf-8') if isinstance(part, bytes) else part    for part, encoding in decoded])print("最新主题:", subject)
imap.logout()

例 4:搜索未读邮件并统计数量

import imaplib
imap = imaplib.IMAP4_SSL("imap.qq.com")imap.login("your_email@qq.com", "your_auth_code")imap.select("INBOX")
status, data = imap.search(None, "UNSEEN")unread_ids = data[0].split()print("未读邮件数量:", len(unread_ids))
imap.logout()

例 5:将某封邮件标记为已读

import imaplib
imap = imaplib.IMAP4_SSL("imap.qq.com")imap.login("your_email@qq.com", "your_auth_code")imap.select("INBOX")
# 获取第一封邮件编号status, data = imap.search(None, "ALL")first_id = data[0].split()[0]
# 设置标记imap.store(first_id, "+FLAGS", "\\Seen")print("标记已读成功")
imap.logout()

  ◆  ◆

常用函数速览

IMAP4/IMAP4_SSL()

创建与邮件服务器的连接。

参数:

host:服务器地址(如 imap.qq.com)

port:端口号(默认 993 用于 SSL)

返回:IMAP4 或 IMAP4_SSL 对象

close()

关闭当前选中的邮箱(如 INBOX)。

参数:无

返回:状态码与响应消息

fetch(msg_id, message_parts)

获取指定邮件的内容。

参数:

msg_id:邮件编号(如 '1' 或 UID)

message_parts:指定内容,如 "(RFC822)" 获取原始内容

返回:状态码与原始邮件数据(二进制)

login(user, password)

登录邮箱账户。

参数:

user:邮箱地址

password:密码或授权码

返回:状态码与响应数据

logout()

登出邮箱并关闭连接。

参数:无

返回:状态码与响应

search(charset, *criteria)

搜索符合条件的邮件。

参数:

charset:一般为 None

criteria:搜索条件,如 "ALL", "UNSEEN", "FROM someone@example.com"

返回:状态码与邮件编号列表

select(mailbox)

选择要操作的邮箱文件夹。

参数:如 "INBOX", "Sent", "Drafts"

返回:状态码与邮件总数

store(msg_id, command, flags)

设置邮件标志位(如已读、删除)。

参数:

msg_id:邮件编号

command:如 "+FLAGS", "-FLAGS", "FLAGS"

flags:如 "\\Seen"(已读),"\\Deleted"(删除)

返回:状态码与响应数据

  ◆  ◆

使用建议

1、建议搭配 email 模块对 fetch() 获取的原始邮件进行 MIME 解析。

2、登录时建议使用授权码(QQ、163 邮箱等服务常强制使用)。

3、搜索时注意大小写敏感的字段,如 "FROM"、"SUBJECT"。

4、IMAP 支持更强的远程操作功能,适用于需保留服务器邮件的业务。

图片

“点赞有美意,赞赏是鼓励”


网站公告

今日签到

点亮在社区的每一天
去签到