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 支持更强的远程操作功能,适用于需保留服务器邮件的业务。
“点赞有美意,赞赏是鼓励”