Skip to content

Commit 6d08150

Browse files
committed
PR fededback: Refactor /send endpoint, default to unknown status, remove merge data/metadata, implement set extra headers and set esp extra, adjust exception handling, set inbound timestamp to None
1 parent c889807 commit 6d08150

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

anymail/backends/mailpace.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(self, **kwargs):
2121
"api_url",
2222
esp_name=esp_name,
2323
kwargs=kwargs,
24-
default="https://app.mailpace.com/api/v1/send",
24+
default="https://app.mailpace.com/api/v1/",
2525
)
2626
if not api_url.endswith("/"):
2727
api_url += "/"
@@ -37,7 +37,7 @@ def raise_for_status(self, response, payload, message):
3737

3838
def parse_recipient_status(self, response, payload, message):
3939
# Prepare the dict by setting everything to queued without a message id
40-
unknown_status = AnymailRecipientStatus(message_id=None, status="queued")
40+
unknown_status = AnymailRecipientStatus(message_id=None, status="unknown")
4141
recipient_status = CaseInsensitiveCasePreservingDict(
4242
{recip.addr_spec: unknown_status for recip in payload.to_cc_and_bcc_emails}
4343
)
@@ -122,10 +122,11 @@ def __init__(self, message, defaults, backend, *args, **kwargs):
122122
}
123123
self.server_token = backend.server_token # esp_extra can override
124124
self.to_cc_and_bcc_emails = []
125-
self.merge_data = None
126-
self.merge_metadata = None
127125
super().__init__(message, defaults, backend, headers=headers, *args, **kwargs)
128126

127+
def get_api_endpoint(self):
128+
return "send"
129+
129130
def get_request_params(self, api_url):
130131
params = super().get_request_params(api_url)
131132
params["headers"]["MailPace-Server-Token"] = self.server_token
@@ -159,6 +160,12 @@ def set_reply_to(self, emails):
159160
reply_to = ", ".join([email.address for email in emails])
160161
self.data["replyto"] = reply_to
161162

163+
def set_extra_headers(self, headers):
164+
if "list-unsubscribe" in headers:
165+
self.data["list_unsubscribe"] = headers.pop("list-unsubscribe")
166+
if headers:
167+
self.unsupported_features("extra_headers (other than List-Unsubscribe)")
168+
162169
def set_text_body(self, body):
163170
self.data["textbody"] = body
164171

@@ -188,3 +195,8 @@ def set_tags(self, tags):
188195
self.data["tags"] = tags[0]
189196
else:
190197
self.data["tags"] = tags
198+
199+
def set_esp_extra(self, extra):
200+
self.data.update(extra)
201+
# Special handling for 'server_token':
202+
self.server_token = self.data.pop("server_token", self.server_token)

anymail/webhooks/mailpace.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ class MailPaceTrackingWebhookView(MailPaceBaseWebhookView):
5151
webhook_key = None
5252

5353
def __init__(self, **kwargs):
54-
try:
55-
self.webhook_key = get_anymail_setting(
56-
"webhook_key", esp_name=self.esp_name, kwargs=kwargs, allow_bare=True
57-
)
58-
self.warn_if_no_basic_auth = False
59-
except AnymailConfigurationError:
60-
self.webhook_key = None
61-
self.warn_if_no_basic_auth = True
54+
self.webhook_key = get_anymail_setting(
55+
"webhook_key",
56+
esp_name=self.esp_name,
57+
kwargs=kwargs,
58+
allow_bare=True,
59+
default=None,
60+
)
61+
self.warn_if_no_basic_auth = self.webhook_key is None
6262

6363
super().__init__(**kwargs)
6464

@@ -81,10 +81,10 @@ def validate_request(self, request):
8181
try:
8282
signature_base64 = request.headers["X-MailPace-Signature"]
8383
signature = base64.b64decode(signature_base64)
84-
except (KeyError, binascii.Error):
84+
except (KeyError, binascii.Error) as error:
8585
raise AnymailWebhookValidationFailure(
8686
"MailPace webhook called with invalid or missing signature"
87-
)
87+
) from error
8888

8989
verify_key_base64 = self.webhook_key
9090

@@ -98,9 +98,6 @@ def validate_request(self, request):
9898
raise AnymailWebhookValidationFailure(
9999
"MailPace webhook called with incorrect signature"
100100
)
101-
else:
102-
return True
103-
# No webhook key set
104101

105102
def esp_to_anymail_event(self, esp_event):
106103
event_type = self.event_record_types.get(esp_event["event"], EventType.UNKNOWN)
@@ -138,7 +135,7 @@ def esp_to_anymail_event(self, esp_event):
138135

139136
return AnymailInboundEvent(
140137
event_type=EventType.INBOUND,
141-
timestamp=timezone.now(),
138+
timestamp=None,
142139
event_id=esp_event.get("id", None),
143140
esp_event=esp_event,
144141
message=message,

tests/test_mailpace_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def test_send_mail(self):
5656
["to@example.com"],
5757
fail_silently=False,
5858
)
59-
self.assert_esp_called("send/")
59+
self.assert_esp_called("https://app.mailpace.com/api/v1/send")
6060
headers = self.get_api_call_headers()
6161
self.assertEqual(headers["MailPace-Server-Token"], "test_server_token")
6262
data = self.get_api_call_json()

0 commit comments

Comments
 (0)