From 93a4398e05518256a687be1896a548c9f5dcdd4c Mon Sep 17 00:00:00 2001 From: Eric Abouaf Date: Mon, 6 Jan 2025 17:10:34 +0100 Subject: [PATCH] [RemoteEvent][Webhook] fix SendgridRequestParser & SendgridPayloadConverter in case of missing sg_message_id --- .../RemoteEvent/SendgridPayloadConverter.php | 4 ++-- .../RemoteEvent/SendgridPayloadConverterTest.php | 15 +++++++++++++++ .../Sendgrid/Webhook/SendgridRequestParser.php | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php index 0be091c22cf34..f10e147647f2b 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php @@ -31,7 +31,7 @@ public function convert(array $payload): AbstractMailerEvent 'deferred' => MailerDeliveryEvent::DEFERRED, 'bounce' => MailerDeliveryEvent::BOUNCE, }; - $event = new MailerDeliveryEvent($name, $payload['sg_message_id'], $payload); + $event = new MailerDeliveryEvent($name, $payload['sg_message_id'] ?? $payload['sg_event_id'], $payload); $event->setReason($payload['reason'] ?? ''); } else { $name = match ($payload['event']) { @@ -41,7 +41,7 @@ public function convert(array $payload): AbstractMailerEvent 'spamreport' => MailerEngagementEvent::SPAM, default => throw new ParseException(sprintf('Unsupported event "%s".', $payload['event'])), }; - $event = new MailerEngagementEvent($name, $payload['sg_message_id'], $payload); + $event = new MailerEngagementEvent($name, $payload['sg_message_id'] ?? $payload['sg_event_id'], $payload); } if (!$date = \DateTimeImmutable::createFromFormat('U', $payload['timestamp'])) { diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php index 1d02b5c8a42bc..f7201b373aa86 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php @@ -97,4 +97,19 @@ public function testInvalidDate() 'email' => 'test@example.com', ]); } + + public function testAsynchronousBounce() + { + $converter = new SendgridPayloadConverter(); + + $event = $converter->convert([ + 'event' => 'bounce', + 'sg_event_id' => '123456', + 'timestamp' => '123456789', + 'email' => 'test@example.com', + ]); + + $this->assertInstanceOf(MailerDeliveryEvent::class, $event); + $this->assertSame('123456', $event->getId()); + } } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php index b0f7f78dc4948..fc603f5893547 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php @@ -48,7 +48,7 @@ protected function doParse(Request $request, string $secret): ?AbstractMailerEve !isset($content[0]['email']) || !isset($content[0]['timestamp']) || !isset($content[0]['event']) - || !isset($content[0]['sg_message_id']) + || !isset($content[0]['sg_event_id']) ) { throw new RejectWebhookException(406, 'Payload is malformed.'); }