diff --git a/django/core/mail/backends/smtp.py b/django/core/mail/backends/smtp.py index 63efe438d3..3b2962f7d8 100644 --- a/django/core/mail/backends/smtp.py +++ b/django/core/mail/backends/smtp.py @@ -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: diff --git a/tests/regressiontests/mail/tests.py b/tests/regressiontests/mail/tests.py index 327159eb7f..a6cd60e2ac 100644 --- a/tests/regressiontests/mail/tests.py +++ b/tests/regressiontests/mail/tests.py @@ -408,3 +408,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