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('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

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy