Skip to content

Commit 43fc638

Browse files
WIP - final use case update, kitchen sink
1 parent c417c31 commit 43fc638

File tree

7 files changed

+194
-68
lines changed

7 files changed

+194
-68
lines changed

live_test.py

+75-29
Original file line numberDiff line numberDiff line change
@@ -46,47 +46,93 @@
4646
# except SendGridException as e:
4747
# print(e.message)
4848

49-
# Send Multiple Emails to Multiple Recipients
49+
# # Send Multiple Emails to Multiple Recipients
50+
51+
# import os
52+
# import json
53+
# from sendgrid import SendGridAPIClient
54+
# from sendgrid.helpers.mail import Mail, From, To, Subject, PlainTextContent, HtmlContent, SendGridException, Substitution
55+
# import time
56+
# import datetime
57+
58+
# to_emails = [
59+
# To(email='[email protected]',
60+
# name='Elmer SendGrid',
61+
# substitutions={
62+
# Substitution('-name-', 'Elmer SendGrid'),
63+
# Substitution('-github-', 'https://github.com/ethomas'),
64+
# },
65+
# subject=Subject('Override Global Subject')),
66+
# To(email='[email protected]',
67+
# name='Elmer Thomas',
68+
# substitutions={
69+
# Substitution('-name-', 'Elmer Thomas'),
70+
# Substitution('-github-', 'https://github.com/thinkingserious'),
71+
# })
72+
# ]
73+
# ts = time.time()
74+
# global_substitutions = Substitution('-time-', datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
75+
# message = Mail(from_email=From('[email protected]', 'DX'),
76+
# to_emails=to_emails,
77+
# subject=Subject('Hi -name-'),
78+
# plain_text_content=PlainTextContent('Hello -name-, your github is -github-, email sent at -time-'),
79+
# html_content=HtmlContent('<strong>Hello -name-, your github is <a href=\"-github-\">here</a></strong> email sent at -time-'),
80+
# global_substitutions=global_substitutions,
81+
# is_multiple=True)
82+
83+
# try:
84+
# sendgrid_client = SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
85+
# print(json.dumps(message.get(), sort_keys=True, indent=4))
86+
# response = sendgrid_client.send(message=message)
87+
# print(response.status_code)
88+
# print(response.body)
89+
# print(response.headers)
90+
# except SendGridException as e:
91+
# print(e.message)
92+
93+
# Kitchen Sink - an example with all settings used
5094

5195
import os
5296
import json
5397
from sendgrid import SendGridAPIClient
54-
from sendgrid.helpers.mail import Mail, From, To, Subject, PlainTextContent, HtmlContent, SendGridException, Substitution
98+
from sendgrid.helpers.mail import Mail, From, To, Cc, Bcc, Subject, PlainTextContent, HtmlContent, SendGridException, Substitution, Header
5599
import time
56100
import datetime
57101

