3

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

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

4

2 回答 2

3

我不会打折拥有自己的包装服务Mailer。我不得不承认我通常会这样做,因为我通常认为发送电子邮件过于接近应用程序问题,并且我可能想要更多的自由和灵活性,而不是简单地将自己耦合到框架包,尽可能好.

话虽如此,Symfony 更改接收者的方法不起作用Bcc,因为Bcc它是消息的一部分,而更改接收者的侦听器会操纵信封

您可以创建自己的 EventListener 来操作密件抄送标头:

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);
        }
    }
}

默认情况下,这什么也不做。使用默认配置, eventlistener 将运行,但因为removeExistingwill be false,监听器将返回而不做任何事情。

要启用它,您可以将以下内容添加到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'

这是仓促写的,如果不删除密件抄送,就不能强制密件抄送,这对于许多目的来说可能就足够了,但对你自己来说可能不是。以此为起点,直到它满足您的需求。

于 2020-11-21T10:01:43.987 回答
-1

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

于 2020-11-21T08:02:51.267 回答