From d9cb23b003923a3af9de12c9bec69ab7ccd3f4ec Mon Sep 17 00:00:00 2001 From: medmunds Date: Thu, 15 Nov 2012 15:03:26 -0800 Subject: [PATCH] Support from_name in "from_name " sender address. Allows specifying the sender's display name as part of the from email address, without requiring use of the DjrillMessage class: send_mail('Subject', 'Message', 'From Name ', ['Recipient #1 ', 'to2@example.com']) (This matches the behavior of Django's default SMTP backend.) Cherry-picked from: medmunds/Djrill@46cd5c9d: Support "realname " sender address medmunds/Djrill@cd4e57cc: Support "realname " sender address - fix for using DjrillMessage medmunds/Djrill@16f8efc9: Add tests for "Display Name " addresses --- djrill/mail/backends/djrill.py | 10 +++++++--- djrill/tests.py | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/djrill/mail/backends/djrill.py b/djrill/mail/backends/djrill.py index e59a98e..fd72d01 100644 --- a/djrill/mail/backends/djrill.py +++ b/djrill/mail/backends/djrill.py @@ -4,6 +4,7 @@ from django.core.mail.backends.base import BaseEmailBackend from django.core.mail.message import sanitize_address from django.utils import simplejson as json +from email.utils import parseaddr import requests class DjrillBackendHTTPError(Exception): @@ -62,7 +63,6 @@ class DjrillBackend(BaseEmailBackend): self.sender = sanitize_address(message.from_email, message.encoding) recipients_list = [sanitize_address(addr, message.encoding) for addr in message.recipients()] - from email.utils import parseaddr self.recipients = [{"email": e, "name": n} for n,e in [ parseaddr(r) for r in recipients_list]] @@ -101,12 +101,15 @@ class DjrillBackend(BaseEmailBackend): use by default. Standard text email messages sent through Django will still work through Mandrill. """ + from_name, from_email = parseaddr(self.sender) msg_dict = { "text": message.body, "subject": message.subject, - "from_email": self.sender, + "from_email": from_email, "to": self.recipients } + if from_name: + msg_dict["from_name"] = from_name if message.extra_headers: accepted_headers = {} @@ -123,11 +126,12 @@ class DjrillBackend(BaseEmailBackend): Builds advanced message dict """ self.msg_dict.update({ - "from_name": message.from_name, "tags": message.tags, "track_opens": message.track_opens, "track_clicks": message.track_clicks }) + if message.from_name: + self.msg_dict["from_name"] = message.from_name def _add_alternatives(self, message): diff --git a/djrill/tests.py b/djrill/tests.py index e3ee158..ebbba35 100644 --- a/djrill/tests.py +++ b/djrill/tests.py @@ -55,6 +55,7 @@ class DjrillBackendTests(DjrillBackendMockAPITestCase): data = self.get_api_call_data() self.assertEqual(data['message']['subject'], "Subject here") self.assertEqual(data['message']['text'], "Here is the message.") + self.assertFalse('from_name' in data['message']) self.assertEqual(data['message']['from_email'], "from@example.com") self.assertEqual(len(data['message']['to']), 1) self.assertEqual(data['message']['to'][0]['email'], "to@example.com") @@ -65,6 +66,22 @@ class DjrillBackendTests(DjrillBackendMockAPITestCase): mail.send_mail('Subject', 'Message', 'from@example.com', ['to@example.com']) + def test_name_addr(self): + """Make sure RFC2822 name-addr format (with display-name) is allowed + + (Test both sender and recipient addresses) + """ + mail.send_mail('Subject', 'Message', 'From Name ', + ['Recipient #1 ', 'to2@example.com']) + data = self.get_api_call_data() + self.assertEqual(data['message']['from_name'], "From Name") + self.assertEqual(data['message']['from_email'], "from@example.com") + self.assertEqual(len(data['message']['to']), 2) + self.assertEqual(data['message']['to'][0]['name'], "Recipient #1") + self.assertEqual(data['message']['to'][0]['email'], "to1@example.com") + self.assertEqual(data['message']['to'][1]['name'], "") + self.assertEqual(data['message']['to'][1]['email'], "to2@example.com") + def test_email_message(self): email = mail.EmailMessage('Subject', 'Body goes here', 'from@example.com',