8000 Use AsyncAws to handle SES requests · symfony/symfony@b632f00 · GitHub
[go: up one dir, main page]

Skip to content

Commit b632f00

Browse files
committed
Use AsyncAws to handle SES requests
1 parent 7c90c8b commit b632f00

File tree

9 files changed

+185
-185
lines changed

9 files changed

+185
-185
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@
126126
"phpdocumentor/reflection-docblock": "^3.0|^4.0",
127127
"twig/cssinliner-extra": "^2.12",
128128
"twig/inky-extra": "^2.12",
129-
"twig/markdown-extra": "^2.12"
129+
"twig/markdown-extra": "^2.12",
130+
"async-aws/ses": "^0.3"
130131
},
131132
"conflict": {
132133
"masterminds/html5": "<2.6",

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+
5.1.0
5+
-----
6+
7+
* Adds `async-aws/ses` to communicate with AWS API.
8+
49
4.4.0
510
-----
611

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiTransportTest.php

B421
Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Mailer\Bridge\Amazon\Tests\Transport;
1313

14+
use AsyncAws\Core\Configuration;
15+
use AsyncAws\Ses\SesClient;
1416
use PHPUnit\Framework\TestCase;
1517
use Symfony\Component\HttpClient\MockHttpClient;
1618
use Symfony\Component\HttpClient\Response\MockResponse;
@@ -34,19 +36,19 @@ public function getTransportData()
3436
{
3537
return [
3638
[
37-
new SesApiTransport('ACCESS_KEY', 'SECRET_KEY'),
38-
'ses+api://ACCESS_KEY@email.eu-west-1.amazonaws.com',
39+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY']))),
40+
'ses+api://ACCESS_KEY@us-east-1',
3941
],
4042
[
41-
new SesApiTransport('ACCESS_KEY', 'SECRET_KEY', 'us-east-1'),
42-
'ses+api://ACCESS_KEY@email.us-east-1.amazonaws.com',
43+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'region' => 'us-west-1']))),
44+
'ses+api://ACCESS_KEY@us-west-1',
4345
],
4446
[
45-
(new SesApiTransport('ACCESS_KEY', 'SECRET_KEY'))->setHost('example.com'),
47+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com']))),
4648
'ses+api://ACCESS_KEY@example.com',
4749
],
4850
[
49-
(new SesApiTransport('ACCESS_KEY', 'SECRET_KEY'))->setHost('example.com')->setPort(99),
51+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com:99']))),
5052
'ses+api://ACCESS_KEY@example.com:99',
5153
],
5254
];
@@ -56,28 +58,23 @@ public function testSend()
5658
{
5759
$client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface {
5860
$this->assertSame('POST', $method);
59-
$this->assertSame('https://email.eu-west-1.amazonaws.com:8984/', $url);
60-
$this->assertStringContainsStringIgnoringCase('X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId=ACCESS_KEY,Algorithm=HmacSHA256,Signature=', $options['headers'][0] ?? $options['request_headers'][0]);
61+
$this->assertSame('https://email.us-east-1.amazonaws.com/v2/email/outbound-emails', $url);
6162

62-
parse_str($options['body'], $content);
63+
$content = \json_decode($options['body'](), true);
6364

64-
$this->assertSame('Hello!', $content['Message_Subject_Data']);
65-
$this->assertSame('Saif Eddin <saif.gmati@symfony.com>', $content['Destination_ToAddresses_member'][0]);
66-
$this->assertSame('Fabien <fabpot@symfony.com>', $content['Source']);
67-
$this->assertSame('Hello There!', $content['Message_Body_Text_Data']);
65+
$this->assertSame('Hello!', $content['Content']['Simple']['Subject']['Data']);
66+
$this->assertSame('Saif Eddin <saif.gmati@symfony.com>', $content['Destination']['ToAddresses'][0]);
67+
$this->assertSame('Fabien <fabpot@symfony.com>', $content['FromEmailAddress']);
68+
$this->assertSame('Hello There!', $content['Content']['Simple']['Body']['Text']['Data']);
6869

69-
$xml = '<SendEmailResponse xmlns="https://email.amazonaws.com/doc/2010-03-31/">
70-
<SendEmailResult>
71-
<MessageId>foobar</MessageId>
72-
</SendEmailResult>
73-
</SendEmailResponse>';
70+
$json = '{"MessageId": "foobar"}';
7471

75-
return new MockResponse($xml, [
72+
return new MockResponse($json, [
7673
'http_code' => 200,
7774
]);
7875
});
79-
$transport = new SesApiTransport('ACCESS_KEY', 'SECRET_KEY', null, $client);
80-
$transport->setPort(8984);
76+
77+
$transport = new SesApiTransport(new SesClient(Configuration::create([]), null, $client));
8178

8279
$mail = new Email();
8380
$mail->subject('Hello!')
@@ -104,8 +101,8 @@ public function testSendThrowsForErrorResponse()
104101
'http_code' => 418,
105102
]);
106103
});
107-
$transport = new SesApiTransport('ACCESS_KEY', 'SECRET_KEY', null, $client);
108-
$transport->setPort(8984);
104+
105+
$transport = new SesApiTransport(new SesClient(Configuration::create([]), null, $client));
109106

