From b00219775f23d7d934e0bc6787482aa7d7e74679 Mon Sep 17 00:00:00 2001 From: Slam <3lnc.slam@gmail.com> Date: Wed, 1 Aug 2018 20:16:35 +0300 Subject: [PATCH 1/4] Adds support for dynamic template data in personalizations --- examples/helpers/{mail => }/mail_example.py | 26 +++++++++++++++++---- sendgrid/helpers/mail/personalization.py | 9 +++++++ test/test_mail.py | 14 +++++++++-- 3 files changed, 43 insertions(+), 6 deletions(-) rename examples/helpers/{mail => }/mail_example.py (91%) diff --git a/examples/helpers/mail/mail_example.py b/examples/helpers/mail_example.py similarity index 91% rename from examples/helpers/mail/mail_example.py rename to examples/helpers/mail_example.py index b2de7f0a0..e227b22cc 100644 --- a/examples/helpers/mail/mail_example.py +++ b/examples/helpers/mail_example.py @@ -1,8 +1,6 @@ -import json -import os -import urllib2 +from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import * -from sendgrid import * + # NOTE: you will need move this file to the root # directory of this project to execute properly. @@ -217,3 +215,23 @@ def send_kitchen_sink(): # this will only send an email if you set SandBox Mode to False send_kitchen_sink() + + +def dynamic_template_usage(): + """ + Sample usage of dynamic (handlebars) transactional templates. + To make this work, you should have dynamic template created within your + SendGrid account. For this particular example, template may be like:: + +
Hello, {{name}}! Your current balance is {{balance}}
+ + """ + mail = Mail(from_email='templates@sendgrid.com') + mail.template_id = 'd-your-dynamic-template-uid' + p = Personalization() + p.add_to(Email('user@example.com')) + p.dynamic_template_data = {'name': 'Bob', 'balance': 42} + mail.add_personalization(p) + + sg = SendGridAPIClient(apikey='SG.your-api-key') + sg.client.mail.send.post(request_body=mail.get()) diff --git a/sendgrid/helpers/mail/personalization.py b/sendgrid/helpers/mail/personalization.py index 8bb4bed0b..8032af958 100644 --- a/sendgrid/helpers/mail/personalization.py +++ b/sendgrid/helpers/mail/personalization.py @@ -1,6 +1,10 @@ class Personalization(object): """A Personalization defines who should receive an individual message and how that message should be handled. + + :var dynamic_template_data: data for dynamic transactional template. + Should be JSON-serializeable structure. No pre-processing sill be done + prior to sending this via http client. """ def __init__(self): @@ -13,6 +17,7 @@ def __init__(self): self._substitutions = [] self._custom_args = [] self._send_at = None + self.dynamic_template_data = None @property def tos(self): @@ -198,4 +203,8 @@ def get(self): if self.send_at is not None: personalization["send_at"] = self.send_at + + if self.dynamic_template_data is not None: + personalization['dynamic_template_data'] = self.dynamic_template_data + return personalization diff --git a/test/test_mail.py b/test/test_mail.py index 7721b5205..fb46d34c2 100644 --- a/test/test_mail.py +++ b/test/test_mail.py @@ -80,7 +80,6 @@ def test_sendgridAPIKey(self): else: self.fail("Should have failed as SendGrid API key included") - def test_helloEmail(self): self.max_diff = None @@ -130,7 +129,7 @@ def test_helloEmailAdditionalContent(self): personalization = Personalization() personalization.add_to(Email("test@example.com")) mail.add_personalization(personalization) - + mail.add_content(Content("text/html", "
some text here")) mail.add_content(Content("text/plain", "some text here")) @@ -562,3 +561,14 @@ def test_disable_tracking(self): def test_directly_setting_substitutions(self): personalization = Personalization() personalization.substitutions = [{'a': 0}] + + def test_dynamic_template_data(self): + p = Personalization() + p.add_to(Email('test@sendgrid.com')) + p.dynamic_template_data = {'customer': {'name': 'Bob', 'returning': True}, 'total': 42} + + expected = { + 'to': [{'email': 'test@sendgrid.com'}], + 'dynamic_template_data': {'customer': {'name': 'Bob', 'returning': True}, 'total': 42} + } + self.assertDictEqual(p.get(), expected) From 210a4fa63a10ad88a2b09ae716344155a180d73a Mon Sep 17 00:00:00 2001 From: Slam <3lnc.slam@gmail.com> Date: Wed, 1 Aug 2018 20:30:30 +0300 Subject: [PATCH 2/4] Example for .md usecase --- use_cases/transational_templates.md | 32 ++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/use_cases/transational_templates.md b/use_cases/transational_templates.md index d3e3a005d..1e89e08a9 100644 --- a/use_cases/transational_templates.md +++ b/use_cases/transational_templates.md @@ -66,6 +66,36 @@ print(response.body) print(response.headers) ``` +### With dynamic templates + +Sendgrid dynamic templates let you leverage power of [handlebars](https://handlebarsjs.com/) +syntax to easily manage complex dynamic content in transactional emails. + +To check this example snippet, create transactional email with code like +```html +Hello, {{name}}! Your current balance is {{balance}}
+``` + +Than send email based on it, providing context for substitutions: +```python +from sendgrid import SendGridAPIClient +from sendgrid.helpers.mail import Email, Personalization + + +sg = SendGridAPIClient(apikey='SG.your-api-key') + +mail = Mail(from_email='templates@example.com') +mail.template_id = 'd-your-dynamic-template-uid' +p = Personalization() +p.add_to(Email('user@example.com')) +p.dynamic_template_data = {'name': 'Bob', 'balance': 42} +mail.add_personalization(p) + +sg.client.mail.send.post(request_body=mail.get()) +``` + +Read more about dynamic templates in [docs](https://sendgrid.com/docs/User_Guide/Transactional_Templates/how_to_send_an_email_with_transactional_templates.html) + ## Without Mail Helper Class ```python @@ -113,4 +143,4 @@ except urllib.HTTPError as e: print(response.status_code) print(response.body) print(response.headers) -``` \ No newline at end of file +``` From 8ff82a83abe14c2d5910b56fad8ccc3cbf53bc74 Mon Sep 17 00:00:00 2001 From: Slam <3lnc.slam@gmail.com> Date: Wed, 1 Aug 2018 20:35:15 +0300 Subject: [PATCH 3/4] Linking SG dashboard --- use_cases/transational_templates.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/use_cases/transational_templates.md b/use_cases/transational_templates.md index 1e89e08a9..d88ffae76 100644 --- a/use_cases/transational_templates.md +++ b/use_cases/transational_templates.md @@ -71,7 +71,8 @@ print(response.headers) Sendgrid dynamic templates let you leverage power of [handlebars](https://handlebarsjs.com/) syntax to easily manage complex dynamic content in transactional emails. -To check this example snippet, create transactional email with code like +To check this example snippet, create +[transactional email template](https://sendgrid.com/dynamic_templates) with code like ```html
Hello, {{name}}! Your current balance is {{balance}}
``` From e1cc25685ffc8ea0d5c7ebc22c083f62cf0169ab Mon Sep 17 00:00:00 2001 From: af4ro <1997anshul@gmail.com> Date: Thu, 9 Aug 2018 09:39:27 -0700 Subject: [PATCH 4/4] minor formatting --- examples/helpers/mail_example.py | 8 ++++++-- test/test_mail.py | 16 ++++++++++++++-- use_cases/transational_templates.md | 3 ++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/examples/helpers/mail_example.py b/examples/helpers/mail_example.py index e227b22cc..0a5b868bc 100644 --- a/examples/helpers/mail_example.py +++ b/examples/helpers/mail_example.py @@ -226,11 +226,15 @@ def dynamic_template_usage():
Hello, {{name}}! Your current balance is {{balance}}
""" - mail = Mail(from_email='templates@sendgrid.com') + mail = Mail() + mail.from_email = 'templates@sendgrid.com' mail.template_id = 'd-your-dynamic-template-uid' p = Personalization() p.add_to(Email('user@example.com')) - p.dynamic_template_data = {'name': 'Bob', 'balance': 42} + p.dynamic_template_data = { + 'name': 'Bob', + 'balance': 42 + } mail.add_personalization(p) sg = SendGridAPIClient(apikey='SG.your-api-key') diff --git a/test/test_mail.py b/test/test_mail.py index fb46d34c2..08d0feb8e 100644 --- a/test/test_mail.py +++ b/test/test_mail.py @@ -565,10 +565,22 @@ def test_directly_setting_substitutions(self): def test_dynamic_template_data(self): p = Personalization() p.add_to(Email('test@sendgrid.com')) - p.dynamic_template_data = {'customer': {'name': 'Bob', 'returning': True}, 'total': 42} + p.dynamic_template_data = { + 'customer': { + 'name': 'Bob', + 'returning': True + }, + 'total': 42 + } expected = { 'to': [{'email': 'test@sendgrid.com'}], - 'dynamic_template_data': {'customer': {'name': 'Bob', 'returning': True}, 'total': 42} + 'dynamic_template_data': { + 'customer': { + 'name': 'Bob', + 'returning': True + }, + 'total': 42 + } } self.assertDictEqual(p.get(), expected) diff --git a/use_cases/transational_templates.md b/use_cases/transational_templates.md index d88ffae76..2d74f92a5 100644 --- a/use_cases/transational_templates.md +++ b/use_cases/transational_templates.md @@ -85,7 +85,8 @@ from sendgrid.helpers.mail import Email, Personalization sg = SendGridAPIClient(apikey='SG.your-api-key') -mail = Mail(from_email='templates@example.com') +mail = Mail() +mail.from_email='templates@example.com' mail.template_id = 'd-your-dynamic-template-uid' p = Personalization() p.add_to(Email('user@example.com'))