Opened 3 years ago
Last modified 3 years ago
#32806 closed Bug
Send email with a content_type=text/* attachment — at Initial Version
Reported by: | Christos Georgiou | Owned by: | nobody |
---|---|---|---|
Component: | Core (Mail) | Version: | 3.2 |
Severity: | Normal | Keywords: | sendgrid-django |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Python 3.8, Django 3.2.3
from django.core.mail import EmailMessage e = EmailMessage('subject', 'the body', 'sender@domain.org', ['recipient@domain.org']) e.attach('attachment.csv', 'flda,fldb\nvala,valb\n', 'text/csv') e.send()
This fails as expected:
… File "…/lib/python3.8/site-packages/sgbackend/mail.py", line 149, in _build_sg_mail base64_attachment = base64.b64encode(attachment[1]) File "…/lib/python3.8/base64.py", line 58, in b64encode encoded = binascii.b2a_base64(s, newline=False)
But this also fails:
e.attach('attachment.csv', b'flda,fldb\nvala,valb\n', 'text/csv') e.send()
because …/lib/python3.8/site-packages/django/core/mail/message.py on attach does:
if basetype == 'text': if isinstance(content, bytes): try: content = content.decode() except UnicodeDecodeError: # If mimetype suggests the file is text but it's # actually binary, read() raises a UnicodeDecodeError. mimetype = DEFAULT_ATTACHMENT_MIME_TYPE self.attachments.append((filename, content, mimetype))
Why decode it if a Py3 string can't be b64encoded? I think that actually it should be *encoded* as bytes if already str using the DEFAULT_CHARSET before appending the tuple to self.attachments.
If I .attach(name, bytes_object, 'application/csv') then the send operation works fine.
(I'm open to the possibility that I miss something and this is not a bug :) )
I can provide a patch if we decide upon the correct behaviour, but please let me know the target branch.