summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/core/mail/message.py6
-rw-r--r--tests/regressiontests/mail/tests.py15
2 files changed, 20 insertions, 1 deletions
diff --git a/django/core/mail/message.py b/django/core/mail/message.py
index a0cb09f7b8..2311102fd0 100644
--- a/django/core/mail/message.py
+++ b/django/core/mail/message.py
@@ -67,7 +67,11 @@ def forbid_multi_line_headers(name, val, encoding):
result = []
for nm, addr in getaddresses((val,)):
nm = str(Header(nm.encode(encoding), encoding))
- result.append(formataddr((nm, str(addr))))
+ try:
+ addr = addr.encode('ascii')
+ except UnicodeEncodeError: # IDN
+ addr = str(Header(addr.encode(encoding), encoding))
+ result.append(formataddr((nm, addr)))
val = ', '.join(result)
else:
val = Header(val.encode(encoding), encoding)
diff --git a/tests/regressiontests/mail/tests.py b/tests/regressiontests/mail/tests.py
index d2f7562d8f..a84417e21b 100644
--- a/tests/regressiontests/mail/tests.py
+++ b/tests/regressiontests/mail/tests.py
@@ -363,3 +363,18 @@ class MailTests(TestCase):
settings.ADMINS = old_admins
settings.MANAGERS = old_managers
+
+ def test_idn_validation(self):
+ """Test internationalized email adresses"""
+ # Regression for #14301.
+ mail.outbox = []
+ from_email = u'fröm@öäü.com'
+ to_email = u'tö@öäü.com'
+ connection = mail.get_connection('django.core.mail.backends.locmem.EmailBackend')
+ send_mail('Subject', 'Content', from_email, [to_email], connection=connection)
+ self.assertEqual(len(mail.outbox), 1)
+ message = mail.outbox[0]
+ self.assertEqual(message.subject, 'Subject')
+ 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=?='))