From dc91a0907de30cf85729b2646b03e33c36dcd0f5 Mon Sep 17 00:00:00 2001 From: Rutger Hertogh Date: Wed, 22 May 2024 21:42:40 +0200 Subject: [PATCH] [Mime] Fixed `Mime\Message::ensureValidity()` when a required header is set, but has an empty body --- src/Symfony/Component/Mime/Message.php | 4 +- .../Component/Mime/Tests/MessageTest.php | 67 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Mime/Message.php b/src/Symfony/Component/Mime/Message.php index 639b26b521b73..dbc3ded21bfa5 100644 --- a/src/Symfony/Component/Mime/Message.php +++ b/src/Symfony/Component/Mime/Message.php @@ -124,11 +124,11 @@ public function toIterable(): iterable public function ensureValidity() { - if (!$this->headers->has('To') && !$this->headers->has('Cc') && !$this->headers->has('Bcc')) { + if (!$this->headers->get('To')?->getBody() && !$this->headers->get('Cc')?->getBody() && !$this->headers->get('Bcc')?->getBody()) { throw new LogicException('An email must have a "To", "Cc", or "Bcc" header.'); } - if (!$this->headers->has('From') && !$this->headers->has('Sender')) { + if (!$this->headers->get('From')?->getBody() && !$this->headers->get('Sender')?->getBody()) { throw new LogicException('An email must have a "From" or a "Sender" header.'); } diff --git a/src/Symfony/Component/Mime/Tests/MessageTest.php b/src/Symfony/Component/Mime/Tests/MessageTest.php index 308eb8f7179db..6d981e7eb1f6d 100644 --- a/src/Symfony/Component/Mime/Tests/MessageTest.php +++ b/src/Symfony/Component/Mime/Tests/MessageTest.php @@ -276,4 +276,71 @@ public function testSymfonySerialize() $serialized = $serializer->serialize($e, 'json'); $this->assertSame($expectedJson, json_encode(json_decode($serialized), \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); } + + /** + * @dataProvider ensureValidityProvider + */ + public function testEnsureValidity(array $headers, ?string $exceptionClass, ?string $exceptionMessage) + { + if ($exceptionClass) { + $this->expectException($exceptionClass); + $this->expectExceptionMessage($exceptionMessage); + } else { + $this->expectNotToPerformAssertions(); + } + + $m = new Message(); + foreach ($headers as $headerName => $headerValue) { + $m->getHeaders()->addMailboxListHeader($headerName, $headerValue); + } + $m->ensureValidity(); + } + + public function ensureValidityProvider() + { + return [ + 'Valid address fields' => [ + [ + 'To' => ['dummy@symfony.com'], + 'From' => ['test@symfony.com'], + ], + null, + null, + ], + + 'No destination address fields' => [ + [ + 'From' => ['test@symfony.com'], + ], + LogicException::class, + 'An email must have a "To", "Cc", or "Bcc" header.', + ], + + 'Empty destination address fields' => [ + [ + 'To' => [], + 'From' => ['test@symfony.com'], + ], + LogicException::class, + 'An email must have a "To", "Cc", or "Bcc" header.', + ], + + 'No originator fields' => [ + [ + 'To' => ['dummy@symfony.com'], + ], + LogicException::class, + 'An email must have a "From" or a "Sender" header.', + ], + + 'Empty originator fields' => [ + [ + 'To' => ['dummy@symfony.com'], + 'From' => [], + ], + LogicException::class, + 'An email must have a "From" or a "Sender" header.', + ], + ]; + } }