Composer安装Symfony Mailer只需composer require symfony/mailer,但必须额外配置传输适配器(如symfony/smtp-mailer)并正确设置MAILER_DSN环境变量,否则会因无传输或使用NullTransport导致静默失败或抛出异常。

Composer 安装 Symfony Mailer 不需要额外“教程”,它就是一个标准的 Composer 包,直接 composer require 就行。但很多人卡在后续配置或发送失败上,问题不在安装本身,而在依赖、传输配置和环境适配。
composer require symfony/mailer 能不能直接跑起来
能,但只是“装上了”,不代表能发邮件。Mailer 本身不带传输实现,必须额外选一个传输组件(比如 SMTP、Sendmail、API 服务)。
-
symfony/mailer是核心接口和消息构建器,纯逻辑层 - 必须同时安装至少一个传输适配器,常见的是:
symfony/mailgun-mailer、symfony/postmark-mailer、symfony/amazon-mailer,或者最轻量的:symfony/smtp-mailer - 如果你只运行
composer require symfony/mailer,调用Mailer::send()时会抛出异常:Unable to send mail: no transport configured
本地开发用 SMTP 发测试邮件的最小可行配置
别一上来就折腾 Mailgun 或 Postmark,用 Gmail / Outlook / QQ 邮箱的 SMTP 最快验证通路。注意:Gmail 等主流邮箱已强制要求 App Password,不能再用账号密码直连。
- 启用两步验证后,在 Google 账户里生成一个 16 位
App Password(不是你登录密码) - 配置 URL 格式为:
smtp://@smtp.gmail.com:587?encryption=tls&auth_mode=login - 环境变量中设好:
MAILER_DSN=smtp://...(上面那串),Symfony 自动读取;Laravel 或纯 PHP 项目需手动传入new Dsn(...) - 注意端口和加密方式匹配:587 +
tls,或 465 +ssl;错一个就会连接超时或被拒绝
为什么 new \Symfony\Component\Mailer\Mailer() 后 send() 没反应也没报错
这是静默失败的典型表现,大概率是用了 Symfony\Component\Mailer\Transport\NullTransport(空传输),常出现在测试环境或未正确加载 DSN 时。
- 检查是否意外启用了
NullTransport:比如在test环境下 Symfony 默认禁用真实发送 - 确认
MAILER_DSN环境变量是否真的被读到——加一行var_dump($_ENV['MAILER_DSN'] ?? 'not set');验证 - 别依赖构造函数自动推断:显式传入传输实例更可控,例如:
new Mailer(new SmtpTransport(...)) - SMTP 连接失败时,默认行为是抛异常;但如果捕获了异常又没处理,就会“看起来没反应”
真正容易卡住的地方,从来不是 composer require 那一行,而是 DSN 格式写错、App Password 没开、防火墙拦了 587 端口,或者框架把传输悄悄换成了 NullTransport 却没提示。











