使用Python EmailMessage与smtplib发送邮件未收到问题求助
排查方案:邮件发送成功但收件方未收到
核心问题分析
从SMTP日志来看,所有交互步骤均返回2xx成功状态,说明邮件已被发件SMTP服务器(hostmonster)接受,但在后续路由到收件方邮箱的过程中被拦截或丢弃,问题并非出在代码执行层面。以下是针对性排查步骤:
1. 修复邮件头缺失的To字段
你的代码中EmailMessage对象仅设置了From和Subject,未添加To字段。虽然send_message方法传递了to_addrs参数,但邮件本身的头部缺少收件人信息,部分邮件服务商(如Gmail)会将此类不规范邮件直接拦截。
修改代码:
emsg = EmailMessage() emsg.set_content(msg) emsg['Subject'] = Subject emsg['From'] = from_addr emsg['To'] = To # 新增这一行
2. 校验发件域名的SPF/DKIM/DMARC记录
绝大多数主流邮箱服务商(Gmail、Outlook等)会严格校验发件域名的邮件认证记录,缺少或不正确的记录会导致邮件被直接拦截:
- SPF记录:确认发件域名(
*****.com)的SPF记录包含hostmonster的SMTP服务器IP或域名,证明该服务器有权限发送此域名的邮件。 - DKIM/DMARC:未配置DKIM签名和DMARC规则会大幅提升邮件被拦截的概率,可登录域名管理后台补充配置。
3. 查看发件服务商的邮件队列与退信记录
客户端日志显示发送成功,但hostmonster可能在后续路由时收到收件方的拒收通知,这类信息不会返回给客户端,需要登录hostmonster的邮件管理后台:
- 检查发件队列是否有滞留邮件
- 查看退信日志,确认是否存在收件方服务器的拒收提示(如“SPF校验失败”“域名未认证”等)
4. 测试同域名收件地址
尝试发送邮件到与发件地址同域名的邮箱(如xxx@*****.com),如果能正常收到,说明问题集中在跨域名的邮件认证环节,进一步指向SPF/DKIM/DMARC配置问题。
5. 检查邮件内容与发送频率
- 若邮件内容过于简洁、重复发送相同内容,可能被判定为垃圾邮件(部分服务商直接静默丢弃,不进入垃圾邮件文件夹)
- 尝试发送包含更多信息的测试邮件(如添加签名、换行、不同主题),观察是否能正常接收
代码额外优化点
异常捕获存在语法错误:except smtplib as e应改为except smtplib.SMTPException as e,否则无法正确捕获SMTP相关异常。
内容的提问来源于stack exchange,提问作者gprade
相关产品推荐
相关产品推荐

