Commit 2565b807 authored by Jannis Leidel's avatar Jannis Leidel
Browse files

[1.2.X] Fixed #14301 -- Further refine changes made in r14217 to support...

[1.2.X] Fixed #14301 -- Further refine changes made in r14217 to support non-ASCII characters in email addresses. Thanks, Claude Peroz and Andi Albrecht.

Backport from trunk (r15006).

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15007 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 0e651d3f
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -91,13 +91,19 @@ class EmailBackend(BaseEmailBackend):
            self._lock.release()
        return num_sent

    def _sanitize(self, email):
        name, domain = email.split('@', 1)
        email = '@'.join([name, domain.encode('idna')])
        return email

    def _send(self, email_message):
        """A helper method that does the actual sending."""
        if not email_message.recipients():
            return False
        from_email = self._sanitize(email_message.from_email)
        recipients = map(self._sanitize, email_message.recipients())
        try:
            self.connection.sendmail(email_message.from_email,
                    email_message.recipients(),
            self.connection.sendmail(from_email, recipients,
                    email_message.message().as_string())
        except:
            if not self.fail_silently:
+22 −0
Original line number Diff line number Diff line
@@ -351,3 +351,25 @@ class MailTests(TestCase):
        self.assertEqual(message.from_email, from_email)
        self.assertEqual(message.to, [to_email])
        self.assertTrue(message.message().as_string().startswith('Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: =?utf-8?b?ZnLDtm1Aw7bDpMO8LmNvbQ==?=\nTo: =?utf-8?b?dMO2QMO2w6TDvC5jb20=?='))

    def test_idn_smtp_send(self):
        import smtplib
        smtplib.SMTP = MockSMTP
        from_email = u'fröm@öäü.com'
        to_email = u'tö@öäü.com'
        connection = mail.get_connection('django.core.mail.backends.smtp.EmailBackend')
        self.assertTrue(send_mail('Subject', 'Content', from_email, [to_email], connection=connection))

class MockSMTP(object):
    def __init__(self, host='', port=0, local_hostname=None,
                 timeout=1):
        pass

    def sendmail(self, from_addr, to_addrs, msg, mail_options=[],
                 rcpt_options=[]):
        for addr in to_addrs:
            str(addr.split('@', 1)[-1])
        return {}

    def quit(self):
        return 0