fix(email): 补齐 Date 与 Message-ID 邮件头

问题:本项目发出的所有邮件都缺少 Date 与 Message-ID —— 这两个头
RFC 5322 要求(Date)或强烈建议(Message-ID)携带,而 smtplib
**不会自动补**,构造 MIMEMultipart 时必须自己加。

为什么值得修:缺这两个头是反垃圾引擎的经典扣分项("来源不明的
自动化邮件"特征)。而它是**静默失败** —— 发件服务器照样回
250 Data Ok,客户端完全看不出邮件在收件方被降权。

诊断依据:抓取完整的 SMTP 会话(set_debuglevel(1))后,报文里
只有 Content-Type / MIME-Version / From / To / Subject 五个头。

★ 需要说明的是:**无法证明这就是此前邮件丢失的原因**。用户实测
  未加此头的邮件也能收到,加了之后仍有一封未送达。此改动是补上
  一个确定存在的规范缺陷,不等同于修复了投递问题。

影响面:send_email() 是全局共用的发信函数,库存预警、出库/借库
审批通知等所有通知邮件一并受益。
This commit is contained in:
yueli
2026-09-23 17:41:35 +08:00
parent 4ed8abcc6d
commit b2a2f513ae

View File

@ -10,6 +10,7 @@ import logging
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.header import Header from email.header import Header
from email.utils import formatdate, make_msgid
from typing import List, Union from typing import List, Union
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -94,6 +95,13 @@ def send_email(to_email: Union[str, List[str]], subject: str, content: str, cfg:
msg['From'] = cfg['sender'] msg['From'] = cfg['sender']
msg['To'] = ', '.join(recipients) msg['To'] = ', '.join(recipients)
msg['Subject'] = Header(subject, 'utf-8') msg['Subject'] = Header(subject, 'utf-8')
# ★ Date 与 Message-ID 是 RFC 5322 的**必需/强烈建议**头,
# smtplib 不会自动补。缺了它们,收件方的反垃圾引擎会显著加分
# ("来源不明的自动化邮件"),很容易被判成垃圾或进隔离区 ——
# 而发件服务器照样回 250,客户端完全看不出来。
# 实测本项目的邮件此前两个头都没有。
msg['Date'] = formatdate(localtime=True)
msg['Message-ID'] = make_msgid(domain=(cfg['sender'].split('@')[-1] or None))
msg.attach(MIMEText(content, 'plain', 'utf-8')) msg.attach(MIMEText(content, 'plain', 'utf-8'))
print(f"DEBUG: 准备向服务器提交发信请求,收件人: {recipients} 发件人: {cfg['username']}") print(f"DEBUG: 准备向服务器提交发信请求,收件人: {recipients} 发件人: {cfg['username']}")