Opened 9 years ago
Closed 9 years ago
#27333 closed Bug (fixed)
EmailMessage.message().as_string() incorrectly base64 encoded on Python 3
| Reported by: | aRkadeFR | Owned by: | Claude Paroz |
|---|---|---|---|
| Component: | Core (Mail) | Version: | dev |
| Severity: | Normal | Keywords: | email, base64 |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I have a different behavior on body encoding on python 2.7.12 and python 3.5.2 with Django 1.8.15:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import
from django.conf import settings
settings.configure(DATABASES={}, SECRET_KEY='not empty')
from django.core.mail import EmailMessage
email = EmailMessage('Chère chère', 'Super \' fort très fort.',
'from@example.com', ['to@example.com'])
print(email.message().as_string())
On python 3, the body will be encoded as base64, but not on python 2.
I've found couple of tickets relating to the same subject (#3472, and #11212 among others), and I've found in the Django code 1.8.15 in the file django/core/mail/message.py:
# Don't BASE64-encode UTF-8 messages so that we avoid unwanted attention from
# some spam filters.
utf8_charset = Charset.Charset('utf-8')
utf8_charset.body_encoding = None # Python defaults to BASE64
I would think from the code and the tickets that Django tries to never base64 the body of EmailMessage.
Is it the desired behavior?
Change History (4)
comment:1 by , 9 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
| Triage Stage: | Unreviewed → Accepted |
| Version: | 1.8 → master |
comment:3 by , 9 years ago
| Summary: | Different behavior py2 / py3 with Django on base64 body_encoding EmailMessage → EmailMessage.message().as_string() incorrectly base64 encoded on Python 3 |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Note:
See TracTickets
for help on using tickets.
Looks like a legitimate bug (I reproduced on master). The charset dance we're doing in
SafeMIMEText.__init__isn't sufficient for all cases, apparently.