Commits

Anonymous committed a7a3c9e

[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).

Comments (0)

Files changed (2)

django/core/mail/backends/smtp.py

             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:

tests/regressiontests/mail/tests.py

         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