diff --git a/src/Illuminate/Mail/Transport/SesTransport.php b/src/Illuminate/Mail/Transport/SesTransport.php index 7ef78eb582fa..dd1585db2d64 100644 --- a/src/Illuminate/Mail/Transport/SesTransport.php +++ b/src/Illuminate/Mail/Transport/SesTransport.php @@ -50,6 +50,11 @@ protected function doSend(SentMessage $message): void $options = $this->options; if ($message->getOriginalMessage() instanceof Message) { + if ($header = $message->getOriginalMessage()->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) { + if (preg_match("/^(contactListName=)*(?[^;]+)(;\s?topicName=(?.+))?$/ix", $header->getBodyAsString(), $listManagementOptions)) { + $options['ListManagementOptions'] = array_filter($listManagementOptions, fn ($e) => \in_array($e, ['ContactListName', 'TopicName']), \ARRAY_FILTER_USE_KEY); + } + } foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) { if ($header instanceof MetadataHeader) { $options['Tags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()]; diff --git a/src/Illuminate/Mail/Transport/SesV2Transport.php b/src/Illuminate/Mail/Transport/SesV2Transport.php index e874e583abd5..0a4bac7f218e 100644 --- a/src/Illuminate/Mail/Transport/SesV2Transport.php +++ b/src/Illuminate/Mail/Transport/SesV2Transport.php @@ -50,6 +50,11 @@ protected function doSend(SentMessage $message): void $options = $this->options; if ($message->getOriginalMessage() instanceof Message) { + if ($header = $message->getOriginalMessage()->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) { + if (preg_match("/^(contactListName=)*(?[^;]+)(;\s?topicName=(?.+))?$/ix", $header->getBodyAsString(), $listManagementOptions)) { + $options['ListManagementOptions'] = array_filter($listManagementOptions, fn ($e) => \in_array($e, ['ContactListName', 'TopicName']), \ARRAY_FILTER_USE_KEY); + } + } foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) { if ($header instanceof MetadataHeader) { $options['Tags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()]; diff --git a/tests/Mail/MailSesTransportTest.php b/tests/Mail/MailSesTransportTest.php index 8d3fd4c6b83d..eb6f171f127e 100755 --- a/tests/Mail/MailSesTransportTest.php +++ b/tests/Mail/MailSesTransportTest.php @@ -62,6 +62,7 @@ public function testSend() $message->bcc('you@example.com'); $message->replyTo(new Address('taylor@example.com', 'Taylor Otwell')); $message->getHeaders()->add(new MetadataHeader('FooTag', 'TagValue')); + $message->getHeaders()->addTextHeader('X-SES-LIST-MANAGEMENT-OPTIONS', 'contactListName=TestList;topicName=TestTopic'); $client = m::mock(SesClient::class); $sesResult = m::mock(); @@ -73,6 +74,7 @@ public function testSend() ->with(m::on(function ($arg) { return $arg['Source'] === 'myself@example.com' && $arg['Destinations'] === ['me@example.com', 'you@example.com'] && + $arg['ListManagementOptions'] === ['ContactListName' => 'TestList', 'TopicName' => 'TestTopic'] && $arg['Tags'] === [['Name' => 'FooTag', 'Value' => 'TagValue']] && strpos($arg['RawMessage']['Data'], 'Reply-To: Taylor Otwell ') !== false; })) diff --git a/tests/Mail/MailSesV2TransportTest.php b/tests/Mail/MailSesV2TransportTest.php index 7b7821558ac7..2170dc256d2e 100755 --- a/tests/Mail/MailSesV2TransportTest.php +++ b/tests/Mail/MailSesV2TransportTest.php @@ -62,6 +62,7 @@ public function testSend() $message->bcc('you@example.com'); $message->replyTo(new Address('taylor@example.com', 'Taylor Otwell')); $message->getHeaders()->add(new MetadataHeader('FooTag', 'TagValue')); + $message->getHeaders()->addTextHeader('X-SES-LIST-MANAGEMENT-OPTIONS', 'contactListName=TestList;topicName=TestTopic'); $client = m::mock(SesV2Client::class); $sesResult = m::mock(); @@ -73,6 +74,7 @@ public function testSend() ->with(m::on(function ($arg) { return $arg['Source'] === 'myself@example.com' && $arg['Destination']['ToAddresses'] === ['me@example.com', 'you@example.com'] && + $arg['ListManagementOptions'] === ['ContactListName' => 'TestList', 'TopicName' => 'TestTopic'] && $arg['Tags'] === [['Name' => 'FooTag', 'Value' => 'TagValue']] && strpos($arg['Content']['Raw']['Data'], 'Reply-To: Taylor Otwell ') !== false; }))