Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c0ecee0

Browse filesBrowse 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
Copy full SHA for c0ecee0

File tree

6 files changed

+29
-11
lines changed
Filter options

6 files changed

+29
-11
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Bridge/Amazon/CHANGELOG.md
+5Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php
+2Lines 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('bounces@example.com', $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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php
+2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php
+5Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php
+14-10Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Bridge/Amazon/composer.json
+1-1Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.