Opened 4 years ago

Closed 4 years ago

#32806 closed Bug (invalid)

Send email with a content_type=text/* attachment

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 (last modified by Christos Georgiou)

Python 3.8.5, 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 (2)

comment:1 by Christos Georgiou, 4 years ago

Description: modified (diff)

comment:2 by Mariusz Felisiak, 4 years ago

Keywords: sendgrid-django added; text attachment removed
Resolution: invalid
Status: newclosed
Type: UncategorizedBug

I cannot reproduce this issue with built-in backends, e.g.

>>> 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()
Content-Type: multipart/mixed; boundary="===============7549085999326566442=="
....
>>> e = EmailMessage('subject', 'the body', 'sender@domain.org', ['recipient@domain.org'])
>>> e.attach('attachment.csv', b'flda,fldb\nvala,valb\n', 'text/csv')
>>> e.send()
Content-Type: multipart/mixed; boundary="===============2053797502762006814=="
....

Also sendgrid-django doesn't support Django 3.1+, you should report this issue on their bugtracker.

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