diff options
| author | Florian Apolloner <florian@apolloner.eu> | 2013-12-28 18:35:17 +0100 |
|---|---|---|
| committer | Florian Apolloner <florian@apolloner.eu> | 2013-12-28 18:35:17 +0100 |
| commit | 5dfd824d38ec7d1f695494e46d603e89cae68661 (patch) | |
| tree | 5310fe3da7fe70cc96f907a5e5b92e95e349dec3 /django | |
| parent | 280c1a65ccacd679bf298bf2b169ff01e7266b8e (diff) | |
Introduced as_bytes for SafeMIMEText (and other SafeMIME-classes).
This is to provide a consistent interface (namely bytes) for the smtp
backend which after all sends bytes over the wire; encoding with as_string
yields different results since mails as unicode are not really specified.
as_string stays for backwardscompatibilty mostly and some debug outputs.
But keep in mind that the output doesn't match as_bytes!
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/mail/backends/smtp.py | 5 | ||||
| -rw-r--r-- | django/core/mail/message.py | 33 |
2 files changed, 19 insertions, 19 deletions
diff --git a/django/core/mail/backends/smtp.py b/django/core/mail/backends/smtp.py index c9e0a18728..e72e372ca9 100644 --- a/django/core/mail/backends/smtp.py +++ b/django/core/mail/backends/smtp.py @@ -7,7 +7,6 @@ from django.conf import settings from django.core.mail.backends.base import BaseEmailBackend from django.core.mail.utils import DNS_NAME from django.core.mail.message import sanitize_address -from django.utils.encoding import force_bytes class EmailBackend(BaseEmailBackend): @@ -111,10 +110,8 @@ class EmailBackend(BaseEmailBackend): recipients = [sanitize_address(addr, email_message.encoding) for addr in email_message.recipients()] message = email_message.message() - charset = message.get_charset().get_output_charset() if message.get_charset() else 'utf-8' try: - self.connection.sendmail(from_email, recipients, - force_bytes(message.as_string(), charset)) + self.connection.sendmail(from_email, recipients, message.as_bytes()) except smtplib.SMTPException: if not self.fail_silently: raise diff --git a/django/core/mail/message.py b/django/core/mail/message.py index cde37ea6d2..cdd265521b 100644 --- a/django/core/mail/message.py +++ b/django/core/mail/message.py @@ -131,21 +131,25 @@ class MIMEMixin(): This overrides the default as_string() implementation to not mangle lines that begin with 'From '. See bug #13433 for details. """ - # Using a normal Generator on python 3 will yield a string, which will - # get base64 encoded in some cases to ensure that it's always convertable - # to ascii. We don't want base64 encoded emails, so we use a BytesGenertor - # which will do the right thing and then decode according to our known - # encoding. See #21093 and #3472 for details. - if six.PY3 and sys.version_info >= (3, 3, 3): + fp = six.StringIO() + g = generator.Generator(fp, mangle_from_=False) + g.flatten(self, unixfrom=unixfrom) + return fp.getvalue() + + if six.PY2: + as_bytes = as_string + else: + def as_bytes(self, unixfrom=False): + """Return the entire formatted message as bytes. + Optional `unixfrom' when True, means include the Unix From_ envelope + header. + + This overrides the default as_bytes() implementation to not mangle + lines that begin with 'From '. See bug #13433 for details. + """ fp = six.BytesIO() g = generator.BytesGenerator(fp, mangle_from_=False) g.flatten(self, unixfrom=unixfrom) - encoding = self.get_charset().get_output_charset() if self.get_charset() else 'utf-8' - return fp.getvalue().decode(encoding) - else: - fp = six.StringIO() - g = generator.Generator(fp, mangle_from_=False) - g.flatten(self, unixfrom=unixfrom) return fp.getvalue() @@ -167,9 +171,8 @@ class SafeMIMEText(MIMEMixin, MIMEText): # We do it manually and trigger re-encoding of the payload. MIMEText.__init__(self, text, subtype, None) del self['Content-Transfer-Encoding'] - # Work around a bug in python 3.3.3 [sic], see - # http://bugs.python.org/issue19063 for details. - if sys.version_info[:3] == (3, 3, 3): + # Workaround for versions without http://bugs.python.org/issue19063 + if (3, 2) < sys.version_info < (3, 3, 4): payload = text.encode(utf8_charset.output_charset) self._payload = payload.decode('ascii', 'surrogateescape') self.set_charset(utf8_charset) |
