我正在尝试找到一种方法来确定邮件程序发送消息后使用哪种传输方式发送消息。
我的 Symfony 配置在 config/packages/mailer.yaml 中定义了 3 个传输:
mailer:
transports:
failover: '%env(FAILOVER_MAILER_DSN)%'
mailgun: '%env(MAILGUN_MAILER_DSN)%'
admin: '%env(SMTP_MAILER_DSN)%'
FAILOVER_MAILER_DSN 组合了其他两个 DSN。
我无法从发送消息时调度的 SentMessageEvent 获取传输使用的信息。
如果我在消息中设置 X-Transport 标头以选择“故障转移”以外的传输,我可以从 MessageEvent 中的消息中获取该标头的值,但如果未设置 X-Transport 标头,我无法判断其哪个组件传输所使用的故障转移传输。
我找到了一个复杂的答案:从在 SentMessageEvent 之前立即调度的 MessageEvent 获取传输。
class EmailMessageSubscriber implements EventSubscriberInterface
{
private array $messageTransport = [];
public static function getSubscribedEvents(): array
{
return [
SentMessageEvent::class => 'onSentMessageEvent',
MessageEvent::class => ['onMessageEvent', -256],
];
}
public function onMessageEvent(MessageEvent $event): void
{
if ($event->isQueued()) {
return;
}
$message = $event->getMessage();
$this->messageTransport[spl_object_id($message)] = $event->getTransport();
}
public function onSentMessageEvent(SentMessageEvent $event): void
{
$sentMessage = $event->getMessage();
$transport = $this->messageTransport[spl_object_id($sentMessage->getOriginalMessage())] ?? null;
...
}
}