老版 Foxmail 和部分企业网关里打开通知邮件只有空白正文,同一封在 Gmail 里排版完整,源码里能看到纯文本那一段是空的。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,邮件只构造了 text/html 一段,MIME 类型写成单段,客户端按纯文本解析就取不到内容。也有实现是 multipart/alternative 里纯文本段留了空字符串。

「邮件纯文本回退」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

msg = MIMEMultipart('alternative')
msg.attach(MIMEText(text_body, 'plain', 'utf-8'))
msg.attach(MIMEText(html_body, 'html', 'utf-8'))

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,构造 multipart/alternative,纯文本段放一份去掉标签的正文,别留空;纯文本里的链接单独写全 URL,客户端不会自动识别相对路径;用邮件源码视图确认两段都在,再发出去。

最后用这个标准收尾,纯文本模式下正文完整可读,链接以 http 开头单独成行。

作者 9823189