必须正确配置symfony mailer组件:安装symfony/mailer、设置含auth_mode=login的mailer_dsn、禁用spool和异步队列、用mailerinterface同步发送,并通过context()传参调用templatedemail渲染templates/开头的twig模板。

要在Symfony项目中让邮件真正发出去,而不是卡在队列里或静默失败,必须绕过废弃的SwiftMailer、配对正确的DSN格式、禁用spool机制,并用MailerInterface调用同步发送——少一个环节,邮件就消失得无影无踪。
安装与启用Mailer组件
执行命令安装官方Mailer包:composer require symfony/mailer。
Symfony Flex会自动在config/bundles.php中注册MailerBundle,无需手动添加;若未注册,请确认该文件中存在MailerBundle::class => ['all' => true]这一行。
配置MAILER_DSN环境变量
打开.env文件,写入符合传输协议的DSN字符串。
本地开发直接用sendmail最省事:MAILER_DSN=sendmail://default,不用填账号密码,也不用开SMTP服务。
要用Gmail发,必须带?auth_mode=login参数:MAILER_DSN=gmail://your_email@gmail.com:your_app_password@default?auth_mode=login。注意:这里不是密码,而是Google账户开启“两步验证”后生成的16位应用专用密码。
【漏掉?auth_mode=login或写成?auth_mode=oauth】会导致连接被拒绝但无报错,邮件根本不会发出。
编写并发送一封基础邮件
在控制器或服务中注入MailerInterface:
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
构造Email对象并发送:
第一步:创建新邮件实例 → 第二步:设置发件人(必须是DSN中认证过的邮箱) → 第三步:指定收件人 → 第四步:设定主题和正文 → 第五步:调用$mailer->send($email)。
完整代码示例:
$email = (new Email())→from('notify@example.com')→to('user@test.com')→subject('欢迎注册')→text('感谢您加入我们。')→html('
欢迎注册
点击下方链接激活账户
');$mailer->send($email);
使用Twig模板发送HTML邮件
方法一:用TemplatedEmail加载模板
模板路径必须以templates/开头,例如templates/email/welcome.html.twig,调用时只传相对路径:'email/welcome.html.twig'。
变量必须通过->context(['user' => $user])传入,不能用->with()——否则模板里{{ user.name }}取不到值。
方法二:确保已安装twig-pack:composer require twig-pack,否则TemplatedEmail无法解析Twig语法。
示例:
$email = (new TemplatedEmail())→from('no-reply@example.com')→to('user@test.com')→subject('账户激活')→htmlTemplate('email/welcome.html.twig')→context(['user' => $user, 'token' => $token]);$mailer->send($email);
避免邮件静默失败的关键检查项
检查config/packages/mailer.yaml是否残留spool:配置——Symfony 6.2+已移除spool支持,留着它会让Mailer悄悄fallback到null://,结果就是一封邮件都发不出。
如果你启用了Messenger异步队列,邮件会被塞进messenger.transport.async,但不运行php bin/console messenger:consume,它就永远躺在数据库里不动。
开发阶段请显式指定传输方式:
framework: mailer: transport: 'smtp'
而不是留空或设为null。











