如何调试Symfony Mailer邮件投递失败问题
Symfony 5 MailerInterface 无报错收不到邮件排查方案
第一步:确认应用层是否成功发送邮件
- 开启Mailer调试日志,在
config/packages/framework.yaml中新增配置:
framework: mailer: logger: true
日志会写入var/log/目录下对应环境的日志文件,搜索Mailer相关关键词可查看完整的SMTP交互记录、传输层返回的错误信息,这类底层错误默认不会向上抛出异常。
- 检查是否安装了
symfony/messenger组件:如果已安装,Mailer默认会将邮件发送任务放入异步队列,若未启动队列消费者,邮件会一直积压在队列中不会发送。你可以执行命令启动消费者测试:
php bin/console messenger:consume async
也可以临时修改为同步发送排除队列影响,在config/packages/messenger.yaml中配置:
framework: messenger: routing: 'Symfony\Component\Mailer\Messenger\SendEmailMessage': sync
- 检查dev环境特殊配置:查看
config/packages/dev/mailer.yaml是否开启了disable_delivery: true,或者配置了全局收件人重定向,导致邮件没有发送到目标地址。 - 本地测试可以搭配MailHog等邮件捕获工具,将
MAILER_DSN改为smtp://127.0.0.1:1025(对应MailHog默认SMTP端口),如果MailHog能收到邮件,说明应用层发送逻辑正常,问题出在传输层。
第二步:确认传输层是否成功投递
- 若使用
sendmail传输,直接查看系统邮件日志,通常路径为/var/log/mail.log或/var/log/maillog,可查看sendmail是否接收到投递请求、是否被远端服务器拒收、退信原因等信息。 - 若使用第三方SMTP服务,直接登录对应服务商后台查看发件明细、投递日志,大部分SMTP服务商都会记录投递成功、拒收、被标记为垃圾邮件的具体原因。
第三步:确认是否被收件方服务器拒收
- 更换不同的公共邮箱作为收件人测试,排除特定收件域名的拦截规则影响。
- 检查发件域名的SPF、DKIM配置是否完整,没有配置对应解析记录的发件域名很容易被收件方直接拒收,且不会产生退信。
内容的提问来源于stack exchange,提问作者Andrei Herford
相关产品推荐
相关产品推荐

