From d1138b22669dde846bf25cb20deea7b06d3c6ec3 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 27 Jul 2022 15:28:30 +0200 Subject: [PATCH] [Mailer] Add new events --- src/Symfony/Component/Mailer/CHANGELOG.md | 1 + .../Mailer/Event/FailedMessageEvent.php | 37 +++++++++++++++++++ .../Mailer/Event/SentMessageEvent.php | 30 +++++++++++++++ .../Mailer/Transport/AbstractTransport.php | 31 +++++++++++++--- 4 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 src/Symfony/Component/Mailer/Event/FailedMessageEvent.php create mode 100644 src/Symfony/Component/Mailer/Event/SentMessageEvent.php diff --git a/src/Symfony/Component/Mailer/CHANGELOG.md b/src/Symfony/Component/Mailer/CHANGELOG.md index 9b6b2ffd4753e..772f50717334f 100644 --- a/src/Symfony/Component/Mailer/CHANGELOG.md +++ b/src/Symfony/Component/Mailer/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Add a `mailer:test` command + * Add `SentMessageEvent` and `FailedMessageEvent` events 6.1 --- diff --git a/src/Symfony/Component/Mailer/Event/FailedMessageEvent.php b/src/Symfony/Component/Mailer/Event/FailedMessageEvent.php new file mode 100644 index 0000000000000..4808c659d1fec --- /dev/null +++ b/src/Symfony/Component/Mailer/Event/FailedMessageEvent.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mailer\Event; + +use Symfony\Component\Mime\RawMessage; +use Symfony\Contracts\EventDispatcher\Event; + +/** + * @author Fabien Potencier + */ +final class FailedMessageEvent extends Event +{ + public function __construct( + private RawMessage $message, + private \Throwable $error, + ) { + } + + public function getMessage(): RawMessage + { + return $this->message; + } + + public function getError(): \Throwable + { + return $this->error; + } +} diff --git a/src/Symfony/Component/Mailer/Event/SentMessageEvent.php b/src/Symfony/Component/Mailer/Event/SentMessageEvent.php new file mode 100644 index 0000000000000..a412a9f46e609 --- /dev/null +++ b/src/Symfony/Component/Mailer/Event/SentMessageEvent.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mailer\Event; + +use Symfony\Component\Mailer\SentMessage; +use Symfony\Contracts\EventDispatcher\Event; + +/** + * @author Fabien Potencier + */ +final class SentMessageEvent extends Event +{ + public function __construct(private SentMessage $message) + { + } + + public function getMessage(): SentMessage + { + return $this->message; + } +} diff --git a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php index 8ad8468d8d9f7..4619778724e1f 100644 --- a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php +++ b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php @@ -15,7 +15,9 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Symfony\Component\Mailer\Envelope; +use Symfony\Component\Mailer\Event\FailedMessageEvent; use Symfony\Component\Mailer\Event\MessageEvent; +use Symfony\Component\Mailer\Event\SentMessageEvent; use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\RawMessage; @@ -58,18 +60,35 @@ public function send(RawMessage $message, Envelope $envelope = null): ?SentMessa $message = clone $message; $envelope = null !== $envelope ? clone $envelope : Envelope::create($message); - if (null !== $this->dispatcher) { + try { + if (!$this->dispatcher) { + $sentMessage = new SentMessage($message, $envelope); + $this->doSend($sentMessage); + + return $sentMessage; + } + $event = new MessageEvent($message, $envelope, (string) $this); $this->dispatcher->dispatch($event); $envelope = $event->getEnvelope(); - } - $message = new SentMessage($message, $envelope); - $this->doSend($message); + $sentMessage = new SentMessage($message, $envelope); - $this->checkThrottling(); + try { + $this->doSend($sentMessage); + } catch (\Throwable $error) { + $this->dispatcher->dispatch(new FailedMessageEvent($message, $error)); + $this->checkThrottling(); - return $message; + throw $error; + } + + $this->dispatcher->dispatch(new SentMessageEvent($sentMessage)); + + return $sentMessage; + } finally { + $this->checkThrottling(); + } } abstract protected function doSend(SentMessage $message): void;