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:
parent
673e6fc7fb
commit
d4ef841495
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue