#36478: EmailMessage handles utf-8 encoded text attachments differently in
constructor vs property
----------------------------------------+------------------------------
               Reporter:  Mike Edmunds  |          Owner:  Mike Edmunds
                   Type:  Bug           |         Status:  assigned
              Component:  Core (Mail)   |        Version:  5.2
               Severity:  Normal        |       Keywords:
           Triage Stage:  Unreviewed    |      Has patch:  1
    Needs documentation:  0             |    Needs tests:  0
Patch needs improvement:  0             |  Easy pickings:  0
                  UI/UX:  0             |
----------------------------------------+------------------------------
 Encoded text attachments set directly in the EmailMessage.attachments
 property are not processed the same as the same content passed to in
 EmailMessage(attachments=...) or EmailMessage.attach(...).

 #27007 added special 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:

 {{{#!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
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36478>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/01070197a4a3813c-4ed5813b-8335-4d10-aa6b-98f6309c1bca-000000%40eu-central-1.amazonses.com.

Reply via email to