附件路径错误导致filenotfounderror,主因是相对路径依赖工作目录而非脚本目录;应使用os.path.join(os.path.dirname(__file__), "file.pdf")并用os.path.exists()校验存在性,且必须以"rb"模式打开二进制文件。

附件路径错误导致 FileNotFoundError
发邮件时附件打不开,八成是路径没写对。Python 的 open() 读取附件文件时,如果传入相对路径(比如 "report.pdf"),会从当前工作目录找,不是脚本所在目录。运行环境不同(IDE、终端、定时任务),工作目录很可能不一致。
- 用
os.path.join(os.path.dirname(__file__), "report.pdf")明确指向脚本同级的附件 - 发送前先加一句
if not os.path.exists(attachment_path): raise FileNotFoundError(f"附件不存在:{attachment_path}"),避免静默失败 - 二进制打开必须用
"rb"模式,"r"会报UnicodeDecodeError(尤其 PDF、Excel 等非文本文件)
MIMEMultipart 必须设 subtype="mixed" 才能带附件
很多人照抄示例用了 MIMEMultipart("alternative"),结果附件根本收不到——这个 subtype 只支持纯文本+HTML 切换,不支持嵌入附件。带附件必须用 "mixed",且正文要作为第一个 MIMEText 子部件追加。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 正确写法:
msg = MIMEMultipart("mixed"),再msg.attach(MIMEText(body, "plain")) - 附件对象要用
MIMEApplication(通用二进制)或MIMEBase(需手动set_payload+encode_base64),别用MIMEText包二进制文件 - 附件头必须设
add_header("Content-Disposition", "attachment", filename=filename),否则 Outlook 等客户端可能当正文显示
SMTP 登录失败常见原因:授权码、端口、TLS
直接用邮箱密码登录 SMTP 服务基本都会失败。主流邮箱(QQ、163、Gmail)已禁用密码登录,必须用「授权码」或「应用专用密码」。
- QQ 邮箱去「设置 → 账户 → POP3/IMAP/SMTP 服务」开启,并生成授权码(不是账号密码)
- 端口别混淆:
465对应 SSL(用SMTP_SSL),587对应 STARTTLS(用SMTP+starttls()) - 调用
server.login(user, password)前,SSL 方式无需starttls(),但普通 SMTP 必须先server.starttls() - 记得
server.quit(),否则连接堆积可能触发服务商限流
中文附件名乱码问题怎么解
直接写 filename="测试报告.pdf",Outlook 里大概率显示成一堆问号或方块。因为 RFC 2231 规定附件名需编码,而 Python email 模块默认不处理。
- 用
from email.utils import formataddr和Header类组合:Header("测试报告.pdf", "utf-8").encode() - 更稳妥的做法:用
email.header.make_header+email.header.Header构造,再传给add_header - 注意:某些旧版邮件客户端只认
gbk编码,但现代 Python 默认 utf-8 更通用;如果收件方全是 Windows 本地用户,可尝试Header(name, "gbk").encode()
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










