Skip to content

Commit 3cadaca

Browse files
committed
Mailjet: handle bare event when webhook "group events" not enabled
Fixes #106
1 parent 59a90c6 commit 3cadaca

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

anymail/webhooks/mailjet.py

+8
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ class MailjetTrackingWebhookView(AnymailBaseWebhookView):
1616

1717
def parse_events(self, request):
1818
esp_events = json.loads(request.body.decode('utf-8'))
19+
# Mailjet webhook docs say the payload is "a JSON array of event objects,"
20+
# but that's not true if "group events" isn't enabled in webhook config...
21+
try:
22+
esp_events[0] # is this really an array of events?
23+
except IndexError:
24+
pass # yep (and it's empty?!)
25+
except KeyError:
26+
esp_events = [esp_events] # nope, it's a single, bare event
1927
return [self.esp_to_anymail_event(esp_event) for esp_event in esp_events]
2028

2129
# https://dev.mailjet.com/guides/#events

tests/test_mailjet_webhooks.py

+29
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,32 @@ def test_bounced_greylist_event(self):
224224
self.assertEqual(event.message_id, "12345678901234567")
225225
self.assertEqual(event.recipient, "[email protected]")
226226
self.assertEqual(event.reject_reason, "other")
227+
228+
def test_non_grouped_event(self):
229+
# If you don't enable "group events" on a webhook, Mailjet sends a single bare event
230+
# (not a list of one event, despite what the docs say).
231+
raw_event = {
232+
"event": "sent",
233+
"time": 1498093527,
234+
"MessageID": 12345678901234567,
235+
"email": "[email protected]",
236+
"mj_campaign_id": 1234567890,
237+
"mj_contact_id": 9876543210,
238+
"customcampaign": "",
239+
"mj_message_id": "12345678901234567",
240+
"smtp_reply": "sent (250 2.0.0 OK 1498093527 a67bc12345def.22 - gsmtp)",
241+
"Payload": "",
242+
}
243+
response = self.client.post('/anymail/mailjet/tracking/',
244+
content_type='application/json', data=json.dumps(raw_event))
245+
self.assertEqual(response.status_code, 200)
246+
kwargs = self.assert_handler_called_once_with(self.tracking_handler, sender=MailjetTrackingWebhookView,
247+
event=ANY, esp_name='Mailjet')
248+
event = kwargs['event']
249+
self.assertIsInstance(event, AnymailTrackingEvent)
250+
self.assertEqual(event.event_type, "delivered")
251+
self.assertEqual(event.timestamp, datetime(2017, 6, 22, 1, 5, 27, tzinfo=utc))
252+
self.assertEqual(event.esp_event, raw_event)
253+
self.assertEqual(event.mta_response, "sent (250 2.0.0 OK 1498093527 a67bc12345def.22 - gsmtp)")
254+
self.assertEqual(event.message_id, "12345678901234567") # converted to str (matching backend status)
255+
self.assertEqual(event.recipient, "[email protected]")

0 commit comments

Comments
 (0)