应开启POP3/SMTP服务并使用授权码登录,禁用明文连接,改用POP3_SSL(host, 995)及ssl.create_default_context()处理证书;避免直接使用账户密码。

poplib连接失败:认证被拒绝或超时怎么办
多数邮件服务商(如QQ邮箱、163邮箱)默认禁用POP3/IMAP明文登录,必须开启“SMTP/POP3/IMAP服务”并使用授权码而非密码登录。直接用账户密码会触发poplib.error_proto('Authentication failed')或timeout。
- QQ邮箱需在「设置 → 账户 → POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务」中开启POP3/SMTP服务,获取16位授权码
- 163邮箱同理,开启IMAP/SMTP后生成「客户端专用密码」
-
poplib.POP3_SSL比poplib.POP3更可靠,端口固定为995;避免用非SSL连接 - 连接前加
import ssl并显式指定context=ssl.create_default_context()可绕过证书验证问题(仅调试用)
imaplib取邮件正文时乱码或只拿到HTML片段
imaplib返回的是原始RFC 2822格式邮件,正文可能嵌套在multipart/alternative或multipart/mixed结构里,且编码(如base64、quoted-printable)和字符集(如gbk、)需手动解码。直接读<code>msg.get_payload()大概率是空或乱码。
- 用
email.parser.BytesParser().parse()解析原始字节流,比email.message_from_string()更安全 - 遍历
msg.walk(),对每个part检查part.get_content_maintype() == 'text'且part.get_content_subtype() in ('plain', 'html') - 用
part.get_payload(decode=True)解码payload,再用part.get_content_charset() or 'utf-8'解码为字符串 - HTML正文建议用
BeautifulSoup(part_payload, 'lxml')提取纯文本,避免<br>、残留
如何安全地过滤垃圾邮件和重复邮件
POP3协议不支持服务器端搜索和标记,每次list()都会拉取全部未读邮件,容易重复处理。IMAP才是正解——用SEARCH指令按UNSEEN、FROM、SINCE等条件筛选,再用FETCH精准取目标邮件。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 登录后执行
mail.select('INBOX'),再调mail.search(None, '(UNSEEN FROM "noreply@github.com")')定位特定来源 - 对每封邮件用
msg['Message-ID']做哈希存本地SQLite,避免重复解析(注意部分邮件无该头,需fallback到msg['Date'] + msg['Subject']) - 处理完立即
mail.store(uid, '+FLAGS', '\Seen')标记已读,防止下次重复拉取 - 避免用
mail.fetch('1:*', '(BODY[HEADER])')全量拉取头信息,应改用mail.uid('SEARCH', None, 'UNSEEN')先获UID列表
附件下载后无法打开:文件名丢失或损坏
邮件附件的文件名藏在Content-Disposition头的filename*=参数里,直接读part.get_filename()常返回None。且base64解码后若未写入二进制模式,会导致PDF、Excel等文件损坏。
立即学习“Python免费学习笔记(深入)”;
- 用
email.utils.collapse_rfc2231_value(part.get_param('filename', header='content-disposition'))正确提取UTF-8文件名 - 保存附件时务必用
open(filepath, 'wb')(不是'w'),并写入part.get_payload(decode=True)的bytes结果 - 对
application/pdf、image/jpeg等类型,建议校验len(payload) == int(part.get('Content-Length', 0))防截断 - 路径拼接用
os.path.join(save_dir, safe_filename),其中safe_filename需过滤/ : * ? " |等非法字符
实际跑通的关键在于:POP3适合极简轮询,但功能受限;IMAP虽复杂,却是唯一能稳定支撑过滤、标记、附件提取的方案。别省那几行代码去硬啃POP3的局限性。

















