mirror of
https://github.com/pacnpal/django-anymail.git
synced 2025-12-20 11:51:05 -05:00
Add ESP templates, batch send and merge
* message.template_id to use ESP stored templates * message.merge_data and merge_global_data to supply per-recipient/global merge variables (with or without an ESP stored template) * When using per-recipient merge_data, tell ESP to use batch send: individual message per "to" address. (Mailgun does this automatically; SendGrid requires using a different "to" field; Mandrill requires `preserve_recipients=False`; Postmark doesn't support *this type* of batch sending with merge data.) * Allow message.from_email=None (must be set after init) and message.subject=None to suppress those fields in API calls (for ESPs that allow "From" and "Subject" in their template definitions). Mailgun: * Emulate merge_global_data by copying to recipient-variables for each recipient. SendGrid: * Add delimiters to merge field names via esp_extra['merge_field_format'] or ANYMAIL_SENDGRID_MERGE_FIELD_FORMAT setting. Mandrill: * Remove Djrill versions of these features; update migration notes. Closes #5.
This commit is contained in:
@@ -147,6 +147,24 @@ class MandrillPayload(RequestsPayload):
|
||||
def set_track_opens(self, track_opens):
|
||||
self.data["message"]["track_opens"] = track_opens
|
||||
|
||||
def set_template_id(self, template_id):
|
||||
self.data["template_name"] = template_id
|
||||
self.data.setdefault("template_content", []) # Mandrill requires something here
|
||||
|
||||
def set_merge_data(self, merge_data):
|
||||
self.data['message']['preserve_recipients'] = False # if merge, hide recipients from each other
|
||||
self.data['message']['merge_vars'] = [
|
||||
{'rcpt': rcpt, 'vars': [{'name': key, 'content': rcpt_data[key]}
|
||||
for key in sorted(rcpt_data.keys())]} # sort for testing reproducibility
|
||||
for rcpt, rcpt_data in merge_data.items()
|
||||
]
|
||||
|
||||
def set_merge_global_data(self, merge_global_data):
|
||||
self.data['message']['global_merge_vars'] = [
|
||||
{'name': var, 'content': value}
|
||||
for var, value in merge_global_data.items()
|
||||
]
|
||||
|
||||
def set_esp_extra(self, extra):
|
||||
pass
|
||||
|
||||
@@ -170,10 +188,7 @@ class MandrillPayload(RequestsPayload):
|
||||
('subaccount', last, None),
|
||||
('google_analytics_domains', last, None),
|
||||
('google_analytics_campaign', last, None),
|
||||
('global_merge_vars', combine, _expand_merge_vars),
|
||||
('merge_vars', combine, None),
|
||||
('recipient_metadata', combine, None),
|
||||
('template_name', last, None),
|
||||
('template_content', combine, _expand_merge_vars),
|
||||
)
|
||||
|
||||
@@ -183,20 +198,9 @@ class MandrillPayload(RequestsPayload):
|
||||
def set_ip_pool(self, ip_pool):
|
||||
self.data["ip_pool"] = ip_pool
|
||||
|
||||
def set_template_name(self, template_name):
|
||||
self.data["template_name"] = template_name
|
||||
self.data.setdefault("template_content", []) # Mandrill requires something here
|
||||
|
||||
def set_template_content(self, template_content):
|
||||
self.data["template_content"] = template_content
|
||||
|
||||
def set_merge_vars(self, merge_vars):
|
||||
# For testing reproducibility, we sort the recipients
|
||||
self.data['message']['merge_vars'] = [
|
||||
{'rcpt': rcpt, 'vars': _expand_merge_vars(merge_vars[rcpt])}
|
||||
for rcpt in sorted(merge_vars.keys())
|
||||
]
|
||||
|
||||
def set_recipient_metadata(self, recipient_metadata):
|
||||
# For testing reproducibility, we sort the recipients
|
||||
self.data['message']['recipient_metadata'] = [
|
||||
|
||||
Reference in New Issue
Block a user