From 5993b52e6d9db00259fd5a186b3c3df767fe94e2 Mon Sep 17 00:00:00 2001 From: medmunds Date: Wed, 25 Feb 2015 13:17:15 -0800 Subject: [PATCH] Fixed #24416 -- Added support for lazy email addresses. --- django/core/mail/message.py | 8 ++++---- tests/mail/tests.py | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/django/core/mail/message.py b/django/core/mail/message.py index 76cd477595a..70a7fda1d44 100644 --- a/django/core/mail/message.py +++ b/django/core/mail/message.py @@ -101,7 +101,7 @@ def forbid_multi_line_headers(name, val, encoding): def sanitize_address(addr, encoding): - if isinstance(addr, six.string_types): + if not isinstance(addr, tuple): addr = parseaddr(force_text(addr)) nm, addr = addr nm = Header(nm, encoding).encode() @@ -262,11 +262,11 @@ class EmailMessage(object): msg = self._create_message(msg) msg['Subject'] = self.subject msg['From'] = self.extra_headers.get('From', self.from_email) - msg['To'] = self.extra_headers.get('To', ', '.join(self.to)) + msg['To'] = self.extra_headers.get('To', ', '.join(map(force_text, self.to))) if self.cc: - msg['Cc'] = ', '.join(self.cc) + msg['Cc'] = ', '.join(map(force_text, self.cc)) if self.reply_to: - msg['Reply-To'] = self.extra_headers.get('Reply-To', ', '.join(self.reply_to)) + msg['Reply-To'] = self.extra_headers.get('Reply-To', ', '.join(map(force_text, self.reply_to))) # Email header names are case-insensitive (RFC 2045), so we have to # accommodate that when doing comparisons. diff --git a/tests/mail/tests.py b/tests/mail/tests.py index b6170068fb5..75d5dd619b0 100644 --- a/tests/mail/tests.py +++ b/tests/mail/tests.py @@ -665,6 +665,31 @@ class BaseEmailBackendTests(HeadersCheckMixin, object): self.assertEqual(message.get('from'), "tester") self.assertEqual(message.get('to'), "django") + def test_lazy_addresses(self): + """ + Email sending should support lazy email addresses (#24416). + """ + _ = ugettext_lazy + self.assertTrue(send_mail('Subject', 'Content', _('tester'), [_('django')])) + message = self.get_the_message() + self.assertEqual(message.get('from'), 'tester') + self.assertEqual(message.get('to'), 'django') + + self.flush_mailbox() + m = EmailMessage( + 'Subject', 'Content', _('tester'), [_('to1'), _('to2')], + cc=[_('cc1'), _('cc2')], + bcc=[_('bcc')], + reply_to=[_('reply')], + ) + self.assertEqual(m.recipients(), ['to1', 'to2', 'cc1', 'cc2', 'bcc']) + m.send() + message = self.get_the_message() + self.assertEqual(message.get('from'), 'tester') + self.assertEqual(message.get('to'), 'to1, to2') + self.assertEqual(message.get('cc'), 'cc1, cc2') + self.assertEqual(message.get('Reply-To'), 'reply') + def test_close_connection(self): """ Test that connection can be closed (even when not explicitly opened)