diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/CHANGELOG.md b/src/Symfony/Component/Mailer/Bridge/Amazon/CHANGELOG.md index 3d889f297d90d..e9228e94bf6eb 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/CHANGELOG.md +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.1 +--- + + * Add support for `X-SES-MESSAGE-TAGS` + 6.0 --- diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php index a5e48ef966819..7387a3d024c25 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php @@ -19,6 +19,7 @@ use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesApiAsyncAwsTransport; use Symfony\Component\Mailer\Exception\HttpTransportException; +use Symfony\Component\Mailer\Header\MetadataHeader; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; use Symfony\Contracts\HttpClient\ResponseInterface; @@ -89,6 +90,7 @@ public function testSend() $this->assertSame('aws-configuration-set-name', $content['ConfigurationSetName']); $this->assertSame('aws-source-arn', $content['FromEmailAddressIdentityArn']); $this->assertSame('bounces@example.com', $content['FeedbackForwardingEmailAddress']); + $this->assertSame([['Name' => 'tagName1', 'Value' => 'tag Value1'], ['Name' => 'tagName2', 'Value' => 'tag Value2']], $content['EmailTags']); $json = '{"MessageId": "foobar"}'; @@ -111,6 +113,8 @@ public function testSend() $mail->getHeaders()->addTextHeader('X-SES-CONFIGURATION-SET', 'aws-configuration-set-name'); $mail->getHeaders()->addTextHeader('X-SES-SOURCE-ARN', 'aws-source-arn'); + $mail->getHeaders()->add(new MetadataHeader('tagName1', 'tag Value1')); + $mail->getHeaders()->add(new MetadataHeader('tagName2', 'tag Value2')); $message = $transport->send($mail); diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php index c64a5218eb673..345a067ad07aa 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php @@ -19,6 +19,7 @@ use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesHttpAsyncAwsTransport; use Symfony\Component\Mailer\Exception\HttpTransportException; +use Symfony\Component\Mailer\Header\MetadataHeader; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; use Symfony\Contracts\HttpClient\ResponseInterface; @@ -86,6 +87,7 @@ public function testSend() $this->assertStringContainsString('Hello There!', $content); $this->assertSame('aws-configuration-set-name', $body['ConfigurationSetName']); $this->assertSame('aws-source-arn', $body['FromEmailAddressIdentityArn']); + $this->assertSame([['Name' => 'tagName1', 'Value' => 'tag Value1'], ['Name' => 'tagName2', 'Value' => 'tag Value2']], $body['EmailTags']); $json = '{"MessageId": "foobar"}'; @@ -104,6 +106,8 @@ public function testSend() $mail->getHeaders()->addTextHeader('X-SES-CONFIGURATION-SET', 'aws-configuration-set-name'); $mail->getHeaders()->addTextHeader('X-SES-SOURCE-ARN', 'aws-source-arn'); + $mail->getHeaders()->add(new MetadataHeader('tagName1', 'tag Value1')); + $mail->getHeaders()->add(new MetadataHeader('tagName2', 'tag Value2')); $message = $transport->send($mail); diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesSmtpTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesSmtpTransportTest.php new file mode 100644 index 0000000000000..7287bc9a3f73f --- /dev/null +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesSmtpTransportTest.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mailer\Bridge\Amazon\Tests\Transport; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesSmtpTransport; +use Symfony\Component\Mailer\Header\MetadataHeader; +use Symfony\Component\Mime\Email; + +class SesSmtpTransportTest extends TestCase +{ + public function testTagAndMetadataAndMessageStreamHeaders() + { + $email = new Email(); + $email->getHeaders()->add(new MetadataHeader('tagName1', 'tag Value1')); + $email->getHeaders()->add(new MetadataHeader('tagName2', 'tag Value2')); + + $transport = new SesSmtpTransport('user', 'pass'); + $method = new \ReflectionMethod(SesSmtpTransport::class, 'addSesHeaders'); + $method->setAccessible(true); + $method->invoke($transport, $email); + + $this->assertCount(1, $email->getHeaders()->toArray()); + $this->assertTrue($email->getHeaders()->has('X-SES-MESSAGE-TAGS')); + $this->assertSame('X-SES-MESSAGE-TAGS: tagName1=tag Value1, tagName2=tag Value2', $email->getHeaders()->get('X-SES-MESSAGE-TAGS')->toString()); + } +} diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php index 62adcf0d571d8..21161b192fb15 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php @@ -15,6 +15,7 @@ use AsyncAws\Ses\ValueObject\Content; use Symfony\Component\Mailer\Envelope; use Symfony\Component\Mailer\Exception\RuntimeException; +use Symfony\Component\Mailer\Header\MetadataHeader; use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; @@ -99,6 +100,12 @@ protected function getRequest(SentMessage $message): SendEmailRequest $request['FeedbackForwardingEmailAddress'] = $email->getReturnPath()->toString(); } + foreach ($email->getHeaders()->all() as $header) { + if ($header instanceof MetadataHeader) { + $request['EmailTags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()]; + } + } + return new SendEmailRequest($request); } diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php index d38e5369c5a5d..6efcbc874e156 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php @@ -18,6 +18,7 @@ use Psr\EventDispatcher\EventDispatcherInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Mailer\Exception\HttpTransportException; +use Symfony\Component\Mailer\Header\MetadataHeader; use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mailer\Transport\AbstractTransport; use Symfony\Component\Mime\Message; @@ -87,6 +88,13 @@ protected function getRequest(SentMessage $message): SendEmailRequest && $sourceArnHeader = $message->getOriginalMessage()->getHeaders()->get('X-SES-SOURCE-ARN')) { $request['FromEmailAddressIdentityArn'] = $sourceArnHeader->getBodyAsString(); } + if ($message->getOriginalMessage() instanceof Message) { + foreach ($message->getOriginalMessage()->getHeaders()->all() as $header) { + if ($header instanceof MetadataHeader) { + $request['EmailTags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()]; + } + } + } return new SendEmailRequest($request); } diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesSmtpTransport.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesSmtpTransport.php index 24811f68ff159..36634c8891b57 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesSmtpTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesSmtpTransport.php @@ -13,7 +13,12 @@ use Psr\EventDispatcher\EventDispatcherInterface; use Psr\Log\LoggerInterface; +use Symfony\Component\Mailer\Envelope; +use Symfony\Component\Mailer\Header\MetadataHeader; +use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport; +use Symfony\Component\Mime\Message; +use Symfony\Component\Mime\RawMessage; /** * @author Kevin Verschaeve @@ -30,4 +35,30 @@ public function __construct(string $username, string $password, string $region = $this->setUsername($username); $this->setPassword($password); } + + public function send(RawMessage $message, Envelope $envelope = null): ?SentMessage + { + if ($message instanceof Message) { + $this->addSesHeaders($message); + } + + return parent::send($message, $envelope); + } + + private function addSesHeaders(Message $message): void + { + $metadata = []; + $headers = $message->getHeaders(); + + foreach ($headers->all() as $name => $header) { + if ($header instanceof MetadataHeader) { + $metadata[] = "{$header->getKey()}={$header->getValue()}"; + $headers->remove($name); + } + } + + if ($metadata) { + $headers->addTextHeader('X-SES-MESSAGE-TAGS', implode(', ', $metadata)); + } + } }