Opened 4 years ago

Last modified 4 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.

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top