You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:55:33