From 5ec549c4aa48a79f9f98ad2b8df7d5dfd5900972 Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Thu, 19 Dec 2019 12:30:39 +0100 Subject: [PATCH 1/7] [Mailer] fixed destination override by envelope in amazon api transport --- .../Amazon/Transport/SesApiTransport.php | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php index 22ef23e84ba52..df7f83a8786f1 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php @@ -16,7 +16,9 @@ use Symfony\Component\Mailer\Exception\HttpTransportException; use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mailer\Transport\AbstractApiTransport; +use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; +use Symfony\Component\Mime\Header\MailboxListHeader; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; @@ -87,33 +89,43 @@ private function getSignature(string $string): string private function getPayload(Email $email, Envelope $envelope): array { - if ($email->getAttachments()) { - return [ - 'Action' => 'SendRawEmail', - 'RawMessage.Data' => base64_encode($email->toString()), - ]; - } - $payload = [ - 'Action' => 'SendEmail', - 'Destination.ToAddresses.member' => $this->stringifyAddresses($this->getRecipients($email, $envelope)), - 'Message.Subject.Data' => $email->getSubject(), + 'Action' => 'SendRawEmail', + 'RawMessage.Data' => base64_encode($email->toString()), 'Source' => $envelope->getSender()->toString(), ]; - if ($emails = $email->getCc()) { - $payload['Destination.CcAddresses.member'] = $this->stringifyAddresses($emails); - } - if ($emails = $email->getBcc()) { - $payload['Destination.BccAddresses.member'] = $this->stringifyAddresses($emails); - } - if ($email->getTextBody()) { - $payload['Message.Body.Text.Data'] = $email->getTextBody(); - } - if ($email->getHtmlBody()) { - $payload['Message.Body.Html.Data'] = $email->getHtmlBody(); + $headerRecipients = $this->getRecipientAddressesFromHeaders($email); + $envelopeRecipients = array_map(static function (Address $recipient) { + return $recipient->getAddress(); + }, $envelope->getRecipients()); + $requiresDestinations = count(array_diff($headerRecipients, $envelopeRecipients)) > 0; + + if ($requiresDestinations) { + $payload['Destinations.member'] = $this->stringifyAddresses($envelope->getRecipients()); } + dd($email->toString(), $payload); return $payload; } + + /** + * @return string[] + */ + private function getRecipientAddressesFromHeaders(Email $email): array + { + $headers = $email->getHeaders(); + + $recipients = []; + foreach (['to', 'cc', 'bcc'] as $name) { + foreach ($headers->all($name) as $header) { + /* @var MailboxListHeader $header */ + foreach ($header->getAddresses() as $address) { + $recipients[] = $address->getAddress(); + } + } + } + + return $recipients; + } } From 3b4ef77256a83b49e5d57bfe440d04ba75be28c4 Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Thu, 19 Dec 2019 12:49:17 +0100 Subject: [PATCH 2/7] Comply with symfony coding standards --- .../Mailer/Bridge/Amazon/Transport/SesApiTransport.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php index df7f83a8786f1..f0089070ff8bc 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiTransport.php @@ -99,13 +99,12 @@ private function getPayload(Email $email, Envelope $envelope): array $envelopeRecipients = array_map(static function (Address $recipient) { return $recipient->getAddress(); }, $envelope->getRecipients()); - $requiresDestinations = count(array_diff($headerRecipients, $envelopeRecipients)) > 0; + $requiresDestinations = \count(array_diff($headerRecipients, $envelopeRecipients)) > 0; if ($requiresDestinations) { $payload['Destinations.member'] = $this->stringifyAddresses($envelope->getRecipients()); } - dd($email->toString(), $payload); return $payload; } From 60ad503cd2d7525136cd4f4d68057e4a4a6794f4 Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Thu, 19 Dec 2019 16:21:47 +0100 Subject: [PATCH 3/7] Add tests for email submission with and without envelope --- .../Tests/Transport/SesApiTransportTest.php | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php index a1b0ae7f1a81e..320ab84f4dadb 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php @@ -12,7 +12,14 @@ namespace Symfony\Component\Mailer\Bridge\Amazon\Tests\Transport; use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesApiTransport; +use Symfony\Component\Mailer\Envelope; +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Email; +use Symfony\Contracts\HttpClient\HttpClientInterface; +use function GuzzleHttp\Psr7\parse_query; class SesApiTransportTest extends TestCase { @@ -45,4 +52,87 @@ public function getTransportData() ], ]; } + + public function testSendEmail() + { + $awsApiCallback = function ($method, $url, $options) { + $requestParts = []; + \parse_str($options['body'], $requestParts); + + $this->assertEquals('POST', $method); + $this->assertEquals('https://email.eu-west-1.amazonaws.com/', $url); + + $this->assertEquals($requestParts['Source'], 'sender@example.tld'); + $this->assertArrayNotHasKey('Destinations.member', $requestParts); + + return new MockResponse($this->createMockAwsSendRawEmailResponse()); + }; + + $httpClient = new MockHttpClient($awsApiCallback); + $transport = new SesApiTransport('ACCESS_KEY', 'SECRET_KEY', 'eu-west-1', $httpClient); + + $email = (new Email()) + ->from('sender@example.tld') + ->to('recipient-to@example.tld') + ->cc('recipient-cc@example.tld') + ->bcc('recipient-bcc@example.tld') + ->subject('Test Mail') + ->text('Text content of the test mail') + ->html('

HTML content of the test mail

'); + + $transport->send($email); + } + + public function testSendEmailWithEnvelopeOverride() + { + $awsApiCallback = function ($method, $url, $options) { + $requestParts = []; + \parse_str($options['body'], $requestParts); + + $this->assertEquals('POST', $method); + $this->assertEquals('https://email.eu-west-1.amazonaws.com/', $url); + + $this->assertEquals($requestParts['Source'], 'envelope-sender@example.tld'); + $this->assertArrayHasKey('Destinations_member', $requestParts); + $this->assertEquals($requestParts['Destinations_member'], [ + 'envelope-recipient-1@example.tld', + 'envelope-recipient-2@example.tld' + ]); + + return new MockResponse($this->createMockAwsSendRawEmailResponse()); + }; + + $httpClient = new MockHttpClient($awsApiCallback); + $transport = new SesApiTransport('ACCESS_KEY', 'SECRET_KEY', 'eu-west-1', $httpClient); + + $email = (new Email()) + ->from('sender@example.tld') + ->to('recipient-to@example.tld') + ->cc('recipient-cc@example.tld') + ->bcc('recipient-bcc@example.tld') + ->subject('Test Mail') + ->text('Text content of the test mail') + ->html('

HTML content of the test mail

'); + + $envelope = new Envelope(Address::create('envelope-sender@example.tld'), [ + Address::create('envelope-recipient-1@example.tld'), + Address::create('envelope-recipient-2@example.tld') + ]); + + $transport->send($email, $envelope); + } + + private function createMockAwsSendRawEmailResponse(): string + { + return << + + 0102016f1eb7661b-4294e7da-5d64-45c2-8998-e8ade5468d95-000000 + + + dc4fb17f-0320-428b-8c03-62f9ec9b98ba + + + XML; + } } From bd843e30c0fe32bc44af2c45c8fd016dce967d33 Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Thu, 19 Dec 2019 16:24:34 +0100 Subject: [PATCH 4/7] Comply with symfony coding standards --- .../Bridge/Amazon/Tests/Transport/SesApiTransportTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php index 320ab84f4dadb..8bf3c2bf9294c 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php @@ -57,7 +57,7 @@ public function testSendEmail() { $awsApiCallback = function ($method, $url, $options) { $requestParts = []; - \parse_str($options['body'], $requestParts); + parse_str($options['body'], $requestParts); $this->assertEquals('POST', $method); $this->assertEquals('https://email.eu-west-1.amazonaws.com/', $url); @@ -87,7 +87,7 @@ public function testSendEmailWithEnvelopeOverride() { $awsApiCallback = function ($method, $url, $options) { $requestParts = []; - \parse_str($options['body'], $requestParts); + parse_str($options['body'], $requestParts); $this->assertEquals('POST', $method); $this->assertEquals('https://email.eu-west-1.amazonaws.com/', $url); @@ -96,7 +96,7 @@ public function testSendEmailWithEnvelopeOverride() $this->assertArrayHasKey('Destinations_member', $requestParts); $this->assertEquals($requestParts['Destinations_member'], [ 'envelope-recipient-1@example.tld', - 'envelope-recipient-2@example.tld' + 'envelope-recipient-2@example.tld', ]); return new MockResponse($this->createMockAwsSendRawEmailResponse()); @@ -116,7 +116,7 @@ public function testSendEmailWithEnvelopeOverride() $envelope = new Envelope(Address::create('envelope-sender@example.tld'), [ Address::create('envelope-recipient-1@example.tld'), - Address::create('envelope-recipient-2@example.tld') + Address::create('envelope-recipient-2@example.tld'), ]); $transport->send($email, $envelope); From 5150db63635ab9ec95f71c03a432b51da74e62c6 Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Thu, 19 Dec 2019 16:28:55 +0100 Subject: [PATCH 5/7] Comply with symfony coding standards --- .../Bridge/Amazon/Tests/Transport/SesApiTransportTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php index 8bf3c2bf9294c..3075878630b71 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php @@ -18,8 +18,6 @@ use Symfony\Component\Mailer\Envelope; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; -use Symfony\Contracts\HttpClient\HttpClientInterface; -use function GuzzleHttp\Psr7\parse_query; class SesApiTransportTest extends TestCase { From 49fd096621c4079c45829219f303dae78608ce2c Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Thu, 19 Dec 2019 16:46:15 +0100 Subject: [PATCH 6/7] Remove cc and bcc from email as they are not used in the test --- .../Bridge/Amazon/Tests/Transport/SesApiTransportTest.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php index 3075878630b71..3a7d6fcaf9a00 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php @@ -72,8 +72,6 @@ public function testSendEmail() $email = (new Email()) ->from('sender@example.tld') ->to('recipient-to@example.tld') - ->cc('recipient-cc@example.tld') - ->bcc('recipient-bcc@example.tld') ->subject('Test Mail') ->text('Text content of the test mail') ->html('

HTML content of the test mail

'); @@ -106,8 +104,6 @@ public function testSendEmailWithEnvelopeOverride() $email = (new Email()) ->from('sender@example.tld') ->to('recipient-to@example.tld') - ->cc('recipient-cc@example.tld') - ->bcc('recipient-bcc@example.tld') ->subject('Test Mail') ->text('Text content of the test mail') ->html('

HTML content of the test mail

'); From 6cebe719e8ec88d16749314086ec3817c71b85e0 Mon Sep 17 00:00:00 2001 From: cfoehrdes Date: Fri, 20 Dec 2019 09:37:28 +0100 Subject: [PATCH 7/7] Remove intendation for heredoc to be compatible with PHP 7.1 --- .../Tests/Transport/SesApiTransportTest.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php index 3a7d6fcaf9a00..b6061f03cd3e6 100644 --- a/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php @@ -119,14 +119,14 @@ public function testSendEmailWithEnvelopeOverride() private function createMockAwsSendRawEmailResponse(): string { return << - - 0102016f1eb7661b-4294e7da-5d64-45c2-8998-e8ade5468d95-000000 - - - dc4fb17f-0320-428b-8c03-62f9ec9b98ba - - - XML; + + + 0102016f1eb7661b-4294e7da-5d64-45c2-8998-e8ade5468d95-000000 + + + dc4fb17f-0320-428b-8c03-62f9ec9b98ba + + +XML; } } 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