from email.utils import formatdate msg["Date"] = formatdate(timeval=None, localtime=False, usegmt=True) # Thu, 13 Nov 2026 08:12:00 +0000
发出的通知邮件在 Gmail 里显示时间是 08:12,实际发送是 16:12,相差整 8 小时。原始邮件头里 Date 写的是 08:12:00 +0000,服务器时区是 Asia/Shanghai。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,发信库用本地时间拼 Date 头,又硬编码了 +0000,时间值和时区声明对不上。客户端按声明解析,就整体提前 8 小时。日志里用的是本地时间,两边一对才发现差在时区。
「邮件 Date 时区」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:Date 头统一用 UTC 时间加 +0000 或者带真实偏移;发信前打印 Message 的 Date 值核对;换两个不同时区的客户端各看一次显示时间;把服务器时区和应用时区分开配置。
改完只确认一件事:客户端显示时间和发送时刻一致,原始头里的 Date 是 UTC 且带 +0000,两个时区下查看都不再偏差。
