必须先配置 mailer 组件并注册邮件传输,否则调用 send() 会抛出异常;安装命令为 composer require symfony/mailer,自动注册 mailerbundle;需在 mailer.yaml 中配置 dsn,如 smtp://localhost:1025。

要在 Symfony 项目中发送邮件,必须先配置 Mailer 组件并注册一个邮件传输(transport),否则调用 Mailer::send() 会抛出未配置传输的异常,整个邮件功能直接失效。
安装 Mailer 组件
运行命令安装核心组件:composer require symfony/mailer。
这一步会自动加载 symfony/mailer 和依赖的 symfony/mime,无需手动启用 Bundle——Symfony 6.3+ 会通过 Flex 自动注册 MailerBundle。
配置传输方式
Mailer 需要至少一种 transport 才能发信,否则服务容器里 mailer.default_transport 无法解析。
打开 config/packages/mailer.yaml(若不存在则新建),写入以下内容:
# config/packages/mailer.yaml
framework:
mailer:
dsn: 'smtp://localhost:1025'
这个 DSN 使用本地 SMTP 服务(如 MailHog 或 Symfony CLI 的内置 mailer),适合开发环境;生产环境请替换为真实 SMTP 地址,例如 smtp://user:pass@smtp.gmail.com:587。
【DSN 格式错误会导致容器编译失败,且报错信息不明确】
创建可复用的邮件服务类
方法一:直接注入 MailerInterface 并封装发送逻辑
在 src/Service/EmailService.php 中定义:
namespace App\Service;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
class EmailService
{
public function __construct(private MailerInterface $mailer) {}
public function sendWelcomeEmail(string $to, string $name): void
{
$email = (new Email())
->from('no-reply@example.com')
->to($to)
->subject("欢迎,{$name}!")
->text("感谢注册。")
->html(" 感谢注册:{$name}。
$this->mailer->send($email);
}
}
方法二:使用邮件模板 + Twig 渲染 HTML 内容
先创建模板 templates/emails/welcome.html.twig,再在服务中注入 Twig\Environment,用 $twig->render('emails/welcome.html.twig', ['name' => $name]) 替代硬编码的 HTML 字符串。
这一步避免 HTML 逻辑散落在 PHP 类中,便于前端协作和多语言支持。
在控制器中调用邮件服务
第一步:在控制器构造函数中声明依赖
use App\Service\EmailService;
第二步:将 EmailService 注入到控制器中
public function __construct(private EmailService $emailService) {}
第三步:在某个 action 方法里触发发送
public function register(Request $request): Response
{
// ... 处理表单逻辑
$this->emailService->sendWelcomeEmail($user->getEmail(), $user->getName());
return $this->redirectToRoute('app_home');
}











