Skip to content

Commit bb16f15

Browse files
Merge pull request #631 from cmccandless/support-email.message.EmailMessage
Allow creation of Mail from EmailMessage
2 parents edd02e4 + d1f3545 commit bb16f15

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

sendgrid/helpers/mail/mail.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""v3/mail/send response body builder"""
22
from .personalization import Personalization
33
from .header import Header
4+
from .email import Email
5+
from .content import Content
46

57

68
class Mail(object):
@@ -141,3 +143,28 @@ def get(self):
141143

142144
return {key: value for key, value in mail.items()
143145
if value is not None and value != [] and value != {}}
146+
147+
@classmethod
148+
def from_EmailMessage(cls, message):
149+
"""Create a Mail object from an instance of
150+
email.message.EmailMessage.
151+
:type message: email.message.EmailMessage
152+
:rtype: Mail
153+
"""
154+
mail = cls(
155+
from_email=Email(message.get('From')),
156+
subject=message.get('Subject'),
157+
to_email=Email(message.get('To')),
158+
)
159+
try:
160+
body = message.get_content()
161+
except AttributeError:
162+
# Python2
163+
body = message.get_payload()
164+
mail.add_content(Content(
165+
message.get_content_type(),
166+
body.strip()
167+
))
168+
for k, v in message.items():
169+
mail.add_header(Header(k, v))
170+
return mail

test/test_mail.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
import json
33
import unittest
44

5+
try:
6+
from email.message import EmailMessage
7+
except ImportError:
8+
# Python2
9+
from email import message
10+
EmailMessage = message.Message
11+
512
from sendgrid.helpers.mail import (
613
ASM,
714
APIKeyIncludedException,
@@ -557,3 +564,26 @@ def test_disable_tracking(self):
557564
def test_directly_setting_substitutions(self):
558565
personalization = Personalization()
559566
personalization.substitutions = [{'a': 0}]
567+
568+
def test_from_emailmessage(self):
569+
message = EmailMessage()
570+
body = 'message that is not urgent'
571+
try:
572+
message.set_content(body)
573+
except AttributeError:
574+
# Python2
575+
message.set_payload(body)
576+
message.set_default_type('text/plain')
577+
message['Subject'] = 'URGENT TITLE'
578+
message['From'] = 'test@example.com'
579+
message['To'] = 'test@sendgrid.com'
580+
mail = Mail.from_EmailMessage(message)
581+
self.assertEqual(mail.subject, 'URGENT TITLE')
582+
self.assertEqual(mail.from_email.email, 'test@example.com')
583+
self.assertEqual(len(mail.personalizations), 1)
584+
self.assertEqual(len(mail.personalizations[0].tos), 1)
585+
self.assertEqual(mail.personalizations[0].tos[0], {'email': 'test@sendgrid.com'})
586+
self.assertEqual(len(mail.contents), 1)
587+
content = mail.contents[0]
588+
self.assertEqual(content.type, 'text/plain')
589+
self.assertEqual(content.value, 'message that is not urgent')

0 commit comments

Comments
 (0)