1
0
mirror of https://github.com/django/django.git synced 2025-05-29 18:26:29 +00:00

Fixed #36309 -- Made email alternatives and attachments pickleable.

Regression in aba0e541caaa086f183197eaaca0ac20a730bbe4 and in
d5bebc1c26d4c0ec9eaa057aefc5b38649c0ba3b.

Thanks Florent Messa for the report, and Jake Howard and Claude
Paroz for the review.
This commit is contained in:
nessita 2025-04-24 10:11:16 -03:00 committed by GitHub
parent c86242d61f
commit 0596263c31
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 23 additions and 2 deletions

View File

@ -191,8 +191,8 @@ class SafeMIMEMultipart(MIMEMixin, MIMEMultipart):
MIMEMultipart.__setitem__(self, name, val)
EmailAlternative = namedtuple("Alternative", ["content", "mimetype"])
EmailAttachment = namedtuple("Attachment", ["filename", "content", "mimetype"])
EmailAlternative = namedtuple("EmailAlternative", ["content", "mimetype"])
EmailAttachment = namedtuple("EmailAttachment", ["filename", "content", "mimetype"])
class EmailMessage:

View File

@ -48,3 +48,6 @@ Bugfixes
* Fixed a regression in Django 5.2, introduced when fixing :cve:`2025-26699`,
where the :tfilter:`wordwrap` template filter did not preserve empty lines
between paragraphs after wrapping text (:ticket:`36341`).
* Fixed a regression in Django 5.2 that caused a crash when serializing email
alternatives or attachments due to named tuple mismatches (:ticket:`36309`).

View File

@ -1,5 +1,6 @@
import mimetypes
import os
import pickle
import shutil
import socket
import sys
@ -654,6 +655,23 @@ class MailTests(MailTestsMixin, SimpleTestCase):
self.assertIn(html_content, msg.message().as_string())
def test_alternatives_and_attachment_serializable(self):
html_content = "<p>This is <strong>html</strong></p>"
mime_type = "text/html"
msg = EmailMultiAlternatives(alternatives=[(html_content, mime_type)])
msg.attach("test.txt", "This is plain text.", "plain/text")
# Alternatives and attachments can be serialized.
restored = pickle.loads(pickle.dumps(msg))
self.assertEqual(restored.subject, msg.subject)
self.assertEqual(restored.body, msg.body)
self.assertEqual(restored.from_email, msg.from_email)
self.assertEqual(restored.to, msg.to)
self.assertEqual(restored.alternatives, msg.alternatives)
self.assertEqual(restored.attachments, msg.attachments)
def test_none_body(self):
msg = EmailMessage("subject", None, "from@example.com", ["to@example.com"])
self.assertEqual(msg.body, "")