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

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15006 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2010-12-21 15:26:49 +00:00
parent 673e6fc7fb
commit d4ef841495
2 changed files with 30 additions and 2 deletions

View File

@ -91,13 +91,19 @@ class EmailBackend(BaseEmailBackend):
self._lock.release() self._lock.release()
return num_sent 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): def _send(self, email_message):
"""A helper method that does the actual sending.""" """A helper method that does the actual sending."""
if not email_message.recipients(): if not email_message.recipients():
return False return False
from_email = self._sanitize(email_message.from_email)
recipients = map(self._sanitize, email_message.recipients())
try: try:
self.connection.sendmail(email_message.from_email, self.connection.sendmail(from_email, recipients,
email_message.recipients(),
email_message.message().as_string()) email_message.message().as_string())
except: except:
if not self.fail_silently: if not self.fail_silently:

View File

@ -408,3 +408,25 @@ class MailTests(TestCase):
self.assertEqual(message.from_email, from_email) self.assertEqual(message.from_email, from_email)
self.assertEqual(message.to, [to_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=?=')) 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