I have found a kludgey answer: get the transport from the MessageEvent that is dispatched immediately before the SentMessageEvent.
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;
...
}
}