From 433293636e656a87e150f35d13e280ef7fb81054 Mon Sep 17 00:00:00 2001 From: Sergey Lavrinenko Date: Fri, 24 Jul 2015 23:13:00 +0300 Subject: [PATCH] Message supports cc and bcc --- emails/message.py | 34 ++++++++++++++++++++---- emails/testsuite/message/test_message.py | 17 ++++++------ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/emails/message.py b/emails/message.py index 36d3b7b..df35bde 100644 --- a/emails/message.py +++ b/emails/message.py @@ -38,7 +38,9 @@ class BaseMessage(object): headers=None, html=None, text=None, - attachments=None): + attachments=None, + cc=None, + bcc=None): self._attachments = None self.charset = charset or 'utf-8' # utf-8 is standard de-facto, yeah @@ -47,6 +49,8 @@ class BaseMessage(object): self.set_date(date) self.set_mail_from(mail_from) self.set_mail_to(mail_to) + self.set_cc(cc) + self.set_bcc(bcc) self.set_headers(headers) self.set_html(html=html) self.set_text(text=text) @@ -74,12 +78,28 @@ class BaseMessage(object): mail_to = property(get_mail_to, set_mail_to) + def set_cc(self, addr): + self._cc = parse_name_and_email_list(addr) + + def get_cc(self): + return self._cc + + cc = property(get_cc, set_cc) + + def set_bcc(self, addr): + self._bcc = parse_name_and_email_list(addr) + + def get_bcc(self): + return self._bcc + + bcc = property(get_bcc, set_bcc) + def get_recipients_emails(self): """ Returns message recipient's emails for actual sending. - :return: + :return: list of emails """ - return [a[1] for a in self._mail_to] + return list(set([a[1] for a in self._mail_to] + [a[1] for a in self._cc] + [a[1] for a in self._bcc])) def set_headers(self, headers): self._headers = headers or {} @@ -232,8 +252,12 @@ class MessageBuildMixin(object): self.set_header(msg, 'Subject', subject) self.set_header(msg, 'From', self.encode_address_header(self._mail_from), encode=False) - self.set_header(msg, 'To', self._mail_to and ", ".join([self.encode_address_header(addr) - for addr in self._mail_to]) or None, encode=False) + + if self._mail_to: + self.set_header(msg, 'To', ", ".join([self.encode_address_header(addr) for addr in self._mail_to]), encode=False) + + if self._cc: + self.set_header(msg, 'Cc', ", ".join([self.encode_address_header(addr) for addr in self._cc]), encode=False) return msg diff --git a/emails/testsuite/message/test_message.py b/emails/testsuite/message/test_message.py index eda90c3..30561b0 100644 --- a/emails/testsuite/message/test_message.py +++ b/emails/testsuite/message/test_message.py @@ -172,22 +172,23 @@ def test_message_id(): assert m.as_message()['Message-ID'] == 'XXX' -def test_several_recipients_in_to_header(): +def test_several_recipients(): # Test multiple recipients in "To" header params = dict(html='...', mail_from='a@b.c') - m = Message(mail_to=['d@e.f', 'g@h.i'], **params) - assert m.as_message()['To'] == 'd@e.f, g@h.i' + m = Message(mail_to=['a@x.z', 'b@x.z'], cc='c@x.z', **params) + assert m.as_message()['To'] == 'a@x.z, b@x.z' + assert m.as_message()['cc'] == 'c@x.z' - m = Message(mail_to=[('♡', 'd@e.f'), ('웃', 'g@h.i')], **params) - assert m.as_message()['To'] == '=?utf-8?b?4pmh?= , =?utf-8?b?7JuD?= ' + m = Message(mail_to=[('♡', 'a@x.z'), ('웃', 'b@x.z')], **params) + assert m.as_message()['To'] == '=?utf-8?b?4pmh?= , =?utf-8?b?7JuD?= ' # Test sending to several emails backend = InMemoryBackend() - m = Message(mail_to=[('♡', 'd@e.f'), ('웃', 'g@h.i')], **params) + m = Message(mail_to=[('♡', 'a@x.z'), ('웃', 'b@x.z')], cc=['c@x.z', 'b@x.z'], bcc=['c@x.z', 'd@x.z'], **params) m.send(smtp=backend) - assert len(backend.messages['d@e.f']) == 1 - assert len(backend.messages['g@h.i']) == 1 + for addr in ['a@x.z', 'b@x.z', 'c@x.z', 'd@x.z']: + assert len(backend.messages[addr]) == 1