Symfony发邮件必须使用Mailer组件并严格配置DSN:Gmail需smtp://u:p@smtp.gmail.com:587?encryption=tls&auth_mode=login;SendGrid用smtp://apikey:SG.xxxx@smtp.sendgrid.net:587?encryption=tls;Mailgun SMTP同理。配置错误将静默失败,须用php bin/console debug:config mailer验证DSN是否生效。

Symfony 发邮件用的是 Mailer 组件,不是 SwiftMailer(已废弃)。配置对了才能发,配错一个字符——比如漏掉 ?auth_mode=login 或写错端口——它就静默失败:不报错、不提示、邮件根本没出去。
SMTP 配置必须严格按 DSN 格式
DSN 是核心,格式为:scheme://user:pass@host:port?opt1=val1&opt2=val2
- Gmail 必须带
&auth_mode=login,且端口 587 对应&encryption=tls;465 端口则用&encryption=ssl - 别写
smtps://,Mailer 不识别,会 fallback 到null:// - 本地开发推荐:
sendmail://default(免认证)或smtp://localhost:1025(配合 MailHog 查看) - .env 中写法要干净:
MAILER_DSN=smtp://u:p@smtp.gmail.com:587?encryption=tls&auth_mode=login,不能有空格或注释
第三方服务如 SendGrid、Mailgun 的写法
它们通常不需要 auth_mode,但加密方式仍需匹配:
- SendGrid:
MAILER_DSN=smtp://apikey:SG.xxxx@smtp.sendgrid.net:587?encryption=tls - Mailgun(API 方式):
MAILER_DSN=mailgun://key:987654321@default?region=us - Mailgun(SMTP 方式):
MAILER_DSN=smtp://postmaster@sandbox123.mailgun.org:password@smtp.mailgun.org:587?encryption=tls
验证配置是否生效
运行命令检查实际加载的传输配置:
php bin/console debug:config mailer- 确认输出中
transports下显示的是你写的完整 DSN,而不是null://或空值 - 若看到
null://,说明环境变量未读取或 YAML 配置被覆盖
发送命令行邮件(调试用)
可直接在终端触发一次发送,绕过控制器:
- 创建一个简单命令类,注入
MailerInterface和Email - 在
execute()中构建并发送:(new Email())->to('test@example.com')->subject('CLI Test')->text('Sent from console')->html('<p>Hello</p>') - 执行:
php bin/console app:send-test-mail - 加
try-catch捕获TransportExceptionInterface,便于定位连接或认证问题

