58-
to_emails = [
59-
To(email='[email protected]',
60-
name='Elmer SendGrid',
61-
substitutions={
62-
Substitution('-name-', 'Elmer SendGrid'),
63-
Substitution('-github-', 'https://github.com/ethomas'),
64-
},
65-
subject=Subject('Override Global Subject')),
66-
To(email='[email protected]',
67-
name='Elmer Thomas',
68-
substitutions={
69-
Substitution('-name-', 'Elmer Thomas'),
70-
Substitution('-github-', 'https://github.com/thinkingserious'),
71-
})
102+
message = Mail()
103+
104+
message.to = To('[email protected]', 'Example User1')
105+
message.to = [
106+
To('[email protected]', 'Example User2'),
107+
To('[email protected]', 'Example User3')
72108
]
73-
ts = time.time()
74-
global_substitutions = Substitution('-time-', datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
75-
message = Mail(from_email=From('[email protected]', 'DX'),
76-
to_emails=to_emails,
77-
subject=Subject('Hi -name-'),
78-
plain_text_content=PlainTextContent('Hello -name-, your github is -github-, email sent at -time-'),
79-
html_content=HtmlContent('<strong>Hello -name-, your github is <a href=\"-github-\">here</a></strong> email sent at -time-'),
80-
global_substitutions=global_substitutions,
81-
is_multiple=True)
109+
110+
message.cc = Cc('[email protected]', 'Example User4')
111+
message.cc = [
112+
Cc('[email protected]', 'Example User5'),
113+
Cc('[email protected]', 'Example User6')
114+
]
115+
116+
message.bcc = Bcc('[email protected]', 'Example User7')
117+
message.bcc = [
118+
Bcc('[email protected]', 'Example User8'),
119+
Bcc('[email protected]', 'Example User9')
120+
]
121+
122+
# message.header = Header('X-Test1', 'Test1')
123+
# message.header = Header('X-Test2', 'Test2')
124+
# message.header = [
125+
# Header('X-Test3', 'Test3'),
126+
# Header('X-Test4', 'Test4')
127+
# ]
82128

83129
try:
84130
sendgrid_client = SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
85131
print(json.dumps(message.get(), sort_keys=True, indent=4))
86-
response = sendgrid_client.send(message=message)
87-
print(response.status_code)
88-
print(response.body)
89-
print(response.headers)
132+
# response = sendgrid_client.send(message=message)
133+
# print(response.status_code)
134+
# print(response.body)
135+
# print(response.headers)
90136
except SendGridException as e:
91137
print(e.message)
92138

sendgrid/helpers/mail/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@
2626
from .substitution import Substitution
2727
from .tracking_settings import TrackingSettings
2828
from .to_email import To
29+
from .cc_email import Cc
30+
from .bcc_email import Bcc
2931
from .validators import ValidateAPIKey

sendgrid/helpers/mail/bcc_email.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .email import Email
2+
3+
4+
class Bcc(Email):
5+
"""A bcc email address with an optional name."""

sendgrid/helpers/mail/cc_email.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .email import Email
2+
3+
4+
class Cc(Email):
5+
"""A cc email address with an optional name."""

sendgrid/helpers/mail/email.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ def __init__(self,
2525
email=None,
2626
name=None,
2727
substitutions=None,
28-
subject=None):
28+
subject=None,
29+
p=None):
2930
"""Create an Email with the given address and name.
3031
3132
Either fill the separate name and email fields, or pass all information
@@ -38,6 +39,7 @@ def __init__(self,
3839
self._name = None
3940
self._email = None
4041
self._substitutions = None
42+
self._personalization = None
4143

4244
if email and not name:
4345
# allows passing emails as "dude Fella <[email protected]>"
@@ -103,6 +105,14 @@ def subject(self):
103105
def subject(self, value):
104106
self._subject = value
105107

108+
@property
109+
def p(self):
110+
return self._personalization
111+
112+
@p.setter
113+
def p(self, value):
114+
self._personalization = value
115+
106116
def get(self):
107117
"""
108118
Get a JSON-ready representation of this Email.

sendgrid/helpers/mail/mail.py

+83-38
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from .content import Content
66
from .subject import Subject
77

8-
98
class Mail(object):
109
"""Creates the response body for v3/mail/send"""
1110
def __init__(
@@ -36,7 +35,7 @@ def __init__(
3635
self._contents = None
3736
self._custom_args = None
3837
self._headers = None
39-
self._personalizations = None
38+
self._personalizations = []
4039
self._sections = None
4140
self._asm = None
4241
self._batch_id = None
@@ -55,38 +54,7 @@ def __init__(
5554
if subject is not None:
5655
self.subject = subject
5756
if to_emails is not None:
58-
if is_multiple == True:
59-
if isinstance(to_emails, list):
60-
for email in to_emails:
61-
personalization = Personalization()
62-
personalization.add_to(email)
63-
self.add_personalization(personalization)
64-
else:
65-
personalization = Personalization()
66-
personalization.add_to(to_emails)
67-
self.add_personalization(personalization)
68-
if global_substitutions is not None:
69-
if isinstance(global_substitutions, list):
70-
for substitution in global_substitutions:
71-
for p in self.personalizations:
72-
p.add_substitution(substitution)
73-
else:
74-
for p in self.personalizations:
75-
p.add_substitution(global_substitutions)
76-
else:
77-
personalization = Personalization()
78-
if isinstance(to_emails, list):
79-
for email in to_emails:
80-
personalization.add_to(email)
81-
else:
82-
personalization.add_to(to_emails)
83-
if global_substitutions is not None:
84-
if isinstance(global_substitutions, list):
85-
for substitution in global_substitutions:
86-
personalization.add_substitution(substitution)
87-
else:
88-
personalization.add_substitution(global_substitutions)
89-
self.add_personalization(personalization)
57+
self._set_emails(to_emails, global_substitutions, is_multiple)
9058
if plain_text_content is not None:
9159
self.add_content(plain_text_content)
9260
if html_content is not None:
@@ -95,9 +63,9 @@ def __init__(
9563
def __str__(self):
9664
return str(self.get())
9765

98-
def _ensure_append(self, new_items, append_to):
66+
def _ensure_append(self, new_items, append_to, index=0):
9967
append_to = append_to or []
100-
append_to.append(new_items)
68+
append_to.insert(index, new_items)
10169
return append_to
10270

10371
def _ensure_insert(self, new_items, insert_to):
@@ -112,6 +80,75 @@ def _flatten_dicts(self, dicts):
11280
def _get_or_none(self, from_obj):
11381
return from_obj.get() if from_obj is not None else None
11482

83+
def _set_emails(self, emails, global_substitutions=None, is_multiple=False, p=0):
84+
# Send Multiple Emails to Multiple Recipients
85+
if is_multiple == True:
86+
if isinstance(emails, list):
87+
for email in emails:
88+
if p == 0 and self._personalizations[p] == None:
89+
personalization = Personalization()
90+
self.add_personalization(personalization, index=p)
91+
else:
92+
self._personalizations[p].add_email(email)
93+
else:
94+
personalization = Personalization()
95+
personalization.add_email(emails)
96+
self.add_personalization(personalization)
97+
if global_substitutions is not None:
98+
if isinstance(global_substitutions, list):
99+
for substitution in global_substitutions:
100+
for p in self.personalizations:
101+
p.add_substitution(substitution)
102+
else:
103+
for p in self.personalizations:
104+
p.add_substitution(global_substitutions)
105+
else:
106+
try:
107+
personalization = self._personalizations[p]
108+
has_internal_personalization = True
109+
except IndexError:
110+
personalization = Personalization()
111+
has_internal_personalization = False
112+
113+
if isinstance(emails, list):
114+
for email in emails:
115+
personalization.add_email(email)
116+
else:
117+
personalization.add_email(emails)
118+
if global_substitutions is not None:
119+
if isinstance(global_substitutions, list):
120+
for substitution in global_substitutions:
121+
personalization.add_substitution(substitution)
122+
else:
123+
personalization.add_substitution(global_substitutions)
124+
125+
if not has_internal_personalization:
126+
self.add_personalization(personalization)
127+
128+
@property
129+
def to(self):
130+
pass
131+
132+
@to.setter
133+
def to(self, to_emails, global_substitutions=None, is_multiple=False, p=0):
134+
self._set_emails(to_emails, None, is_multiple=is_multiple, p=p)
135+
136+
@property
137+
def cc(self):
138+
pass
139+
140+
@cc.setter
141+
def cc(self, bcc_emails, global_substitutions=None, is_multiple=False, p=0):
142+
self._set_emails(bcc_emails, None, is_multiple=is_multiple, p=p)
143+
144+
@property
145+
def bcc(self):
146+
pass
147+
148+
@bcc.setter
149+
def bcc(self, bcc_emails, global_substitutions=None, is_multiple=False, p=0):
150+
self._set_emails(bcc_emails, None, is_multiple=is_multiple, p=p)
151+
115152
@property
116153
def attachments(self):
117154
return self._attachments
@@ -148,6 +185,14 @@ def add_content(self, content):
148185
def headers(self):
149186
return self._headers
150187

188+
@property
189+
def header(self):
190+
pass
191+
192+
@header.setter
193+
def header(self, header):
194+
self.add_header(header)
195+
151196
def add_header(self, header):
152197
if isinstance(header, dict):
153198
(k, v) = list(header.items())[0]
@@ -159,9 +204,9 @@ def add_header(self, header):
159204
def personalizations(self):
160205
return self._personalizations
161206

162-
def add_personalization(self, personalizations):
207+
def add_personalization(self, personalizations, index=0):
163208
self._personalizations = self._ensure_append(
164-
personalizations, self._personalizations)
209+
personalizations, self._personalizations, index)
165210

166211
@property
167212
def sections(self):

sendgrid/helpers/mail/personalization.py

+13
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ def __init__(self):
1414
self._custom_args = []
1515
self._send_at = None
1616

17+
def add_email(self, email):
18+
email_type = type(email)
19+
if email_type.__name__ == 'To':
20+
self.add_to(email)
21+
return
22+
if email_type.__name__ == 'Cc':
23+
self.add_cc(email)
24+
return
25+
if email_type.__name__ == 'Bcc':
26+
self.add_bcc(email)
27+
return
28+
raise ValueError('Please use a To, Cc or Bcc object.')
29+
1730
@property
1831
def tos(self):
1932
"""A list of recipients for this Personalization.

0 commit comments

Comments
 (0)