﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
36478	EmailMessage handles utf-8 encoded text attachments differently in constructor vs property	Mike Edmunds	Mike Edmunds	"Encoded text attachments set directly in the EmailMessage.attachments property are not processed like the same content passed to EmailMessage(attachments=...) or EmailMessage.attach(...).

#27007 added EmailMessage.attach() handling for text content encoded as utf-8 bytes. That code is also used for the attachments constructor argument, but not for attachments set directly on the object property:

{{{#!python
    # Existing test: passes
    def test_attach_text_as_bytes(self):
        msg = EmailMessage()
        msg.attach(""file.txt"", b""file content\n"")
        filename, content, mimetype = self.get_decoded_attachments(msg)[0]
        self.assertEqual(filename, ""file.txt"")
        self.assertEqual(content, ""file content\n"")
        self.assertEqual(mimetype, ""text/plain"")

    # New test: passes
    def test_attach_text_as_bytes_using_constructor(self):
        msg = EmailMessage(
            attachments=[EmailAttachment(""file.txt"", b""file content\n"", ""text/plain"")]
        )
        filename, content, mimetype = self.get_decoded_attachments(msg)[0]
        self.assertEqual(filename, ""file.txt"")
        self.assertEqual(content, ""file content\n"")
        self.assertEqual(mimetype, ""text/plain"")

    # New test: AttributeError: 'bytes' object has no attribute 'encode'
    def test_attach_text_as_bytes_using_property(self):
        msg = EmailMessage()
        msg.attachments = [EmailAttachment(""file.txt"", b""file content\n"", ""text/plain"")]
        filename, content, mimetype = self.get_decoded_attachments(msg)[0]
        self.assertEqual(filename, ""file.txt"")
        self.assertEqual(content, ""file content\n"")
        self.assertEqual(mimetype, ""text/plain"")
}}}

The second added test fails with `AttributeError: 'bytes' object has no attribute 'encode` deep in SafeMIMEText.

The EmailMessage documentation implies that [https://docs.djangoproject.com/en/5.2/topics/email/#emailmessage-objects:~:text=The%20EmailMessage%20class%20is%20initialized%20with%20the%20following%20parameters%20(in%20the%20given%20order%2C%20if%20positional%20arguments%20are%20used).%20All%20parameters%20are%20optional%20and%20can%20be%20set%20at%20any%20time%20prior%20to%20calling%20the%20send()%20method. the second and third tests should be equivalent].

(#27007 also added a fallback to application/octet-stream for non-utf-8 text content, but didn't include a test case for that behavior.)

See also https://github.com/django/django/pull/18966#discussion_r2154081996"	Bug	closed	Core (Mail)	5.2	Normal	fixed			Ready for checkin	1	0	0	0	0	0