110107
$mail = new Email();
111108
$mail->subject('Hello!')

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpTransportTest.php

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111

1212
namespace Symfony\Component\Mailer\Bridge\Amazon\Tests\Transport;
1313

14+
use AsyncAws\Core\Configuration;
15+
use AsyncAws\Ses\SesClient;
1416
use PHPUnit\Framework\TestCase;
1517
use Symfony\Component\HttpClient\MockHttpClient;
1618
use Symfony\Component\HttpClient\Response\MockResponse;
19+
use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesApiTransport;
1720
use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesHttpTransport;
1821
use Symfony\Component\Mailer\Exception\HttpTransportException;
1922
use Symfony\Component\Mime\Address;
@@ -34,19 +37,19 @@ public function getTransportData()
3437
{
3538
return [
3639
[
37-
new SesHttpTransport('ACCESS_KEY', 'SECRET_KEY'),
38-
'ses+https://ACCESS_KEY@email.eu-west-1.amazonaws.com',
40+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY']))),
41+
'ses+https://ACCESS_KEY@us-east-1',
3942
],
4043
[
41-
new SesHttpTransport('ACCESS_KEY', 'SECRET_KEY', 'us-east-1'),
42-
'ses+https://ACCESS_KEY@email.us-east-1.amazonaws.com',
44+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'region' => 'us-west-1']))),
45+
'ses+https://ACCESS_KEY@us-west-1',
4346
],
4447
[
45-
(new SesHttpTransport('ACCESS_KEY', 'SECRET_KEY'))->setHost('example.com'),
48+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com']))),
4649
'ses+https://ACCESS_KEY@example.com',
4750
],
4851
[
49-
(new SesHttpTransport('ACCESS_KEY', 'SECRET_KEY'))->setHost('example.com')->setPort(99),
52+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com:99']))),
5053
'ses+https://ACCESS_KEY@example.com:99',
5154
],
5255
];
@@ -56,29 +59,25 @@ public function testSend()
5659
{
5760
$client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface {
5861
$this->assertSame('POST', $method);
59-
$this->assertSame('https://email.eu-west-1.amazonaws.com:8984/', $url);
60-
$this->assertStringContainsString('AWS3-HTTPS AWSAccessKeyId=ACCESS_KEY,Algorithm=HmacSHA256,Signature=', $options['headers'][0] ?? $options['request_headers'][0]);
62+
$this->assertSame('https://email.us-east-1.amazonaws.com/v2/email/outbound-emails', $url);
6163

62-
parse_str($options['body'], $body);
63-
$content = base64_decode($body['RawMessage_Data']);
64+
$body = \json_decode($options['body'](), true);
65+
$content = base64_decode($body['Content']['Raw']['Data']);
6466

6567
$this->assertStringContainsString('Hello!', $content);
6668
$this->assertStringContainsString('Saif Eddin <saif.gmati@symfony.com>', $content);
6769
$this->assertStringContainsString('Fabien <fabpot@symfony.com>', $content);
6870
$this->assertStringContainsString('Hello There!', $content);
6971

70-
$xml = '<SendEmailResponse xmlns="https://email.amazonaws.com/doc/2010-03-31/">
71-
<SendRawEmailResult>
72-
<MessageId>foobar</MessageId>
73-
</SendRawEmailResult>
74-
</SendEmailResponse>';
7572

76-
return new MockResponse($xml, [
73+
$json = '{"MessageId": "foobar"}';
74+
75+
return new MockResponse($json, [
7776
'http_code' => 200,
7877
]);
7978
});
80-
$transport = new SesHttpTransport('ACCESS_KEY', 'SECRET_KEY', null, $client);
81-
$transport->setPort(8984);
79+
80+
$transport = new SesHttpTransport(new SesClient(Configuration::create([]), null, $client));
8281

8382
$mail = new Email();
8483
$mail->subject('Hello!')
@@ -105,7 +104,8 @@ public function testSendThrowsForErrorResponse()
105104
'http_code' => 418,
106105
]);
107106
});
108-
$transport = new SesHttpTransport('ACCESS_KEY', 'SECRET_KEY', null, $client);
107+
108+
$transport = new SesHttpTransport(new SesClient(Configuration::create([]), null, $client));
109109

