Skip to content

Commit 5332035

Browse files
feature symfony#61555 [Mailer][Sweego] Add support for new webhook events (welcoMattic)
This PR was merged into the 7.4 branch. Discussion ---------- [Mailer][Sweego] Add support for new webhook events | Q | A | ------------- | --- | Branch? | 7.4 | Bug fix? | no | New feature? | yes <!-- if yes, also update src/**/CHANGELOG.md --> | Deprecations? | no <!-- if yes, also update UPGRADE-*.md and src/**/CHANGELOG.md --> | Issues | Fix #... <!-- prefix each issue number with "Fix #"; no need to create an issue if none exists, explain below --> | License | MIT As documented [here](https://learn.sweego.io/docs/webhooks/payload), Sweego now sent more webhook events for their email service. Added: - `soft-bounce` (yes, with a dash) - `hard_bounce` (yes, with an underscore) - `list_unsub` - `complaint` - `email_clicked` - `email_opened` /cc `@Wasta`-Geek `@pydubreucq` Commits ------- 7fe2bec Add missing Sweego Mailer Bridge webhook events
2 parents 545c390 + 7fe2bec commit 5332035

21 files changed

+436
-6
lines changed

src/Symfony/Component/Mailer/Bridge/Sweego/RemoteEvent/SweegoPayloadConverter.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,32 @@
1313

1414
use Symfony\Component\RemoteEvent\Event\Mailer\AbstractMailerEvent;
1515
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
16+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
1617
use Symfony\Component\RemoteEvent\Exception\ParseException;
1718
use Symfony\Component\RemoteEvent\PayloadConverterInterface;
1819

