如何在使用 Symfony Mailer 开发期间也将 BCC 发送到特定地址?

How to also send BCC to specific address during development with Symfony Mailer?

Symfony provides a way 在调试和开发期间将所有电子邮件发送到特定电子邮件地址,但 BCC 中的收件人仍会收到电子邮件。这非常危险,因为您不想从本地开发环境发送任何电子邮件。

有没有办法将 BCC 也发送到特定的电子邮件地址?

我现在想到的唯一方法是为邮件程序创建您自己的包装服务并检查环境是否是开发者只需删除密件抄送...反正您不需要它们。

我不会打折为 Mailer 提供您自己的包装服务。我不得不承认我经常这样做,因为我经常认为发送电子邮件与应用程序问题太接近了,我可能想要更多的自由和灵活性,而不是简单地将自己耦合到框架包,尽管它可能是好的.

也就是说,Symfony 更改收件人的方法不适用于 Bcc,因为 Bcc 消息的一部分 while the listener that changes the recipients manipulates the envelope.

您可以创建自己的 EventListener 来操纵密件抄送 header:

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mailer\Event\MessageEvent;
use Symfony\Component\Mime\Message;

class ManipulateBcc implements EventSubscriberInterface
{

    private bool $removeExisting;
    private array $forcedBcc;

    public function __construct(bool $removeExisting = false, array $forcedBcc = [])
    {
        $this->removeExisting = $removeExisting;
        $this->forcedBcc      = $forcedBcc;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            MessageEvent::class => ['onMessage', -224],
        ];
    }

    public function onMessage(MessageEvent $event): void
    {
        if ( ! $this->removeExisting) {
            return;
        }

        $message = $event->getMessage();
        if ( ! $message instanceof Message) {
            return;
        }
        $headers = $message->getHeaders();

        if ($headers->has('bcc')) {
            $headers->remove('bcc');
        }

        if ( ! empty($this->forcedBcc)) {
            $headers->addMailboxListHeader('bcc', $this->forcedBcc);
        }
    }
}

默认情况下,这什么都不做。使用默认配置,事件侦听器将为 运行,但由于 removeExisting 将为 false,侦听器将 return 不执行任何操作。

要启用它,您可以将以下内容添加到 services_dev.yaml,因此它仅在开发期间启用:

# config/services_dev.yaml

services:
  App\EventDispatcher\ManipulateBcc:
    autoconfigure: true
    arguments:
      $removeExisting: true
      $forcedBcc:
        - 'fake.email@mailinator.com'
        - 'even.faker@mailinator.com'

这是匆忙写的,你不能在不删除密件抄送的情况下强制密件抄送,这对许多用途来说可能就足够了,但对你自己来说可能不够。以此为起点,直到它满足您的需求。