Python3中smtp.sendmail偶尔无法发送邮件主题的原因是什么?
邮件偶发丢失主题的诱因
- 核心诱因是主题字段未做邮件头规范编码处理:当主题包含非ASCII字符(如中文、特殊符号)、换行/回车符,或内容过长时,直接赋值给
msg['Subject']生成的邮件头不符合RFC 2047规范,部分SMTP服务器或邮件客户端解析时会识别失败,丢弃主题字段。 - 偶发的特性正好对应触发条件的偶发:仅当主题满足上述异常特征时才会出现问题,普通短英文主题场景下可以正常运行。
修复方案
- 导入
email.header.Header工具类,对主题做标准化编码后再赋值,自动兼容特殊字符、自动处理超长折叠:
# 顶部先导入依赖 from email.header import Header # 替换原有的msg['Subject'] = subject代码 subject = subject.replace('\n', ' ').replace('\r', '').strip() msg['Subject'] = Header(subject, codificacion).encode()
- 若需兼容特别旧的邮件客户端,可同时校验主题长度,避免超过78字符的邮件头建议长度,超出部分可酌情截断。
修复后可通过代码中打印的msg.as_string()输出验证:符合规范的编码后主题会以=?utf-8?b?xxx?=或=?utf-8?q?xxx?=的格式展示,无非法换行、乱码片段。
内容的提问来源于stack exchange,提问作者sofia peralta
相关产品推荐
相关产品推荐

