Skip to content

Commit 989175a

Browse files
committed
bug symfony#44839 MailerInterface: failed exception contract when enabling messenger (Giorgio Premi)
This PR was merged into the 4.4 branch. Discussion ---------- MailerInterface: failed exception contract when enabling messenger | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | no | License | MIT | Doc PR | likely not required... 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. PS: don't know if make sense to add a phpunit test for this cross-component scenario, if so I'll try. Also, this will restore compatibility with interface, but I don't if it's to be considered a BC (strictly speaking, it may be) Commits ------- 4e29672 MailerInterface: failed exception contract when enabling messenger
2 parents 392d88e + 4e29672 commit 989175a

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)