From 4ca39a976f97d4bace54de4dd3ab8859f2a30748 Mon Sep 17 00:00:00 2001 From: medmunds Date: Tue, 1 Nov 2016 12:12:21 -0700 Subject: [PATCH] Postmark: handle Reply-To in EmailMessage headers Move 'Reply-To' header into dedicated Postmark API param Fixes #39 --- anymail/backends/postmark.py | 7 ++++++- tests/test_postmark_backend.py | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/anymail/backends/postmark.py b/anymail/backends/postmark.py index 2d2eeb9..55819bc 100644 --- a/anymail/backends/postmark.py +++ b/anymail/backends/postmark.py @@ -1,5 +1,7 @@ import re +from requests.structures import CaseInsensitiveDict + from ..exceptions import AnymailRequestsAPIError from ..message import AnymailRecipientStatus from ..utils import get_anymail_setting @@ -140,9 +142,12 @@ class PostmarkPayload(RequestsPayload): self.data["ReplyTo"] = reply_to def set_extra_headers(self, headers): + header_dict = CaseInsensitiveDict(headers) + if 'Reply-To' in header_dict: + self.data["ReplyTo"] = header_dict.pop('Reply-To') self.data["Headers"] = [ {"Name": key, "Value": value} - for key, value in headers.items() + for key, value in header_dict.items() ] def set_text_body(self, body): diff --git a/tests/test_postmark_backend.py b/tests/test_postmark_backend.py index 7b2b383..3a67cfc 100644 --- a/tests/test_postmark_backend.py +++ b/tests/test_postmark_backend.py @@ -85,9 +85,9 @@ class PostmarkBackendStandardEmailTests(PostmarkBackendMockAPITestCase): self.assertEqual(data['To'], 'to1@example.com, Also To ') self.assertEqual(data['Bcc'], 'bcc1@example.com, Also BCC ') self.assertEqual(data['Cc'], 'cc1@example.com, Also CC ') + self.assertEqual(data['ReplyTo'], 'another@example.com') self.assertCountEqual(data['Headers'], [ {'Name': 'Message-ID', 'Value': 'mycustommsgid@sales.example.com'}, - {'Name': 'Reply-To', 'Value': 'another@example.com'}, {'Name': 'X-MyHeader', 'Value': 'my value'}, ]) @@ -136,6 +136,16 @@ class PostmarkBackendStandardEmailTests(PostmarkBackendMockAPITestCase): self.assertEqual(data['ReplyTo'], 'reply@example.com, Other ') self.assertEqual(data['Headers'], [{'Name': 'X-Other', 'Value': 'Keep'}]) # don't lose other headers + def test_reply_to_header(self): + # Reply-To needs to be moved out of headers, into dedicated param + email = mail.EmailMessage('Subject', 'Body goes here', 'from@example.com', ['to1@example.com'], + headers={'reply-to': 'reply@example.com, Other ', + 'X-Other': 'Keep'}) + email.send() + data = self.get_api_call_json() + self.assertEqual(data['ReplyTo'], 'reply@example.com, Other ') + self.assertEqual(data['Headers'], [{'Name': 'X-Other', 'Value': 'Keep'}]) # don't lose other headers + def test_attachments(self): text_content = "* Item one\n* Item two\n* Item three" self.message.attach(filename="test.txt", content=text_content, mimetype="text/plain")