summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
Diffstat (limited to 'service')
-rw-r--r--service/pixelated/adapter/services/mail_sender.py18
-rw-r--r--service/test/support/test_helper.py14
-rw-r--r--service/test/unit/adapter/services/test_mail_sender.py26
3 files changed, 56 insertions, 2 deletions
diff --git a/service/pixelated/adapter/services/mail_sender.py b/service/pixelated/adapter/services/mail_sender.py
index 4499adbd..08e81872 100644
--- a/service/pixelated/adapter/services/mail_sender.py
+++ b/service/pixelated/adapter/services/mail_sender.py
@@ -63,6 +63,9 @@ class MailSender(object):
bccs = mail.bcc
deferreds = []
+ recipients = self._remove_canonical(mail, recipients)
+ self._remove_duplicates_form_cc_and_to(mail)
+
for recipient in recipients:
self._define_bcc_field(mail, recipient, bccs)
smtp_recipient = self._create_twisted_smtp_recipient(recipient)
@@ -70,6 +73,20 @@ class MailSender(object):
return defer.DeferredList(deferreds, fireOnOneErrback=False, consumeErrors=True)
+ def _remove_duplicates_form_cc_and_to(self, mail):
+ mail.headers['To'] = list(set(self._remove_duplicates(mail.to)).difference(set(mail.bcc)))
+ mail.headers['Cc'] = list((set(self._remove_duplicates(mail.cc)).difference(set(mail.bcc)).difference(set(mail.to))))
+
+ def _remove_canonical(self, mail, recipients):
+ mail.headers['To'] = self._remove_duplicates(map(self._remove_canonical_recipient, mail.to))
+ mail.headers['Cc'] = self._remove_duplicates(map(self._remove_canonical_recipient, mail.cc))
+ mail.headers['Bcc'] = self._remove_duplicates(map(self._remove_canonical_recipient, mail.bcc))
+
+ return self._remove_duplicates(map(self._remove_canonical_recipient, recipients))
+
+ def _remove_duplicates(self, recipient):
+ return list(set(recipient))
+
def _define_bcc_field(self, mail, recipient, bccs):
if recipient in bccs:
mail.headers['Bcc'] = [recipient]
@@ -92,7 +109,6 @@ class MailSender(object):
def _create_twisted_smtp_recipient(self, recipient):
# TODO: Better is fix Twisted instead
- recipient = self._remove_canonical_recipient(recipient)
return User(str(recipient), NOT_NEEDED, NOT_NEEDED, NOT_NEEDED)
def _remove_canonical_recipient(self, recipient):
diff --git a/service/test/support/test_helper.py b/service/test/support/test_helper.py
index ebe8a897..57f41a6e 100644
--- a/service/test/support/test_helper.py
+++ b/service/test/support/test_helper.py
@@ -45,6 +45,20 @@ def mail_dict():
}
+def duplicates_in_fields_mail_dict():
+ return {
+ 'header': {
+ 'to': ['to@pixelated.org', 'another@pixelated.org', 'third@pixelated.org'],
+ 'cc': ['cc@pixelated.org', 'another@pixelated.org', 'third@pixelated.org'],
+ 'bcc': ['bcc@pixelated.org', 'another@pixelated.org'],
+ 'subject': 'Subject'
+ },
+ 'body': 'Body',
+ 'ident': '',
+ 'tags': []
+ }
+
+
class TestDoc(object):
def __init__(self, content):
self.content = content
diff --git a/service/test/unit/adapter/services/test_mail_sender.py b/service/test/unit/adapter/services/test_mail_sender.py
index 9a7e8fea..77435b66 100644
--- a/service/test/unit/adapter/services/test_mail_sender.py
+++ b/service/test/unit/adapter/services/test_mail_sender.py
@@ -22,7 +22,7 @@ from pixelated.adapter.services.mail_sender import MailSender, MailSenderExcepti
from pixelated.adapter.model.mail import InputMail
from pixelated.bitmask_libraries.smtp import LeapSMTPConfig
from pixelated.support.functional import flatten
-from test.support.test_helper import mail_dict
+from test.support.test_helper import mail_dict, duplicates_in_fields_mail_dict
from twisted.internet import reactor, defer
from twisted.internet.defer import Deferred
from mockito.matchers import Matcher
@@ -101,6 +101,30 @@ class MailSenderTest(unittest.TestCase):
for recipient in flatten([input_mail.to, input_mail.cc, input_mail.bcc]):
verify(OutgoingMail).send_message(MailToSmtpFormatCapture(recipient, bccs), TwistedSmtpUserCapture(recipient))
+
+ @defer.inlineCallbacks
+ def test_if_recipent_doubled_in_fields_send_only_in_bcc(self):
+ input_mail = InputMail.from_dict(duplicates_in_fields_mail_dict(), from_address='pixelated@org')
+ when(OutgoingMail).send_message(any(), any()).thenReturn(defer.succeed(None))
+
+ yield self.sender.sendmail(input_mail)
+
+ self.assertIn('to@pixelated.org', input_mail.to)
+ self.assertNotIn('another@pixelated.org', input_mail.to)
+ #self.assertIn('another@pixelated.org', input_mail.bcc)
+
+ @defer.inlineCallbacks
+ def test_if_recipent_doubled_in_fields_send_only_in_to(self):
+ input_mail = InputMail.from_dict(duplicates_in_fields_mail_dict(), from_address='pixelated@org')
+ when(OutgoingMail).send_message(any(), any()).thenReturn(defer.succeed(None))
+
+ yield self.sender.sendmail(input_mail)
+
+ self.assertIn('third@pixelated.org', input_mail.to)
+ self.assertNotIn('third@pixelated.org', input_mail.cc)
+ self.assertIn('cc@pixelated.org', input_mail.cc)
+ self.assertNotIn(['third@pixelated.org', 'another@pixelated.org'], input_mail.cc)
+
def test_remove_canonical_recipient_when_it_is_not_canonical(self):
recipient = u'user@pixelated.org'