anymail / django-anymail

Django email backends and webhooks for Amazon SES, Brevo (Sendinblue), MailerSend, Mailgun, Mailjet, Postmark, Postal, Resend, SendGrid, SparkPost, Unisender Go and more
https://anymail.dev
BSD 3-Clause "New" or "Revised" License
1.7k stars 132 forks source link

Issue parsing delivery delays from Postmark #392

Open jmduke opened 3 months ago

jmduke commented 3 months ago

Thank you for anymail! I am a huge, huge fan :)

I wanted to report a bug with how the backend parses delay notifications from Postmark. Here's a trivial stack trace:

KeyError: 'ErrorCode'
  File "anymail/backends/postmark.py", line 65, in parse_recipient_status
    error_code = one_response["ErrorCode"]

AnymailRequestsAPIError: Invalid Postmark API response format
KeyError: 'ErrorCode'
Postmark API response 200 (OK):
{
  "Message": "Message accepted, but delivery may be delayed.",
  "MessageID": "38360f97-ff7f-44b2-bcd1-5ea94ff2af00",
  "SubmittedAt": "2024-08-05T02:03:37.0951168Z",
  "To": "redacted@gmail.com"
}

With this being the relevant code. Seems straightforward enough, but I didn't know if Anymail has encountered/fixed this in any other ESPs. If so, happy to cargo-cult that approach and submit a fix.

medmunds commented 3 months ago

Thanks for the report, and for including the full Postmark API response.

It looks like this is a new response format that doesn't follow Postmark's docs (which imply ErrorCode is always present, and is 0 when there is no error).

I guess Anymail's Postmark backend needs to detect this case, in the code you linked. We should probably handle it using the successful-send if error_code == 0 logic that follows, but change status="sent" to status="queued" when the Message includes "delivery may be delayed". PR definitely welcome.

jmduke commented 3 months ago

Wonderful. This isn't high-priority on my end (I've only seen ~10 emails with this coding in the millions I've sent over Postmark), but I have put it on my list to try and tackle.