diff --git a/src/Symfony/Component/Mailer/EventListener/MessageListener.php b/src/Symfony/Component/Mailer/EventListener/MessageListener.php index dbf2570a27eac..f23c69d91dc74 100644 --- a/src/Symfony/Component/Mailer/EventListener/MessageListener.php +++ b/src/Symfony/Component/Mailer/EventListener/MessageListener.php @@ -58,7 +58,7 @@ public function addHeaderRule(string $headerName, int $rule): void throw new InvalidArgumentException(sprintf('The "%d" rule is not supported.', $rule)); } - $this->headerRules[$headerName] = $rule; + $this->headerRules[strtolower($headerName)] = $rule; } public function onMessage(MessageEvent $event): void diff --git a/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php b/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php index 6096f5614cb2c..41f71f72adf37 100644 --- a/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php +++ b/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php @@ -101,5 +101,17 @@ public function provideHeaders(): iterable ->add(new MailboxListHeader('bcc', [new Address('bcc-initial@example.com'), new Address('bcc-default@example.com'), new Address('bcc-default-1@example.com')])) ; yield 'bcc, add another bcc (unique header)' => [$initialHeaders, $defaultHeaders, $expectedHeaders]; + + $initialHeaders = (new Headers()) + ->add(new UnstructuredHeader('foo', 'initial')) + ; + $defaultHeaders = (new Headers()) + ->add(new UnstructuredHeader('foo', 'bar')) + ->add(new UnstructuredHeader('bar', 'foo')) + ; + $rules = [ + 'Foo' => MessageListener::HEADER_REPLACE, + ]; + yield 'Capitalized header rule (case-insensitive), replace if set' => [$initialHeaders, $defaultHeaders, $defaultHeaders, $rules]; } } diff --git a/src/Symfony/Component/Mime/Header/Headers.php b/src/Symfony/Component/Mime/Header/Headers.php index 9493e2c2da234..b8d8da64f0718 100644 --- a/src/Symfony/Component/Mime/Header/Headers.php +++ b/src/Symfony/Component/Mime/Header/Headers.php @@ -143,7 +143,7 @@ public function addParameterizedHeader(string $name, string $value, array $param */ public function addHeader(string $name, $argument, array $more = []): self { - $parts = explode('\\', self::HEADER_CLASS_MAP[$name] ?? UnstructuredHeader::class); + $parts = explode('\\', self::HEADER_CLASS_MAP[strtolower($name)] ?? UnstructuredHeader::class); $method = 'add'.ucfirst(array_pop($parts)); if ('addUnstructuredHeader' === $method) { $method = 'addTextHeader'; @@ -217,7 +217,7 @@ public function remove(string $name): void public static function isUniqueHeader(string $name): bool { - return \in_array($name, self::UNIQUE_HEADERS, true); + return \in_array(strtolower($name), self::UNIQUE_HEADERS, true); } /** diff --git a/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php b/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php index 2255dbe7a7c8c..f465fb9e8515f 100644 --- a/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php +++ b/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php @@ -239,6 +239,20 @@ public function testRemoveIsNotCaseSensitive() $this->assertFalse($headers->has('Message-ID')); } + public function testAddHeaderIsNotCaseSensitive() + { + $headers = new Headers(); + $headers->addHeader('From', ['from@example.com']); + + $this->assertInstanceOf(MailboxListHeader::class, $headers->get('from')); + $this->assertEquals([new Address('from@example.com')], $headers->get('from')->getBody()); + } + + public function testIsUniqueHeaderIsNotCaseSensitive() + { + $this->assertTrue(Headers::isUniqueHeader('From')); + } + public function testToStringJoinsHeadersTogether() { $headers = new Headers();