Skip to content

Commit 4e29672

Browse files
author
Giorgio Premi
committed
MailerInterface: failed exception contract when enabling messenger
The interface for MailerInterface::send states that exception for transport failures are sent as TransportExceptionInterface, which make perfectly sense and allows to create solid UI. If at later stage the Messenger component is enabled, the mail will be rewired into a dispatched message, which by default is synchronous. This cause all exception to be wrapped into HandlerFailedException which doesn't the interface contract. In the end the UI is broken, and the exception HandlerFailedException, even if caught, is totally unrelated to the usage context as it is only related to configuration details. This patch will unwrap the underlying MailTransportInterface exception if available for the handler exception.
1 parent 8f5a6b9 commit 4e29672

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/Symfony/Component/Mailer/Mailer.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313

1414
use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;
1515
use Symfony\Component\Mailer\Event\MessageEvent;
16+
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
1617
use Symfony\Component\Mailer\Messenger\SendEmailMessage;
1718
use Symfony\Component\Mailer\Transport\TransportInterface;
19+
use Symfony\Component\Messenger\Exception\HandlerFailedException;
1820
use Symfony\Component\Messenger\MessageBusInterface;
1921
use Symfony\Component\Mime\RawMessage;
2022
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
@@ -50,6 +52,15 @@ public function send(RawMessage $message, Envelope $envelope = null): void
5052
$this->dispatcher->dispatch($event);
5153
}
5254

53-
$this->bus->dispatch(new SendEmailMessage($message, $envelope));
55+
try {
56+
$this->bus->dispatch(new SendEmailMessage($message, $envelope));
57+
} catch (HandlerFailedException $e) {
58+
foreach ($e->getNestedExceptions() as $nested) {
59+
if ($nested instanceof TransportExceptionInterface) {
60+
throw $nested;
61+
}
62+
}
63+
throw $e;
64+
}
5465
}
5566
}

0 commit comments

Comments
 (0)