Skip to content

Commit 7ae02fc

Browse files
committed
fix: Support Django 6 updated EmailMessage
1 parent a060d49 commit 7ae02fc

1 file changed

Lines changed: 16 additions & 7 deletions

File tree

src/postmarker/models/emails.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
from base64 import b64encode
55
from email.header import decode_header
6+
from email.message import EmailMessage
67
from email.mime.base import MIMEBase
78
from email.mime.multipart import MIMEMultipart
89
from email.mime.text import MIMEText
@@ -76,15 +77,23 @@ def deconstruct_multipart_recursive(seen, text, html, attachments, message):
7677
if message in seen:
7778
return
7879
seen.add(message)
79-
if isinstance(message, MIMEMultipart):
80+
if message.is_multipart():
8081
for part in message.walk():
8182
deconstruct_multipart_recursive(seen, text, html, attachments, part)
8283
else:
8384
content_type = message.get_content_type()
8485
if content_type == "text/plain" and not text:
85-
text.append(message.get_payload(decode=True).decode("utf8"))
86+
# Use get_content() for EmailMessage, fall back to get_payload for MIME
87+
if isinstance(message, EmailMessage):
88+
text.append(message.get_content())
89+
else:
90+
text.append(message.get_payload(decode=True).decode("utf8"))
8691
elif content_type == "text/html" and not html:
87-
html.append(message.get_payload(decode=True).decode("utf8"))
92+
# Use get_content() for EmailMessage, fall back to get_payload for MIME
93+
if isinstance(message, EmailMessage):
94+
html.append(message.get_content())
95+
else:
96+
html.append(message.get_payload(decode=True).decode("utf8"))
8897
else:
8998
# Ignore underlying messages inside `message/rfc822` payload, because the message itself will be passed
9099
# as an attachment
@@ -285,7 +294,7 @@ def _construct_email(self, email, **extra):
285294
"""Converts incoming data to properly structured dictionary."""
286295
if isinstance(email, dict):
287296
email = Email(manager=self._manager, **email)
288-
elif isinstance(email, (MIMEText, MIMEMultipart)):
297+
elif isinstance(email, (EmailMessage, MIMEText, MIMEMultipart)):
289298
email = Email.from_mime(email, self._manager)
290299
elif not isinstance(email, Email):
291300
raise ValueError
@@ -348,7 +357,7 @@ def send(
348357
):
349358
"""Sends a single email.
350359
351-
:param message: :py:class:`Email` or ``email.mime.text.MIMEText`` instance.
360+
:param message: :py:class:`Email`, ``email.message.EmailMessage``, or ``email.mime.text.MIMEText`` instance.
352361
:param str From: The sender email address.
353362
:param To: Recipient's email address.
354363
Multiple recipients could be specified as a list or string with comma separated values.
@@ -391,10 +400,10 @@ def send(
391400
Attachments=Attachments,
392401
MessageStream=MessageStream,
393402
)
394-
elif isinstance(message, (MIMEText, MIMEMultipart)):
403+
elif isinstance(message, (EmailMessage, MIMEText, MIMEMultipart)):
395404
message = Email.from_mime(message, self)
396405
elif not isinstance(message, Email):
397-
raise TypeError("message should be either Email or MIMEText or MIMEMultipart instance")
406+
raise TypeError("message should be either Email, EmailMessage, MIMEText or MIMEMultipart instance")
398407
return message.send()
399408

400409
def send_with_template(

0 commit comments

Comments
 (0)