Skip to content

Commit

Permalink
[1.2.X] Fixed #13433 -- Changed default behavior of Django email mess…
Browse files Browse the repository at this point in the history
…age wrappers to not mangle lines starting with 'From '. Thanks Leo for the report and patch.

Backport of [15669] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15670 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
ramiro committed Feb 28, 2011
1 parent 076ce17 commit f5c0328
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
35 changes: 33 additions & 2 deletions django/core/mail/message.py
Expand Up @@ -3,16 +3,21 @@
import random
import time
from email import Charset, Encoders
from email.generator import Generator
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.Header import Header
from email.Utils import formatdate, getaddresses, formataddr
from email.Utils import formatdate, getaddresses, formataddr, parseaddr

from django.conf import settings
from django.core.mail.utils import DNS_NAME
from django.utils.encoding import smart_str, force_unicode
from email.Utils import parseaddr

try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO

# Don't BASE64-encode UTF-8 messages so that we avoid unwanted attention from
# some spam filters.
Expand Down Expand Up @@ -119,6 +124,19 @@ def __setitem__(self, name, val):
name, val = forbid_multi_line_headers(name, val, self.encoding)
MIMEText.__setitem__(self, name, val)

def as_string(self, unixfrom=False):
"""Return the entire formatted message as a string.
Optional `unixfrom' when True, means include the Unix From_ envelope
header.
This overrides the default as_string() implementation to not mangle
lines that begin with 'From '. See bug #13433 for details.
"""
fp = StringIO()
g = Generator(fp, mangle_from_ = False)
g.flatten(self, unixfrom=unixfrom)
return fp.getvalue()


class SafeMIMEMultipart(MIMEMultipart):

Expand All @@ -130,6 +148,19 @@ def __setitem__(self, name, val):
name, val = forbid_multi_line_headers(name, val, self.encoding)
MIMEMultipart.__setitem__(self, name, val)

def as_string(self, unixfrom=False):
"""Return the entire formatted message as a string.
Optional `unixfrom' when True, means include the Unix From_ envelope
header.
This overrides the default as_string() implementation to not mangle
lines that begin with 'From '. See bug #13433 for details.
"""
fp = StringIO()
g = Generator(fp, mangle_from_ = False)
g.flatten(self, unixfrom=unixfrom)
return fp.getvalue()


class EmailMessage(object):
"""
Expand Down
10 changes: 8 additions & 2 deletions tests/regressiontests/mail/tests.py
Expand Up @@ -11,8 +11,8 @@

from django.conf import settings
from django.core import mail
from django.core.mail import EmailMessage, mail_admins, mail_managers, EmailMultiAlternatives
from django.core.mail import send_mail, send_mass_mail
from django.core.mail import (EmailMessage, mail_admins, mail_managers,
EmailMultiAlternatives, send_mail, send_mass_mail)
from django.core.mail.backends import console, dummy, locmem, filebased, smtp
from django.core.mail.message import BadHeaderError
from django.test import TestCase
Expand Down Expand Up @@ -263,6 +263,12 @@ def test_connection_arg(self):
self.assertEqual(len(connection.test_outbox), 1)
self.assertEqual(connection.test_outbox[0].subject, '[Django] Manager message')

def test_dont_mangle_from_in_body(self):
# Regression for #13433 - Make sure that EmailMessage doesn't mangle
# 'From ' in message body.
email = EmailMessage('Subject', 'From the future', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'})
self.assertFalse('>From the future' in email.message().as_string())


class BaseEmailBackendTests(object):
email_backend = None
Expand Down

0 comments on commit f5c0328

Please sign in to comment.