From 76c280224d653c803d0742a98e06aec24e5e1674 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 15 Jun 2021 13:33:16 +0200 Subject: [PATCH 1/6] [Mailer] Add Sendgrid template support --- .../Mailer/Bridge/Sendgrid/CHANGELOG.md | 5 ++ .../Transport/SendgridApiTransportTest.php | 62 +++++++++++++++++++ .../Transport/SendgridApiTransport.php | 21 +++++++ 3 files changed, 88 insertions(+) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md b/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md index d6b7062cf3f8c..4949744df600a 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +5.4 +--- + +* Add supporte for templates and dynamic template data + 4.4.0 ----- diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php index 006a7583d2d4a..2c5997f786568 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php @@ -222,4 +222,66 @@ public function testEnvelopeSenderAndRecipients() $this->assertCount(1, $payload['personalizations'][0]['to']); $this->assertSame($envelopeTo, $payload['personalizations'][0]['to'][0]['email']); } + + public function testSendTemplateIdWithDynamicTemplateData() + { + $templateId = 'd-d-0aac27809ad64ae98d5ebaf896ea8b33'; + $dynamicTemplateData = [ + 'foo' => 'bar', + ]; + + $email = new Email(); + $email->from(new Address('foo@example.com', 'Ms. Foo Bar')) + ->to(new Address('bar@example.com', 'Mr. Recipient')) + ->bcc('baz@example.com') + ->text('content'); + + $email->getHeaders()->addTextHeader('X-Template-ID', $templateId); + $email->getHeaders()->addTextHeader('X-Dynamic-Template-Data', json_encode($dynamicTemplateData)); + + $response = $this->createMock(ResponseInterface::class); + + $response + ->expects($this->once()) + ->method('getStatusCode') + ->willReturn(202); + $response + ->expects($this->once()) + ->method('getHeaders') + ->willReturn(['x-message-id' => '1']); + + $httpClient = $this->createMock(HttpClientInterface::class); + + $httpClient + ->expects($this->once()) + ->method('request') + ->with('POST', 'https://api.sendgrid.com/v3/mail/send', [ + 'json' => [ + 'personalizations' => [ + [ + 'to' => [[ + 'email' => 'bar@example.com', + 'name' => 'Mr. Recipient', + ]], + 'subject' => null, + 'dynamic_template_data' => $dynamicTemplateData, + 'bcc' => [['email' => 'baz@example.com']], + ], + ], + 'from' => [ + 'email' => 'foo@example.com', + 'name' => 'Ms. Foo Bar', + ], + 'content' => [ + ['type' => 'text/plain', 'value' => 'content'], + ], + 'template_id' => $templateId, + ], + 'auth_bearer' => 'foo', + ]) + ->willReturn($response); + + $mailer = new SendgridApiTransport('foo', $httpClient); + $mailer->send($email); + } } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php index f1424ae9589c5..bce8a40d78c27 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php @@ -101,6 +101,8 @@ private function getPayload(Email $email, Envelope $envelope): array $payload['personalizations'][] = $personalization; + $dynamicTemplateData = []; + // these headers can't be overwritten according to Sendgrid docs // see https://sendgrid.api-docs.io/v3.0/mail-send/mail-send-errors#-Headers-Errors $headersToBypass = ['x-sg-id', 'x-sg-eid', 'received', 'dkim-signature', 'content-transfer-encoding', 'from', 'to', 'cc', 'bcc', 'subject', 'content-type', 'reply-to']; @@ -109,9 +111,28 @@ private function getPayload(Email $email, Envelope $envelope): array continue; } + if ('x-template-id' === $name) { + $payload['template_id'] = $header->getBodyAsString(); + + continue; + } + + if ('x-dynamic-template-data' === $name) { + $dynamicTemplateData = json_decode($header->getBodyAsString(), true); + + continue; + } + $payload['headers'][$name] = $header->getBodyAsString(); } + if ([] !== $dynamicTemplateData) { + // we need to add the substitutions to every available personalization + foreach ($payload['personalizations'] as $key => $personalization) { + $payload['personalizations'][$key] = array_merge($payload['personalizations'][$key], ['dynamic_template_data' => $dynamicTemplateData]); + } + } + return $payload; } From 4a0c4e3933ec8b90f85c2338972ded39298b7f82 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 15 Jun 2021 13:38:26 +0200 Subject: [PATCH 2/6] Fix --- src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md | 2 +- .../Sendgrid/Tests/Transport/SendgridApiTransportTest.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md b/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md index 4949744df600a..4fa54b1bc61c5 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/CHANGELOG.md @@ -4,7 +4,7 @@ CHANGELOG 5.4 --- -* Add supporte for templates and dynamic template data +* Add support for templates and dynamic template data 4.4.0 ----- diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php index 2c5997f786568..9178584434646 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php @@ -260,9 +260,9 @@ public function testSendTemplateIdWithDynamicTemplateData() 'personalizations' => [ [ 'to' => [[ - 'email' => 'bar@example.com', - 'name' => 'Mr. Recipient', - ]], + 'email' => 'bar@example.com', + 'name' => 'Mr. Recipient', + ]], 'subject' => null, 'dynamic_template_data' => $dynamicTemplateData, 'bcc' => [['email' => 'baz@example.com']], From 766f66fdf011eb6334b6c22111a391e89e7f38fa Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 15 Jun 2021 13:47:53 +0200 Subject: [PATCH 3/6] Update src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php --- .../Sendgrid/Tests/Transport/SendgridApiTransportTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php index 9178584434646..6b929d5922adf 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php @@ -225,7 +225,7 @@ public function testEnvelopeSenderAndRecipients() public function testSendTemplateIdWithDynamicTemplateData() { - $templateId = 'd-d-0aac27809ad64ae98d5ebaf896ea8b33'; + $templateId = 'd-0aac27809ad64ae98d5ebaf896ea8b33'; $dynamicTemplateData = [ 'foo' => 'bar', ]; From 9e09240c169e37b56ccb0f2dc57bd3b682fbbf52 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 15 Jun 2021 14:02:26 +0200 Subject: [PATCH 4/6] Fix --- .../Transport/SendgridApiTransportTest.php | 21 +++++++++++++++++++ .../Transport/SendgridApiTransport.php | 9 +++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php index 6b929d5922adf..2273fd608cda3 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Mailer\Bridge\Sendgrid\Transport\SendgridApiTransport; use Symfony\Component\Mailer\Envelope; +use Symfony\Component\Mailer\Exception\InvalidArgumentException; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -284,4 +285,24 @@ public function testSendTemplateIdWithDynamicTemplateData() $mailer = new SendgridApiTransport('foo', $httpClient); $mailer->send($email); } + + public function testSendWithInvalidTemplateIdThrowsInvalidArgumentException() + { + $invalidTemplateId = 'd-abcd'; + + $email = new Email(); + $email->from(new Address('foo@example.com', 'Ms. Foo Bar')) + ->to(new Address('bar@example.com', 'Mr. Recipient')) + ->bcc('baz@example.com') + ->text('content'); + + $email->getHeaders()->addTextHeader('X-Template-ID', $invalidTemplateId); + + $mailer = new SendgridApiTransport('foo', $this->createMock(HttpClientInterface::class)); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(sprintf('Invalid TemplateID. Got: %s', $invalidTemplateId)); + + $mailer->send($email); + } } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php index bce8a40d78c27..935bee1c9fab8 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php @@ -14,6 +14,7 @@ use Psr\Log\LoggerInterface; use Symfony\Component\Mailer\Envelope; use Symfony\Component\Mailer\Exception\HttpTransportException; +use Symfony\Component\Mailer\Exception\InvalidArgumentException; use Symfony\Component\Mailer\SentMessage; use Symfony\Component\Mailer\Transport\AbstractApiTransport; use Symfony\Component\Mime\Address; @@ -112,7 +113,13 @@ private function getPayload(Email $email, Envelope $envelope): array } if ('x-template-id' === $name) { - $payload['template_id'] = $header->getBodyAsString(); + $templateId = $header->getBodyAsString(); + + if (!preg_match('/^d\-[a-z0-9]{32}$/', $templateId)) { + throw new InvalidArgumentException(sprintf('Invalid TemplateID. Got: %s', $templateId)); + } + + $payload['template_id'] = $templateId; continue; } From 944552a450514e08a519027c718a18930b149200 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 15 Jun 2021 14:03:32 +0200 Subject: [PATCH 5/6] CS --- .../Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php index 935bee1c9fab8..143890d015509 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridApiTransport.php @@ -116,7 +116,7 @@ private function getPayload(Email $email, Envelope $envelope): array $templateId = $header->getBodyAsString(); if (!preg_match('/^d\-[a-z0-9]{32}$/', $templateId)) { - throw new InvalidArgumentException(sprintf('Invalid TemplateID. Got: %s', $templateId)); + throw new InvalidArgumentException(sprintf('Invalid TemplateID. Got: "%s".', $templateId)); } $payload['template_id'] = $templateId; From 2b74d366823b120b80943423e6e2546a75427061 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Tue, 15 Jun 2021 14:21:22 +0200 Subject: [PATCH 6/6] fix test --- .../Sendgrid/Tests/Transport/SendgridApiTransportTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php index 2273fd608cda3..10f2d92377478 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridApiTransportTest.php @@ -301,7 +301,7 @@ public function testSendWithInvalidTemplateIdThrowsInvalidArgumentException() $mailer = new SendgridApiTransport('foo', $this->createMock(HttpClientInterface::class)); $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage(sprintf('Invalid TemplateID. Got: %s', $invalidTemplateId)); + $this->expectExceptionMessage(sprintf('Invalid TemplateID. Got: "%s"', $invalidTemplateId)); $mailer->send($email); } 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