110110
$mail = new Email();
111111
$mail->subject('Hello!')

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesTransportFactoryTest.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Mailer\Bridge\Amazon\Tests\Transport;
1313

14+
use AsyncAws\Core\Configuration;
15+
use AsyncAws\Ses\SesClient;
1416
use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesApiTransport;
1517
use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesHttpTransport;
1618
use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesSmtpTransport;
@@ -67,37 +69,37 @@ public function createProvider(): iterable
6769

6870
yield [
6971
new Dsn('ses+api', 'default', self::USER, self::PASSWORD),
70-
new SesApiTransport(self::USER, self::PASSWORD, null, $client, $dispatcher, $logger),
72+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1']), null, $client, $logger), $dispatcher, $logger),
7173
];
7274

7375
yield [
74-
new Dsn('ses+api', 'default', self::USER, self::PASSWORD, null, ['region' => 'eu-west-1']),
75-
new SesApiTransport(self::USER, self::PASSWORD, 'eu-west-1', $client, $dispatcher, $logger),
76+
new Dsn('ses+api', 'default', self::USER, self::PASSWORD, null, ['region' => 'eu-west-2']),
77+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-2']), null, $client, $logger), $dispatcher, $logger),
7678
];
7779

7880
yield [
7981
new Dsn('ses+api', 'example.com', self::USER, self::PASSWORD, 8080),
80-
(new SesApiTransport(self::USER, self::PASSWORD, null, $client, $dispatcher, $logger))->setHost('example.com')->setPort(8080),
82+
new SesApiTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'endpoint' => 'https://example.com:8080']), null, $client, $logger), $dispatcher, $logger),
8183
];
8284

8385
yield [
8486
new Dsn('ses+https', 'default', self::USER, self::PASSWORD),
85-
new SesHttpTransport(self::USER, self::PASSWORD, null, $client, $dispatcher, $logger),
87+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1']), null, $client, $logger), $dispatcher, $logger),
8688
];
8789

8890
yield [
8991
new Dsn('ses', 'default', self::USER, self::PASSWORD),
90-
new SesHttpTransport(self::USER, self::PASSWORD, null, $client, $dispatcher, $logger),
92+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1']), null, $client, $logger), $dispatcher, $logger),
9193
];
9294

9395
yield [
9496
new Dsn('ses+https', 'example.com', self::USER, self::PASSWORD, 8080),
95-
(new SesHttpTransport(self::USER, self::PASSWORD, null, $client, $dispatcher, $logger))->setHost('example.com')->setPort(8080),
97+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'endpoint' => 'https://example.com:8080']), null, $client, $logger), $dispatcher, $logger),
9698
];
9799

98100
yield [
99-
new Dsn('ses+https', 'default', self::USER, self::PASSWORD, null, ['region' => 'eu-west-1']),
100-
new SesHttpTransport(self::USER, self::PASSWORD, 'eu-west-1', $client, $dispatcher, $logger),
101+
new Dsn('ses+https', 'default', self::USER, self::PASSWORD, null, ['region' => 'eu-west-2']),
102+
new SesHttpTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-2']), null, $client, $logger), $dispatcher, $logger),
101103
];
102104

103105
yield [
@@ -127,7 +129,5 @@ public function unsupportedSchemeProvider(): iterable
127129
public function incompleteDsnProvider(): iterable
128130
{
129131
yield [new Dsn('ses+smtp', 'default', self::USER)];
130-
131-
yield [new Dsn('ses+smtp', 'default', null, self::PASSWORD)];
132132
}
133133
}

0 commit comments

Comments
 (0)
0