Skip to content

Commit 075bda5

Browse files
[11.x] Add ListManagementOptions in SES mail transport (#50660)
* Add ListManagementOptions in SES mail transport * formatting * formatting --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent 202e521 commit 075bda5

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

src/Illuminate/Mail/Transport/SesTransport.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ protected function doSend(SentMessage $message): void
5050
$options = $this->options;
5151

5252
if ($message->getOriginalMessage() instanceof Message) {
53+
if ($listManagementOptions = $this->listManagementOptions($message)) {
54+
$options['ListManagementOptions'] = $listManagementOptions;
55+
}
56+
5357
foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) {
5458
if ($header instanceof MetadataHeader) {
5559
$options['Tags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()];
@@ -89,6 +93,21 @@ protected function doSend(SentMessage $message): void
8993
$message->getOriginalMessage()->getHeaders()->addHeader('X-SES-Message-ID', $messageId);
9094
}
9195

96+
/**
97+
* Extract the SES list managenent options, if applicable.
98+
*
99+
* @param \Illuminate\Mail\SentMessage $message
100+
* @return array|null
101+
*/
102+
protected function listManagementOptions(SentMessage $message)
103+
{
104+
if ($header = $message->getOriginalMessage()->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) {
105+
if (preg_match("/^(contactListName=)*(?<ContactListName>[^;]+)(;\s?topicName=(?<TopicName>.+))?$/ix", $header->getBodyAsString(), $listManagementOptions)) {
106+
return array_filter($listManagementOptions, fn ($e) => in_array($e, ['ContactListName', 'TopicName']), ARRAY_FILTER_USE_KEY);
107+
}
108+
}
109+
}
110+
92111
/**
93112
* Get the Amazon SES client for the SesTransport instance.
94113
*

src/Illuminate/Mail/Transport/SesV2Transport.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ protected function doSend(SentMessage $message): void
5050
$options = $this->options;
5151

5252
if ($message->getOriginalMessage() instanceof Message) {
53+
if ($listManagementOptions = $this->listManagementOptions($message)) {
54+
$options['ListManagementOptions'] = $listManagementOptions;
55+
}
56+
5357
foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) {
5458
if ($header instanceof MetadataHeader) {
5559
$options['Tags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()];
@@ -93,6 +97,21 @@ protected function doSend(SentMessage $message): void
9397
$message->getOriginalMessage()->getHeaders()->addHeader('X-SES-Message-ID', $messageId);
9498
}
9599

100+
/**
101+
* Extract the SES list managenent options, if applicable.
102+
*
103+
* @param \Illuminate\Mail\SentMessage $message
104+
* @return array|null
105+
*/
106+
protected function listManagementOptions(SentMessage $message)
107+
{
108+
if ($header = $message->getOriginalMessage()->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) {
109+
if (preg_match("/^(contactListName=)*(?<ContactListName>[^;]+)(;\s?topicName=(?<TopicName>.+))?$/ix", $header->getBodyAsString(), $listManagementOptions)) {
110+
return array_filter($listManagementOptions, fn ($e) => in_array($e, ['ContactListName', 'TopicName']), ARRAY_FILTER_USE_KEY);
111+
}
112+
}
113+
}
114+
96115
/**
97116
* Get the Amazon SES V2 client for the SesV2Transport instance.
98117
*

tests/Mail/MailSesTransportTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public function testSend()
6262
$message->bcc('[email protected]');
6363
$message->replyTo(new Address('[email protected]', 'Taylor Otwell'));
6464
$message->getHeaders()->add(new MetadataHeader('FooTag', 'TagValue'));
65+
$message->getHeaders()->addTextHeader('X-Ses-List-Management-Options', 'contactListName=TestList;topicName=TestTopic');
6566

6667
$client = m::mock(SesClient::class);
6768
$sesResult = m::mock();
@@ -73,6 +74,7 @@ public function testSend()
7374
->with(m::on(function ($arg) {
7475
return $arg['Source'] === '[email protected]' &&
7576
$arg['Destinations'] === ['[email protected]', '[email protected]'] &&
77+
$arg['ListManagementOptions'] === ['ContactListName' => 'TestList', 'TopicName' => 'TestTopic'] &&
7678
$arg['Tags'] === [['Name' => 'FooTag', 'Value' => 'TagValue']] &&
7779
strpos($arg['RawMessage']['Data'], 'Reply-To: Taylor Otwell <[email protected]>') !== false;
7880
}))

tests/Mail/MailSesV2TransportTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public function testSend()
6262
$message->bcc('[email protected]');
6363
$message->replyTo(new Address('[email protected]', 'Taylor Otwell'));
6464
$message->getHeaders()->add(new MetadataHeader('FooTag', 'TagValue'));
65+
$message->getHeaders()->addTextHeader('X-SES-LIST-MANAGEMENT-OPTIONS', 'contactListName=TestList;topicName=TestTopic');
6566

6667
$client = m::mock(SesV2Client::class);
6768
$sesResult = m::mock();
@@ -73,6 +74,7 @@ public function testSend()
7374
->with(m::on(function ($arg) {
7475
return $arg['Source'] === '[email protected]' &&
7576
$arg['Destination']['ToAddresses'] === ['[email protected]', '[email protected]'] &&
77+
$arg['ListManagementOptions'] === ['ContactListName' => 'TestList', 'TopicName' => 'TestTopic'] &&
7678
$arg['Tags'] === [['Name' => 'FooTag', 'Value' => 'TagValue']] &&
7779
strpos($arg['Content']['Raw']['Data'], 'Reply-To: Taylor Otwell <[email protected]>') !== false;
7880
}))

0 commit comments

Comments
 (0)