PHPMailer 6.0.5 SMTP中继问题:发送记录正常但邮件丢失
邮件发送成功但丢失问题的排查分析
咱先梳理下你的情况:用Postfix+PHP mail()时,日志显示中继成功但邮件丢了;换成最新PHPMailer后问题依旧,不过命令行能正常发测试邮件。从你贴的PHPMailer日志来看,有个非常关键的点——日志在DATA命令之后只输出了部分邮件头就中断了,没有看到邮件正文、结束标记.,也没有服务器返回的250 2.0.0 Ok这类确认邮件提交成功的响应。
可能的原因及排查步骤
1. 邮件发送过程中被中断
日志不完整说明PHPMailer在发送邮件内容阶段可能遇到了异常,但没被完整捕获。你可以:
- 完善PHPMailer的错误捕获逻辑:在发送代码里加上try-catch,确保能拿到详细错误信息,示例代码:
try { $mail->send(); echo '邮件发送成功'; } catch (Exception $e) { echo "邮件发送失败:{$mail->ErrorInfo}"; }
- 检查PHP运行日志:查看服务器上的PHP error_log文件,找有没有脚本超时、内存不足、函数被禁用(比如
fsockopen)这类错误,这些都可能导致发送中途中断。
2. 邮件被中继/收件方服务器静默丢弃
虽然Postfix或SMTP中继日志显示“成功”,但很多邮件服务商会因为认证或内容问题直接静默丢弃邮件,不返回错误:
- 验证SPF/DKIM/DMARC配置:
- SPF:确保你信封发件人(就是日志里的
MAIL FROM地址)的域名SPF记录包含include:smtp.api.createsend.com,因为你用的是这个中继服务器 - DKIM:如果你的平台支持,在PHPMailer里开启DKIM签名,配置好域名、选择器和私钥,这能大幅提升邮件可信度
- DMARC:查一下收件人域名的DMARC记录,如果是
p=reject,那未通过SPF/DKIM认证的邮件会被直接拒收
- SPF:确保你信封发件人(就是日志里的
- 联系中继服务器支持:找smtp.api.createsend.com的技术支持,查他们那边的邮件记录,确认邮件是不是被接收后又被下游丢弃,以及具体原因。
3. 平台软件的邮件发送逻辑问题
基础测试脚本正常,但平台里不行,大概率是平台内部的配置或逻辑有问题:
- 核对邮件参数:检查平台里设置的发件人地址、收件人地址格式是否正确,有没有和SMTP认证账号不匹配的情况(有些中继要求发件人必须是认证账号所属域名)
- 测试平台邮件内容:把平台里要发送的邮件内容(包括附件、特殊字符)复制到你的基础测试脚本里发送,看是否能成功,排除内容本身的问题
- 检查循环发送逻辑:如果是批量发送,看看平台里有没有正确重置PHPMailer实例,避免因为复用实例导致的发送异常
总结
目前来看,最优先的是补全错误捕获,拿到PHPMailer的完整错误信息,同时检查PHP运行日志;其次验证域名的邮件认证配置,这是静默丢件的常见原因。
内容的提问来源于stack exchange,提问作者Azkatro
相关产品推荐
相关产品推荐

