From 7e60a8f8c94314fab4eb073ecd1bb41ad0f05228 Mon Sep 17 00:00:00 2001 From: Clara van Miert Date: Wed, 19 Aug 2020 17:08:06 +0200 Subject: [PATCH] [Mailer] Reorder headers used to determine Sender Use the `Return-Path` header as the last candidate to determine the Envelope's sender address. The `Return-Path` is usually configured _in addition_ to the `Sender` and/or `From` header: it allows for email bounces and complaints to be sent to a dedicated email address. It should therefore not be used as the first candidate header to determine the sender. --- .../Component/Mailer/DelayedEnvelope.php | 6 +++--- .../Component/Mailer/Tests/EnvelopeTest.php | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Mailer/DelayedEnvelope.php b/src/Symfony/Component/Mailer/DelayedEnvelope.php index e892984cb4..58a957dbaa 100644 --- a/src/Symfony/Component/Mailer/DelayedEnvelope.php +++ b/src/Symfony/Component/Mailer/DelayedEnvelope.php @@ -83,15 +83,15 @@ final class DelayedEnvelope extends Envelope private static function getSenderFromHeaders(Headers $headers): Address { - if ($return = $headers->get('Return-Path')) { - return $return->getAddress(); - } if ($sender = $headers->get('Sender')) { return $sender->getAddress(); } if ($from = $headers->get('From')) { return $from->getAddresses()[0]; } + if ($return = $headers->get('Return-Path')) { + return $return->getAddress(); + } throw new LogicException('Unable to determine the sender of the message.'); } diff --git a/src/Symfony/Component/Mailer/Tests/EnvelopeTest.php b/src/Symfony/Component/Mailer/Tests/EnvelopeTest.php index bfd72f05b5..59266c56f2 100644 --- a/src/Symfony/Component/Mailer/Tests/EnvelopeTest.php +++ b/src/Symfony/Component/Mailer/Tests/EnvelopeTest.php @@ -81,6 +81,24 @@ class EnvelopeTest extends TestCase $this->assertEquals($from, $e->getSender()); } + public function testSenderFromHeadersWithMulitpleHeaders() + { + $headers = new Headers(); + $headers->addMailboxListHeader('From', [$from = new Address('from@symfony.com', 'from'), 'some@symfony.com']); + $headers->addPathHeader('Return-Path', $return = new Address('return@symfony.com', 'return')); + $headers->addMailboxHeader('Sender', $sender = new Address('sender@symfony.com', 'sender')); + $headers->addMailboxListHeader('To', ['to@symfony.com']); + $e = Envelope::create(new Message($headers)); + $this->assertEquals($sender, $e->getSender()); + + $headers = new Headers(); + $headers->addMailboxListHeader('From', [$from = new Address('from@symfony.com', 'from'), 'some@symfony.com']); + $headers->addPathHeader('Return-Path', $return = new Address('return@symfony.com', 'return')); + $headers->addMailboxListHeader('To', ['to@symfony.com']); + $e = Envelope::create(new Message($headers)); + $this->assertEquals($from, $e->getSender()); + } + public function testRecipientsFromHeaders() { $headers = new Headers();