> 技术文档 > Python 库手册:imaplib 邮件服务器通信模块

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

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 imaplibimap = imaplib.IMAP4_SSL(\"imap.qq.com\")imap.login(\"your_email@qq.com\", \"your_auth_code\")print(\"登录成功\")imap.logout()

例 2:获取所有邮件 UID

import imaplibimap = 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 imaplibimap = 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 imaplibimap = 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 imaplibimap = 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 支持更强的远程操作功能,适用于需保留服务器邮件的业务。

图片

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