1920
final class SweegoPayloadConverter implements PayloadConverterInterface
2021
{
2122
public function convert(array $payload): AbstractMailerEvent
2223
{
23-
if (\in_array($payload['event_type'], ['email_sent', 'delivered'], true)) {
24+
if (\in_array($payload['event_type'], ['email_sent', 'delivered', 'soft-bounce', 'hard_bounce'], true)) {
2425
$name = match ($payload['event_type']) {
2526
'email_sent' => MailerDeliveryEvent::RECEIVED,
2627
'delivered' => MailerDeliveryEvent::DELIVERED,
28+
'soft-bounce', 'hard_bounce' => MailerDeliveryEvent::BOUNCE,
2729
};
2830

2931
$event = new MailerDeliveryEvent($name, $payload['headers']['x-transaction-id'], $payload);
32+
} else {
33+
$name = match ($payload['event_type']) {
34+
'list_unsub' => MailerEngagementEvent::UNSUBSCRIBE,
35+
'complaint' => MailerEngagementEvent::SPAM,
36+
'email_clicked' => MailerEngagementEvent::CLICK,
37+
'email_opened' => MailerEngagementEvent::OPEN,
38+
default => throw new ParseException(\sprintf('Unsupported event "%s".', $payload['event_type'])),
39+
};
40+
41+
$event = new MailerEngagementEvent($name, $payload['headers']['x-transaction-id'], $payload);
3042
}
3143

3244
if (!$date = \DateTimeImmutable::createFromFormat(\DATE_ATOM, $payload['timestamp'])) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"event_type": "complaint",
3+
"timestamp": "2024-09-02T08:45:05+00:00",
4+
"swg_uid": "01-47d3e283-1afb-4b9e-bd45-bfbf32ba251f",
5+
"event_id": "3e42ea83-f6a5-40cc-a1fa-8745669454",
6+
"channel": "email",
7+
"transaction_id": "b0e50d6d-118c-459b-84e1-70209e68c1c9",
8+
"headers": {
9+
"x-mailer": "Sweego",
10+
"x-swg-uid": "01-47d3ekdpj-1fdb-4bde-bsd5-bfbf32sdgf54f",
11+
"x-campaign-id": "default",
12+
"x-client-id": "0c8cc711c85e45b79189456644166sj",
13+
"x-originating-ip": "185.255.28.207",
14+
"x-campaign-type": "default",
15+
"x-transaction-id": "b0e50d6d-118c-459b-84e1-70209e68c1c9"
16+
},
17+
"campaign_tags": null,
18+
"campaign_type": "default",
19+
"campaign_id": "default",
20+
"recipient": "[email protected]",
21+
"domain_from": "example.org"
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::SPAM, 'b0e50d6d-118c-459b-84e1-70209e68c1c9', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true));
6+
$wh->setRecipientEmail('[email protected]');
7+
$wh->setMetadata([
8+
'x-mailer' => 'Sweego',
9+
'x-swg-uid' => '01-47d3ekdpj-1fdb-4bde-bsd5-bfbf32sdgf54f',
10+
'x-campaign-id' => 'default',
11+
'x-client-id' => '0c8cc711c85e45b79189456644166sj',
12+
'x-originating-ip' => '185.255.28.207',
13+
'x-campaign-type' => 'default',
14+
'x-transaction-id' => 'b0e50d6d-118c-459b-84e1-70209e68c1c9',
15+
]);
16+
$wh->setDate(\DateTimeImmutable::createFromFormat(\DATE_ATOM, '2024-09-02T08:45:05+00:00'));
17+
18+
return $wh;

src/Symfony/Component/Mailer/Bridge/Sweego/Tests/Webhook/Fixtures/delivered.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
"event_id": "9f26b9d0-13d7-410c-ba04-5019cd30e6d0",
66
"channel": "email",
77
"headers": {
8+
"x-campaign-type": "default",
9+
"x-swg-uid": "01-f14sqdf65-fgh9b6-4160-bc45-fliolioa277ca9",
10+
"x-mailer": "Sweego",
11+
"x-campaign-id": "default",
12+
"x-client-id": "0c8cc711c85e4595953862",
13+
"x-originating-ip": "XXX.XXX.XXX.XX",
14+
"x-email-id": "23",
815
"x-transaction-id": "d4fbec9d-eed9-44d5-af47-c1126467a5ca"
916
},
1017
"campaign_tags": null,

src/Symfony/Component/Mailer/Bridge/Sweego/Tests/Webhook/Fixtures/delivered.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
$wh = new MailerDeliveryEvent(MailerDeliveryEvent::DELIVERED, 'd4fbec9d-eed9-44d5-af47-c1126467a5ca', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true));
66
$wh->setRecipientEmail('[email protected]');
77
$wh->setMetadata([
8+
'x-campaign-type' => 'default',
9+
'x-swg-uid' => '01-f14sqdf65-fgh9b6-4160-bc45-fliolioa277ca9',
10+
'x-mailer' => 'Sweego',
11+
'x-campaign-id' => 'default',
12+
'x-client-id' => '0c8cc711c85e4595953862',
13+
'x-originating-ip' => 'XXX.XXX.XXX.XX',
14+
'x-email-id' => '23',
815
'x-transaction-id' => 'd4fbec9d-eed9-44d5-af47-c1126467a5ca',
916
]);
1017
$wh->setDate(\DateTimeImmutable::createFromFormat(\DATE_ATOM, '2024-08-15T16:05:59+00:00'));
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"event_type": "email_clicked",
3+
"timestamp": "2024-09-02T08:45:05+00:00",
4+
"swg_uid": "02-6e5dbe48-e6f4-4af3-8fb4-bf125e75776b",
5+
"event_id": "3e434a94-628c-4cbd-92b5-ed6be715aa2c",
6+
"channel": "email",
7+
"transaction_id": "568c5678-2d03-40f8-89e0-22ffb5cfe63d",
8+
"headers": {
9+
"x-mailer": "Sweego",
10+
"x-swg-uid": "02-6e5dbe48-e6f4-4af3-8fb4-bf125e75776b",
11+
"x-client-id": "f8367456332369298d050cf4bc83e058",
12+
"x-client-ip": "XXX.XXX.XXX.XXX",
13+
"x-campaign-id": "fake_campaign",
14+
"x-campaign-type": "default",
15+
"x-originating-ip": "XXX.XXX.XXX.XXX",
16+
"x-transaction-id": "568c5678-2d03-40f8-89e0-22ffb5cfe63d"
17+
},
18+
"campaign_tags": null,
19+
"campaign_type": "default",
20+
"campaign_id": "fake_campaign",
21+
"recipient": "[email protected]",
22+
"domain_from": "example.org",
23+
"subject": "Test webhook 2024-01-01",
24+
"click": {
25+
"ip_address": "XXX.XXX.XXX.XXX",
26+
"url": "https://google.com",
27+
"user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)",
28+
"proxy": false
29+
}
30+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::CLICK, '568c5678-2d03-40f8-89e0-22ffb5cfe63d', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true));
6+
$wh->setRecipientEmail('[email protected]');
7+
$wh->setMetadata([
8+
'x-mailer' => 'Sweego',
9+
'x-swg-uid' => '02-6e5dbe48-e6f4-4af3-8fb4-bf125e75776b',
10+
'x-client-id' => 'f8367456332369298d050cf4bc83e058',
11+
'x-client-ip' => 'XXX.XXX.XXX.XXX',
12+
'x-campaign-id' => 'fake_campaign',
13+
'x-campaign-type' => 'default',
14+
'x-originating-ip' => 'XXX.XXX.XXX.XXX',
15+
'x-transaction-id' => '568c5678-2d03-40f8-89e0-22ffb5cfe63d',
16+
]);
17+
$wh->setDate(\DateTimeImmutable::createFromFormat(\DATE_ATOM, '2024-09-02T08:45:05+00:00'));
18+
19+
return $wh;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"event_type": "email_opened",
3+
"timestamp": "2024-09-02T08:45:05+00:00",
4+
"swg_uid": "02-6e5dbe48-e6f4-4af3-8fb4-bf125e75776b",
5+
"event_id": "3e434a94-628c-4cbd-92b5-ed6be715aa2c",
6+
"channel": "email",
7+
"transaction_id": "69b90094-872f-4250-97d5-515ac7114b1b",
8+
"headers": {
9+
"x-mailer": "Sweego",
10+
"x-swg-uid": "02-6e5dbe48-e6f4-4af3-8fb4-bf125e75776b",
11+
"x-client-id": "f8367456332593298d050cf4bc83e0ab",
12+
"x-client-ip": "XXX.XXX.XXX.XXX",
13+
"x-campaign-id": "fake_campaign",
14+
"x-campaign-type": "default",
15+
"x-originating-ip": "XXX.XXX.XXX.XXX",
16+
"x-transaction-id": "69b90094-872f-4250-97d5-515ac7114b1b"
17+
},
18+
"campaign_tags": null,
19+
"campaign_type": "default",
20+
"campaign_id": "fake_campaign",
21+
"recipient": "[email protected]",
22+
"domain_from": "example.org",
23+
"subject": "Test webhook",
24+
"open": {
25+
"ip_address": "XXX.XXX.XXX.XXX",
26+
"user_agent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)",
27+
"proxy": true
28+
}
29+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
4+
5+
$wh = new MailerEngagementEvent(MailerEngagementEvent::OPEN, '69b90094-872f-4250-97d5-515ac7114b1b', json_decode(file_get_contents(str_replace('.php', '.json', __FILE__)), true));
6+
$wh->setRecipientEmail('[email protected]');
7+
$wh->setMetadata([
8+
'x-mailer' => 'Sweego',
9+
'x-swg-uid' => '02-6e5dbe48-e6f4-4af3-8fb4-bf125e75776b',
10+
'x-client-id' => 'f8367456332593298d050cf4bc83e0ab',
11+
'x-client-ip' => 'XXX.XXX.XXX.XXX',
12+
'x-campaign-id' => 'fake_campaign',
13+
'x-campaign-type' => 'default',
14+
'x-originating-ip' => 'XXX.XXX.XXX.XXX',
15+
'x-transaction-id' => '69b90094-872f-4250-97d5-515ac7114b1b',
16+
]);
17+
$wh->setDate(\DateTimeImmutable::createFromFormat(\DATE_ATOM, '2024-09-02T08:45:05+00:00'));
18+
19+
return $wh;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"event_type": "email_sent",
3+
"timestamp": "2024-09-02T08:45:05+00:00",
4+
"swg_uid": "01-47d3e283-1afb-4b9e-bd45-bfbf32ba251f",
5+
"event_id": "3e42ea83-f6a5-40cc-a1fa-8745669454",
6+
"channel": "email",
7+
"transaction_id": "8a3bf3ee-1863-4a02-906d-2e6494914ddb",
8+
"headers": {
9+
"x-campaign-type": "default",
10+
"x-swg-uid": "01-47d3ekdpj-1fdb-4bde-bsd5-bfbf32sdgf54f",
11+
"x-mailer": "Sweego",
12+
"x-campaign-id": "default",
13+
"x-client-id": "0c8cc711c85e45b79189456644166sj",
14+
"x-originating-ip": "185.255.28.207",
15+
"x-email-id": "23",
16+
"x-transaction-id": "8a3bf3ee-1863-4a02-906d-2e6494914ddb"
17+
},
18+
"campaign_tags": null,
19+
"campaign_type": "default",
20+
"campaign_id": "default",
21+
"recipient": "[email protected]",
22+
"domain_from": "example.org"
23+
}

0 commit comments

Comments
 (0)