Symfony Mailer使用TemplatedEmail发模板邮件报错:缺少内容部分
解决Symfony Mailer使用TemplatedEmail报错的问题
核心原因
你手动实例化Mailer时,没有为TemplatedEmail配置Twig模板渲染器。TemplatedEmail需要借助Twig解析并渲染模板内容,直接创建的Mailer实例不具备这个能力,导致模板无法转化为可识别的HTML内容,最终触发"A message must have a text or an HTML part or attachments."错误。
正确实现方式
方式1:依赖注入使用Mailer(推荐)
在控制器或服务中直接注入MailerInterface,Symfony会自动配置好Twig渲染环境:
use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Address; use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class YourController extends AbstractController { public function sendEmail(MailerInterface $mailer, string $userEmail) { $email = (new TemplatedEmail()) ->from(new Address('my_address', 'NAME')) ->to($userEmail) ->subject('Some text...') ->htmlTemplate('user/email.html.twig'); $mailer->send($email); } }
若注入后仍无法发送,检查以下内容:
- 确认已安装依赖包:
composer require symfony/twig-bundle symfony/mailer - 验证
.env中MAILER_DSN配置正确性,可通过命令测试:php bin/console mailer:test your-test-email@example.com
方式2:手动实例化时配置Twig渲染器
若必须手动创建Mailer,需手动传入Twig渲染器:
use Symfony\Component\Mailer\Mailer; use Symfony\Component\Mailer\Transport; use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Bridge\Twig\Mime\BodyRenderer; use Twig\Environment; // 从容器获取Twig环境实例 $twig = $container->get(Environment::class); $bodyRenderer = new BodyRenderer($twig); $transport = Transport::fromDsn($_ENV['MAILER_DSN']); $mailer = new Mailer($transport, null, $bodyRenderer); $email = (new TemplatedEmail()) ->from(new Address('my_address', 'NAME')) ->to($userEmail) ->subject('Some text...') ->htmlTemplate('user/email.html.twig'); $mailer->send($email);
额外排查点
- 确认模板路径
user/email.html.twig存在于templates/目录下,Linux环境需注意文件名大小写匹配。 - 可添加文本模板作为 fallback,排查模板渲染问题:
$email->textTemplate('user/email.txt.twig');
内容的提问来源于stack exchange,提问作者Andrei Nicolescu
相关产品推荐
相关产品推荐

