mirror of
https://github.com/pacnpal/django-anymail.git
synced 2025-12-20 11:51:05 -05:00
Feature: Implement merge_headers
Implement and document `merge_headers` for all other ESPs that can support it. (See #371 for base and Amazon SES implementation.) Closes #374
This commit is contained in:
@@ -161,7 +161,7 @@ class UnisenderGoPayload(RequestsPayload):
|
||||
headers.pop("to", None)
|
||||
if headers.pop("cc", None):
|
||||
self.unsupported_feature(
|
||||
"cc with batch send (merge_data or merge_metadata)"
|
||||
"cc with batch send (merge_data, merge_metadata, or merge_headers)"
|
||||
)
|
||||
|
||||
if not headers:
|
||||
@@ -339,5 +339,26 @@ class UnisenderGoPayload(RequestsPayload):
|
||||
if recipient_email in merge_metadata:
|
||||
recipient["metadata"] = merge_metadata[recipient_email]
|
||||
|
||||
# Unisender Go supports header substitution only with List-Unsubscribe.
|
||||
# (See https://godocs.unisender.ru/web-api-ref#email-send under "substitutions".)
|
||||
SUPPORTED_MERGE_HEADERS = {"List-Unsubscribe"}
|
||||
|
||||
def set_merge_headers(self, merge_headers: dict[str, dict[str, str]]) -> None:
|
||||
assert self.data["recipients"] # must be called after set_to
|
||||
if merge_headers:
|
||||
for recipient in self.data["recipients"]:
|
||||
recipient_email = recipient["email"]
|
||||
for key, value in merge_headers.get(recipient_email, {}).items():
|
||||
field = key.title() # canonicalize field name capitalization
|
||||
if field in self.SUPPORTED_MERGE_HEADERS:
|
||||
# Set up a substitution for Header__Field_Name
|
||||
field_sub = "Header__" + field.replace("-", "_")
|
||||
recipient.setdefault("substitutions", {})[field_sub] = value
|
||||
self.data.setdefault("headers", {})[field] = (
|
||||
"{{%s}}" % field_sub
|
||||
)
|
||||
else:
|
||||
self.unsupported_feature(f"{field!r} in merge_headers")
|
||||
|
||||
def set_esp_extra(self, extra: dict) -> None:
|
||||
update_deep(self.data, extra)
|
||||
|
||||
Reference in New Issue
Block a user