8000 feature #51264 [RemoteEvent][Webhook] Add Brevo support (blaugueux) · symfony/symfony@49a1253 · GitHub
[go: up one dir, main page]

Skip to content

Commit 49a1253

Browse files
committed
feature #51264 [RemoteEvent][Webhook] Add Brevo support (blaugueux)
This PR was merged into the 6.4 branch. Discussion ---------- [RemoteEvent][Webhook] Add Brevo support | Q | A | ------------- | --- | Branch | 6.4 | Bug fix | no | New feature | yes | Deprecations | no | Tickets | | License | MIT | Doc PR | Commits ------- 8fc472f [RemoteEvent][Webhook] Add Brevo support
2 parents f78bbe0 + 8fc472f commit 49a1253

33 files changed

+541
-14
lines changed

src/Symfony/Component/Mailer/Bridge/Brevo/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ CHANGELOG
44
6.4
55
---
66

7+
* Add support for `RemoteEvent` and `Webhook`
78
* Add the bridge as a replacement of the deprecated Sendinblue one
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Brevo\RemoteEvent;
13+
14+
use Symfony\Component\RemoteEvent\Event\Mailer\AbstractMailerEvent;
15+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
16+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
17+
use Symfony\Component\RemoteEvent\Exception\ParseException;
18+
use Symfony\Component\RemoteEvent\PayloadConverterInterface;
19+
20+
final class BrevoPayloadConverter implements PayloadConverterInterface
21+
{
22+
public function convert(array $payload): AbstractMailerEvent
23+
{
24+
if (\in_array($payload['event'], ['request', 'deferred', 'delivered', 'soft_bounce', 'hard_bounce', 'invalid_email', 'blocked', 'error'], true)) {
25+
$name = match ($payload['event']) {
26+
'request' => MailerDeliveryEvent::RECEIVED,
27+
'deferred' => MailerDeliveryEvent::DEFERRED,
28+
'delivered' => MailerDeliveryEvent::DELIVERED,
29+
'soft_bounce' => MailerDeliveryEvent::BOUNCE,
30+
'hard_bounce' => MailerDeliveryEvent::BOUNCE,
31+
'invalid_email' => MailerDeliveryEvent::DROPPED,
32+
'blocked' => MailerDeliveryEvent::DROPPED,
33+
'error' => MailerDeliveryEvent::DROPPED,
34+
};
35+
36+
$event = new MailerDeliveryEvent($name, $payload['message-id'], $payload);
37+
} else {
38+
$name = match ($payload['event']) {
39+
'click' => MailerEngagementEvent::CLICK,
40+
'unsubscribed' => MailerEngagementEvent::UNSUBSCRIBE,
41+
'unique_opened' => MailerEngagementEvent::OPEN,
42+
'opened' => MailerEngagementEvent::OPEN,
43+
'proxy_open' => MailerEngagementEvent::OPEN,
44+
'complaint' => MailerEngagementEvent::SPAM,
45+
default => throw new ParseException(sprintf('Unsupported event "%s".', $payload['event'])),
46+
};
47+
$event = new MailerEngagementEvent($name, $payload['message-id'], $payload);
48+
}
49+
50+
if (!$date = \DateTimeImmutable::createFromFormat('U', $payload['ts_event'])) {
51+
throw new ParseException(sprintf('Invalid date "%s".', $payload['ts_event']));
52+
}
53+
54+
if (
55+
\in_array($payload['event'], ['deferred', 'soft_bounce', 'hard_bounce', 'invalid_email', 'blocked', 'error'], true)
56+
&& isset($payload['reason'])
57+
) {
58+
$event->setReason($payload['reason']);
59+
}
60+
61+
$event->setDate($date);
62+
$event->setRecipientEmail($payload['email']);
63+
$event->setTags($payload['tags']);
64+
65+
return $event;
66+
}
67+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Mailer\Bridge\Brevo\Tests\Webhook;
13+
14+
use Symfony\Component\Mailer\Bridge\Brevo\RemoteEvent\BrevoPayloadConverter;
15+
use Symfony\Component\Mailer\Bridge\Brevo\Webhook\BrevoRequestParser;
16+
use Symfony\Component\Webhook\Client\RequestParserInterface;
17+
use Symfony\Component\Webhook\Test\AbstractRequestParserTestCase;
18+
19+
class BrevoRequestParserTest extends AbstractRequestParserTestCase
20+
{
21+
protected function createRequestParser(): RequestParserInterface
22+
{
23+
return new BrevoRequestParser(new BrevoPayloadConverter());
24+
}
25+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"id": 814119,
3+
"email": "example@gmail.com",
4+
"message-id": "<202305311400.29297141656@smtp-relay.mailin.fr>",
5+
"date": "2023-05-31 16:00:08",
6+
"tags": [
7+
"tag1",
8+
"tag2"
9+
],
10+
"tag": "[\"tag1\",\"tag2\"]",
11+
"event": "blocked",
12+
"subject": "Subject Line",
13+
"ts_event": 1685541608,
14+
"ts": 1685541608,
15+
"reason": "blocked : due to unsubscribed user",
16+
"ts_epoch": 1685541608993
17+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
4+
5+
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::DROPPED, '<202305311400.29297141656@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['tag1', 'tag2']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1685541608));
9+
$wh->setReason('blocked : due to unsubscribed user');
10+
11+
return $wh;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"id": 814119,
3+
"email": "example@gmail.com",
4+
"message-id": "<202305311408.17112967225@smtp-relay.mailin.fr>",
5+
"date": "2023-05-31 16:08:28",
6+
"tags": [
7+
"welcome",
8+
"tag2"
9+
],
10+
"tag": "[\"welcome\",\"tag2\"]",
11+
"event": "click",
12+
"subject": "Subject Line",
13+
"sending_ip": "127.0.0.1",
14+
"ts": 1685542108,
15+
"ts_epoch": 1685542108462,
16+
"ts_event": 1685542108,
17+
"link": "https://www.google.com"
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::CLICK, '<202305311408.17112967225@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['welcome', 'tag2']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1685542108));
9+
10+
return $wh;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"event": "complaint",
3+
"email": "example@gmail.com",
4+
"id": 814119,
5+
"date": "2020-10-09 00:00:00",
6+
"ts": 1604933619,
7+
"message-id": "<201798300811.5787683@smtp-relay.mailin.fr>",
8+
"ts_event": 1604933654,
9+
"X-Mailin-custom": "some_custom_header",
10+
"tags": ["transac_messages"]
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::SPAM, '<201798300811.5787683@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['transac_messages']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1604933654));
9+
10+
return $wh;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"event":"deferred",
3+
"email": "example@domain.com",
4+
"id": 814119,
5+
"date": "2020-10-09 00:00:00",
6+
"ts": 1604933619,
7+
"message-id": "<202305311400.29297141656@smtp-relay.mailin.fr>",
8+
"ts_event": 1604933654,
9+
"subject": "My first Transactional",
10+
"X-Mailin-custom": "some_custom_header",
11+
"sending_ip": "127.0.0.1",
12+
"ts_epoch": 1604933654,
13+
"template_id": 22,
14+
"tags": ["transac_messages"],
15+
"reason": "spam"
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
4+
5+
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::DEFERRED, '<202305311400.29297141656@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@domain.com');
7+
$wh->setTags(['transac_messages']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1604933654));
9+
$wh->setReason('spam');
10+
11+
return $wh;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"id": 814119,
3+
"email": "example@gmail.com",
4+
"message-id": "<202305311328.81899448177@smtp-relay.mailin.fr>",
5+
"date": "2023-05-31 15:28:33",
6+
"tags": [
7+
"tag1",
8+
"tag2"
9+
],
10+
"tag": "[\"tag1\",\"tag2\"]",
11+
"event": "delivered",
12+
"subject": "Subject Line",
13+
"sending_ip": "127.0.0.1",
14+
"ts_event": 1685539713,
15+
"ts": 1685539713,
16+
"reason": "sent",
17+
"ts_epoch": 1685539713018
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
4+
5+
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::DELIVERED, '<202305311328.81899448177@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['tag1', 'tag2']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1685539713));
9+
10+
return $wh;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"event": "invalid_email",
3+
"email": "example@gmail.com",
4+
"id": 814119,
5+
"date": "2020-10-09 00:00:00",
6+
"ts": 1604933619,
7+
"message-id": "<201798300811.5787683@smtp-relay.mailin.fr>",
8+
"ts_event": 1604933654,
9+
"subject": "My first Transactional",
10+
"X-Mailin-custom": "some_custom_header",
11+
"template_id": 22,
12+
"tags": ["transac_messages"],
13+
"ts_epoch": 1604933623
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
4+
5+
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::DROPPED, '<201798300811.5787683@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', ' F438 .json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['transac_messages']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1604933654));
9+
10+
return $wh;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"id": 814119,
3+
"email": "example@gmail.com",
4+
"message-id": "<202305311437.85220493321@smtp-relay.mailin.fr>",
5+
"date": "2023-05-31 16:37:07",
6+
"tags": [
7+
"welcome",
8+
"tag2"
9+
],
10+
"tag": "[\"welcome\",\"tag2\"]",
11+
"event": "hard_bounce",
12+
"subject": "Subject Line",
13+
"sending_ip": "127.0.0.1",
14+
"ts_event": 1685543827,
15+
"ts": 1685543827,
16+
"reason": "550-5.1.1 The email account that you tried to reach does not exist. Please try\n 550-5.1.1 double-checking the recipient's email address for typos or\n 550-5.1.1 unnecessary spaces. Learn more at\n 550 5.1.1 https://support.google.com/mail/?p=NoSuchUser g14-20020a5d698e000000b0030aefbb8608si2668200wru.496 - gsmtp",
17+
"ts_epoch": 1685543827372
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
4+
5+
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::BOUNCE, '<202305311437.85220493321@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['welcome', 'tag2']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1685543827));
9+
$wh->setReason("550-5.1.1 The email account that you tried to reach does not exist. Please try\n 550-5.1.1 double-checking the recipient's email address for typos or\n 550-5.1.1 unnecessary spaces. Learn more at\n 550 5.1.1 https://support.google.com/mail/?p=NoSuchUser g14-20020a5d698e000000b0030aefbb8608si2668200wru.496 - gsmtp");
10+
11+
return $wh;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"event": "invalid_email",
3+
"email": "example@gmail.com",
4+
"id": 625895,
5+
"date": "2020-10-09 00:00:00",
6+
"ts": 1604933619,
7+
"message-id": "<201798300811.5787683@smtp-relay.mailin.fr>",
8+
"ts_event": 1604933654,
9+
"subject": "My first Transactional",
10+
"X-Mailin-custom": "some_custom_header",
11+
"template_id": 22,
12+
"tags": ["transac_messages"],
13+
"ts_epoch": 1604933623
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
4+
5+
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::DROPPED, '<201798300811.5787683@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['transac_messages']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1604933654));
9+
10+
return $wh;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"id": 814119,
3+
"email": "example@gmail.com",
4+
"message-id": "<202305311408.17112967225@smtp-relay.mailin.fr>",
5+
"date": "2023-05-31 16:45:09",
6+
"tags": [
7+
"welcome",
8+
"tag2"
9+
],
10+
"tag": "[\"welcome\",\"tag2\"]",
11+
"event": "opened",
12+
"subject": "Subject Line",
13+
"sending_ip": "127.0.0.1",
14+
"ts": 1685544309,
15+
"ts_epoch": 1685544309368,
16+
"ts_event": 1685544309,
17+
"link": ""
18+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::OPEN, '<202305311408.17112967225@smtp-relay.mailin.fr>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['welcome', 'tag2']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1685544309));
9+
10+
return $wh;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"event": "proxy_open",
3+
"email": "example@gmail.com",
4+
"id": 1,
5+
"date": "2020-10-09 00:00:00",
6+
"message-id": "<201798300811.5787683@relay.domain.com>",
7+
"subject": "My first Transactional",
8+
"tags": ["transactionalTag"],
9+
"sending_ip": "127.0.0.1",
10+
"s_epoch": 1534486682000,
11+
"template_id": 1,
12+
"ts": 1604933654,
13+
"ts_event": 1604933654
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::OPEN, '<201798300811.5787683@relay.domain.com>', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true, flags: JSON_THROW_ON_ERROR));
6+
$wh->setRecipientEmail('example@gmail.com');
7+
$wh->setTags(['transactionalTag']);
8+
$wh->setDate(\DateTimeImmutable::createFromFormat('U', 1604933654));
9+
10+
return $wh;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"id": 814119,
3+
"email": "example@gmail.com",
4+
"message-id": "<202305311313.92192897094@smtp-relay.mailin.fr>",
5+
"date": "2023-05-31 15:13:08",
6+
"tags": [
7+
"tag1",
8+
"tag2"
9+
],
10+
"tag": "[\"tag1\",\"tag2\"]",
11+
"event": "request",
12+
"subject": "Subject Line",
13+
"sending_ip": "127.0.0.1",
14+
"ts_event": 1685538788,
15+
"ts": 1685538788,
16+
"reason": "sent",
17+
"ts_epoch": 1685538788179
18+
}

0 commit comments

Comments
 (0)
0