Python接收邮件 imaplib读取邮箱完整教程
用Python标准库imaplib通过IMAP协议登录邮箱、列出邮件、读取发件人主题正文,QQ邮箱163 Gmail均可,附完整可运行代码与授权码配置。
场景痛点
每天上班第一件事就是登录网页邮箱,几十封邮件一封封点开看,找报价单、找客户回复、找领导批示,光筛邮件就要半小时。用Python的imaplib直接连邮箱,几秒把最近50封邮件的发件人、主题、时间列成清单,重要邮件一眼挑出来,不用再盯着网页邮箱刷。
用到的库
imaplib、email都是Python标准库,无需pip安装。
# 无需安装,Python3自带
完整代码
# -*- coding: utf-8 -*-
import imaplib
import email
from email.header import decode_header, make_header
# ====== 邮箱配置(改成你自己的)======
IMAP_SERVER = "imap.qq.com" # 163用 imap.163.com,Gmail用 imap.gmail.com
IMAP_PORT = 993
ACCOUNT = "your_account@qq.com"
PASSWORD = "your_imap_auth_code" # 注意是IMAP授权码,不是登录密码
def decode_str(s):
"""解码邮件头字段(发件人、主题),解决中文乱码"""
if not s:
return ""
parts = decode_header(s)
return str(make_header(parts))
def read_inbox(limit=20):
# 1. 用SSL加密连接IMAP服务器
mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT)
# 2. 登录
mail.login(ACCOUNT, PASSWORD)
# 3. 选中收件箱,SELECTED表示选中成功
mail.select("INBOX")
# 4. 搜索全部邮件,返回邮件编号列表
status, messages = mail.search(None, "ALL")
# messages是bytes,按空格切成编号
id_list = messages[0].split()
# 只取最新的limit封(编号越大越新)
recent = id_list[-limit:]
print(f"共找到 {len(id_list)} 封,读取最近 {len(recent)} 封:\n")
for msg_id in reversed(recent):
# 5. 按编号抓取原始邮件内容
status, msg_data = mail.fetch(msg_id, "(RFC822)")
raw = msg_data[0][1]
msg = email.message_from_bytes(raw)
subject = decode_str(msg.get("Subject"))
sender = decode_str(msg.get("From"))
date = msg.get("Date", "")
print(f"[{msg_id.decode()}] {date}")
print(f" 发件人:{sender}")
print(f" 主题:{subject}\n")
mail.logout()
if __name__ == "__main__":
read_inbox(limit=20)
代码讲解
imaplib.IMAP4_SSL(IMAP_SERVER, 993):用SSL加密连接IMAP服务器,端口993是标准SSL端口,比STARTTLS更简单。mail.login(ACCOUNT, PASSWORD):这里的密码不是邮箱登录密码,是邮箱设置里开启IMAP后生成的"授权码"。QQ、163都必须用授权码,用原密码会报LOGIN failed。mail.select("INBOX"):选中收件箱,不选目录后续search/fetch都没有作用域。mail.search(None, "ALL"):搜索当前目录下所有邮件。第二个参数是IMAP搜索条件,ALL是全部,后面几篇会换成UNSEEN、FROM等。mail.fetch(msg_id, "(RFC822)"):按邮件编号抓取这封邮件的完整原始内容,RFC822表示整封邮件。email.message_from_bytes(raw):把原始字节流解析成Message对象,之后用.get("Subject")等取头字段,用.walk()遍历正文和附件。decode_header+make_header:邮件头里的中文常被base64或quoted-printable编码,这套写法统一解码成可读中文。
运行结果
运行后终端打印最近20封邮件的编号、时间、发件人、主题,像一份纯文本邮件清单。先跑这个确认登录和读取没问题,再往下做下载附件、筛选等进阶操作。
注意事项
- QQ邮箱:先在"设置→账户→POP3/IMAP/SMTP"里开启IMAP服务,拿到授权码填到
PASSWORD。163、新浪同理。Gmail要开"不够安全的应用访问"或用应用专用密码。 - 不同邮箱IMAP地址:QQ是
imap.qq.com:993,163是imap.163.com:993,阿里云企业邮一般是imap.qiye.aliyun.com:993,Exchange邮箱要单独确认。 search返回的编号是当前会话内的临时编号,不是邮件唯一ID,脚本里不要跨会话保存。- 抓大邮件时
fetch整封邮件可能慢,只想看清单可以先抓(BODY.PEEK[HEADER])只取头。 - 脚本结束一定要
logout,否则服务器可能认为你一直在线,频繁重连会被临时封IP。

更新时间:2026-09-14 21:08:35
上一篇:Python邮件标记已读未读 imaplib设置FLAGS教程