diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 81d04531..19ab016a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -30,6 +30,12 @@ vNext *Unreleased changes* +Fixes +~~~~~ + +* **Postmark:** Workaround for handling inbound test webhooks. + (`More info `__) + Other ~~~~~ diff --git a/anymail/webhooks/postmark.py b/anymail/webhooks/postmark.py index 4b13aed2..e6824b92 100644 --- a/anymail/webhooks/postmark.py +++ b/anymail/webhooks/postmark.py @@ -169,7 +169,13 @@ def esp_to_anymail_event(self, esp_event): attachments = [ AnymailInboundMessage.construct_attachment( content_type=attachment["ContentType"], - content=attachment["Content"], + content=( + attachment.get("Content") + # WORKAROUND: + # The test webhooks are not like their real webhooks + # This allows the test webhooks to be parsed. + or attachment["Data"] + ), base64=True, filename=attachment.get("Name", "") or None, content_id=attachment.get("ContentID", "") or None, diff --git a/tests/test_postmark_inbound.py b/tests/test_postmark_inbound.py index 18fa3957..47a92b22 100644 --- a/tests/test_postmark_inbound.py +++ b/tests/test_postmark_inbound.py @@ -165,6 +165,16 @@ def test_attachments(self): "ContentType": 'message/rfc822; charset="us-ascii"', "ContentLength": len(email_content), }, + # This is an attachement like send by the test webhook + # A workaround is implemented to handle it. + # Once Postmark solves the bug on their side this workaround + # can be reverted. + { + "Name": "test.txt", + "ContentType": "text/plain", + "Data": "VGhpcyBpcyBhdHRhY2htZW50IGNvbnRlbnRzLCBiYXNlLTY0IGVuY29kZWQu", + "ContentLength": 45, + }, ] } @@ -183,7 +193,7 @@ def test_attachments(self): event = kwargs["event"] message = event.message attachments = message.attachments # AnymailInboundMessage convenience accessor - self.assertEqual(len(attachments), 2) + self.assertEqual(len(attachments), 3) self.assertEqual(attachments[0].get_filename(), "test.txt") self.assertEqual(attachments[0].get_content_type(), "text/plain") self.assertEqual(attachments[0].get_content_text(), "test attachment") @@ -192,6 +202,14 @@ def test_attachments(self): attachments[1].get_content_bytes(), email_content ) + # Attachment of test webhook + self.assertEqual(attachments[2].get_filename(), "test.txt") + self.assertEqual(attachments[2].get_content_type(), "text/plain") + self.assertEqual( + attachments[2].get_content_text(), + "This is attachment contents, base-64 encoded.", + ) + inlines = message.inline_attachments self.assertEqual(len(inlines), 1) inline = inlines["abc123"]