Symfony测试模式邮件:添加真实收件人信息至邮件正文
这个问题我之前在Symfony 3.4项目里也碰到过,每次查X-Swift-To确实麻烦,后来用Swiftmailer的事件监听器完美解决了,直接把真实收件人加到邮件正文开头,分享给你:
解决方案:用事件监听器在开发环境自动添加真实收件人信息
核心思路是利用Symfony集成Swiftmailer提供的发送事件,在邮件发送前拦截并修改正文,插入原始收件人信息,而且只在开发环境生效,不会影响生产环境。
1. 创建事件监听器类
在你的Bundle下新建一个EventListener文件:
// src/AppBundle/EventListener/DevEmailOverrideListener.php namespace AppBundle\EventListener; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Swiftmailer\Event\SendEvent; use Symfony\Component\Swiftmailer\SwiftmailerEvents; use Symfony\Component\HttpKernel\KernelInterface; class DevEmailOverrideListener implements EventSubscriberInterface { private $kernel; private $deliveryAddress; public function __construct(KernelInterface $kernel, string $deliveryAddress) { $this->kernel = $kernel; $this->deliveryAddress = $deliveryAddress; } public static function getSubscribedEvents() { return [ SwiftmailerEvents::SEND => 'onSend', ]; } public function onSend(SendEvent $event) { // 只在开发环境执行逻辑 if ($this->kernel->getEnvironment() !== 'dev') { return; } $message = $event->getMessage(); // 收集所有原始收件人(To/Cc/Bcc) $originalRecipients = []; // 处理To收件人 foreach ($message->getTo() as $email => $name) { $originalRecipients[] = !empty($name) ? "$name <$email>" : $email; } // 处理Cc收件人 foreach ($message->getCc() as $email => $name) { $originalRecipients[] = !empty($name) ? "CC: $name <$email>" : "CC: $email"; } // 处理Bcc收件人 foreach ($message->getBcc() as $email => $name) { $originalRecipients[] = !empty($name) ? "BCC: $name <$email>" : "BCC: $email"; } if (empty($originalRecipients)) { return; } // 构建要插入的提示文本 $hintText = "⚠️ 开发环境转发提示:此邮件原本的收件人是:\n" . implode("\n", $originalRecipients) . "\n\n"; // 根据邮件类型(HTML/纯文本)处理换行 $body = $message->getBody(); if ($message->getContentType() === 'text/html') { $formattedHint = str_replace("\n", "<br>", $hintText); $message->setBody($formattedHint . $body); } else { $message->setBody($hintText . $body); } // 同时处理邮件的子部分(比如多格式邮件的纯文本/HTML分块) foreach ($message->getChildren() as $part) { if ($part instanceof \Swift_MimePart) { $partBody = $part->getBody(); if ($part->getContentType() === 'text/html') { $part->setBody(str_replace("\n", "<br>", $hintText) . $partBody); } else { $part->setBody($hintText . $partBody); } } } } }
2. 配置监听器服务
在app/config/services.yml里注册这个监听器,注入内核和配置的delivery_address参数:
services: app.dev_email_override_listener: class: AppBundle\EventListener\DevEmailOverrideListener arguments: - '@kernel' - '%swiftmailer.delivery_address%' tags: - { name: kernel.event_subscriber }
效果说明
这样配置后,只要你在config_dev.yml里开启了swiftmailer: delivery_address: "development.email@myProjectDomain.com",所有发出去的邮件正文开头都会显示原始的收件人列表(包括To、Cc、Bcc),不管是HTML还是纯文本邮件都能正确显示,再也不用去翻邮件头找X-Swift-To了!
内容的提问来源于stack exchange,提问作者Mathias Bader
相关产品推荐
相关产品推荐

