Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c0ecee0

Browse files
committed
feature #53901 [Mailer] [Amazon] Add support for X-SES-LIST-MANAGEMENT-OPTIONS header (sebschaefer)
This PR was merged into the 7.1 branch. Discussion ---------- [Mailer] [Amazon] Add support for X-SES-LIST-MANAGEMENT-OPTIONS header | Q | A | ------------- | --- | Branch? | 7.1 | Bug fix? | no | New feature? | yes | Deprecations? | no | License | MIT Add Support for AWS SES List Management Feature SES will provide the following features: - adds Unsubscribe-Headers - replaces {{amazonSESUnsubscribeUrl}} placeholder with an one-click unsubscribe link in mail body - prevent sending mails to unsubscribed contacts (optional for a specific topic only) - ref: https://docs.aws.amazon.com/ses/latest/dg/sending-email-subscription-management.html Use: - follow the AWS instructions to create a contact list - optional: add a topic to the list - `RawMessage->addTextHeader('X-SES-LIST-MANAGEMENT-OPTIONS','contactListName=MyListName;topicName=MyNewsletter') ` Commits ------- 481c007 [Mailer] [Amazon] Add support for X-SES-LIST-MANAGEMENT-OPTIONS header
2 parents 394d6b4 + 481c007 commit c0ecee0

File tree

6 files changed

+29
-11
lines changed

6 files changed

+29
-11
lines changed

src/Symfony/Component/Mailer/Bridge/Amazon/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
7.1
5+
---
6+
7+
* Add support for `X-SES-LIST-MANAGEMENT-OPTIONS`
8+
49
6.1
510
---
611

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ public function testSend()
9191
$this->assertSame('aws-source-arn', $content['FromEmailAddressIdentityArn']);
9292
$this->assertSame('[email protected]', $content['FeedbackForwardingEmailAddress']);
9393
$this->assertSame([['Name' => 'tagName1', 'Value' => 'tag Value1'], ['Name' => 'tagName2', 'Value' => 'tag Value2']], $content['EmailTags']);
94+
$this->assertSame(['ContactListName' => 'TestContactList', 'TopicName' => 'TestNewsletter'], $content['ListManagementOptions']);
9495

9596
$json = '{"MessageId": "foobar"}';
9697

@@ -113,6 +114,7 @@ public function testSend()
113114

114115
$mail->getHeaders()->addTextHeader('X-SES-CONFIGURATION-SET', 'aws-configuration-set-name');
115116
$mail->getHeaders()->addTextHeader('X-SES-SOURCE-ARN', 'aws-source-arn');
117+
$mail->getHeaders()->addTextHeader('X-SES-LIST-MANAGEMENT-OPTIONS', 'contactListName=TestContactList;topicName=TestNewsletter');
116118
$mail->getHeaders()->add(new MetadataHeader('tagName1', 'tag Value1'));
117119
$mail->getHeaders()->add(new MetadataHeader('tagName2', 'tag Value2'));
118120

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public function testSend()
8888
$this->assertSame('aws-configuration-set-name', $body['ConfigurationSetName']);
8989
$this->assertSame('aws-source-arn', $body['FromEmailAddressIdentityArn']);
9090
$this->assertSame([['Name' => 'tagName1', 'Value' => 'tag Value1'], ['Name' => 'tagName2', 'Value' => 'tag Value2']], $body['EmailTags']);
91+
$this->assertSame(['ContactListName' => 'TestContactList', 'TopicName' => 'TestNewsletter'], $body['ListManagementOptions']);
9192

9293
$json = '{"MessageId": "foobar"}';
9394

@@ -106,6 +107,7 @@ public function testSend()
106107

107108
$mail->getHeaders()->addTextHeader('X-SES-CONFIGURATION-SET', 'aws-configuration-set-name');
108109
$mail->getHeaders()->addTextHeader('X-SES-SOURCE-ARN', 'aws-source-arn');
110+
$mail->getHeaders()->addTextHeader('X-SES-LIST-MANAGEMENT-OPTIONS', 'contactListName=TestContactList;topicName=TestNewsletter');
109111
$mail->getHeaders()->add(new MetadataHeader('tagName1', 'tag Value1'));
110112
$mail->getHeaders()->add(new MetadataHeader('tagName2', 'tag Value2'));
111113

src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ protected function getRequest(SentMessage $message): SendEmailRequest
9898
if ($header = $email->getHeaders()->get('X-SES-SOURCE-ARN')) {
9999
$request['FromEmailAddressIdentityArn'] = $header->getBodyAsString();
100100
}
101+
if ($header = $email->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) {
102+
if (preg_match("/^(contactListName=)*(?<ContactListName>[^;]+)(;\s?topicName=(?<TopicName>.+))?$/ix", $header->getBodyAsString(), $listManagementOptions)) {
103+
$request['ListManagementOptions'] = array_filter($listManagementOptions, fn ($e) => \in_array($e, ['ContactListName', 'TopicName']), \ARRAY_FILTER_USE_KEY);
104+
}
105+
}
101106
if ($email->getReturnPath()) {
102107
$request['FeedbackForwardingEmailAddress'] = $email->getReturnPath()->toString();
103108
}

src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,20 @@ protected function getRequest(SentMessage $message): SendEmailRequest
7878
],
7979
];
8080

81-
if (($message->getOriginalMessage() instanceof Message)
82-
&& $configurationSetHeader = $message->getOriginalMessage()->getHeaders()->get('X-SES-CONFIGURATION-SET')) {
83-
$request['ConfigurationSetName'] = $configurationSetHeader->getBodyAsString();
84-
}
85-
if (($message->getOriginalMessage() instanceof Message)
86-
&& $sourceArnHeader = $message->getOriginalMessage()->getHeaders()->get('X-SES-SOURCE-ARN')) {
87-
$request['FromEmailAddressIdentityArn'] = $sourceArnHeader->getBodyAsString();
88-
}
89-
if ($message->getOriginalMessage() instanceof Message) {
90-
foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) {
81+
$originalMessage = $message->getOriginalMessage();
82+
if ($originalMessage instanceof Message) {
83+
if ($configurationSetHeader = $message->getOriginalMessage()->getHeaders()->get('X-SES-CONFIGURATION-SET')) {
84+
$request['ConfigurationSetName'] = $configurationSetHeader->getBodyAsString();
85+
}
86+
if ($sourceArnHeader = $message->getOriginalMessage()->getHeaders()->get('X-SES-SOURCE-ARN')) {
87+
$request['FromEmailAddressIdentityArn'] = $sourceArnHeader->getBodyAsString();
88+
}
89+
if ($header = $message->getOriginalMessage()->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) {
90+
if (preg_match("/^(contactListName=)*(?<ContactListName>[^;]+)(;\s?topicName=(?<TopicName>.+))?$/ix", $header->getBodyAsString(), $listManagementOptions)) {
91+
$request['ListManagementOptions'] = array_filter($listManagementOptions, fn ($e) => \in_array($e, ['ContactListName', 'TopicName']), \ARRAY_FILTER_USE_KEY);
92+
}
93+
}
94+
foreach ($originalMessage->getHeaders()->all() as $header) {
9195
if ($header instanceof MetadataHeader) {
9296
$request['EmailTags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()];
9397
}

src/Symfony/Component/Mailer/Bridge/Amazon/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
],
1818
"require": {
1919
"php": ">=8.2",
20-
"async-aws/ses": "^1.0",
20+
"async-aws/ses": "^1.3",
2121
"symfony/mailer": "^6.4|^7.0"
2222
},
2323
"require-dev": {

0 commit comments

Comments
 (0)