django-anymail icon indicating copy to clipboard operation
django-anymail copied to clipboard

Issue parsing delivery delays from Postmark

Open jmduke opened this issue 1 year ago • 2 comments

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": "[email protected]"
}

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.

jmduke avatar Aug 21 '24 12:08 jmduke

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.

medmunds avatar Aug 21 '24 19:08 medmunds

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.

jmduke avatar Aug 21 '24 20:08 jmduke