From 169855137edf126e22300c1beac9939ee59a6129 Mon Sep 17 00:00:00 2001 From: simnyatsanga Date: Thu, 29 Jan 2015 12:12:42 -0200 Subject: Removing duplicate email address --- service/pixelated/adapter/services/mail_sender.py | 18 ++++++++-- .../adapter/test_email_recepient_normalizer.py | 42 ++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 service/test/unit/adapter/test_email_recepient_normalizer.py diff --git a/service/pixelated/adapter/services/mail_sender.py b/service/pixelated/adapter/services/mail_sender.py index 1c2d7ce1..f4954514 100644 --- a/service/pixelated/adapter/services/mail_sender.py +++ b/service/pixelated/adapter/services/mail_sender.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see . from StringIO import StringIO +import re from twisted.internet.defer import Deferred from twisted.mail.smtp import SMTPSenderFactory @@ -25,13 +26,26 @@ class MailSender(): def __init__(self, account_email_address, smtp_client=None): self.account_email_address = account_email_address + def recepients_normalizer(self, mail_list): + return set(mail_list) + + def get_email_addresses(self, mail_list): + clean_mail_list = [] + for mail_address in mail_list: + if "<" in mail_address: + match = re.search(r'<(.*)', mail_address) + clean_mail_list.append(match.group(1).strip('>')) + else: + clean_mail_list.append(mail_address) + return self.recepients_normalizer(clean_mail_list) + def sendmail(self, mail): recipients = flatten([mail.to, mail.cc, mail.bcc]) - + normalized_recepients = get_email_addresses(recipients) resultDeferred = Deferred() senderFactory = SMTPSenderFactory( fromEmail=self.account_email_address, - toEmail=recipients, + toEmail=normalized_recipients, file=StringIO(mail.to_smtp_format()), deferred=resultDeferred) diff --git a/service/test/unit/adapter/test_email_recepient_normalizer.py b/service/test/unit/adapter/test_email_recepient_normalizer.py new file mode 100644 index 00000000..79d50273 --- /dev/null +++ b/service/test/unit/adapter/test_email_recepient_normalizer.py @@ -0,0 +1,42 @@ +# +# Copyright (c) 2014 ThoughtWorks, Inc. +# +# Pixelated is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pixelated is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Pixelated. If not, see . +import unittest + +from pixelated.adapter.model.mail import PixelatedMail +from pixelated.adapter.services.mailbox import Mailbox +from pixelated.adapter.services.mail_sender import MailSender +from mockito import * +from test.support import test_helper + + +class PixelatedDuplicateEmailTest(unittest.TestCase): + def setUp(self): + self.mail_sender = MailSender(self, "random@gmail.com") + + def test_remove_duplicate_mail_recepients(self): + mail_list = ['simba@gmail.com', 'simba@gmail.com', 'fabio@gmail.com'] + normalized_recepients = self.mail_sender.recepients_normalizer(mail_list) + self.assertEquals(normalized_recepients, set(['simba@gmail.com', 'fabio@gmail.com'])) + + def test_get_email_addresses(self): + mail_list = ['simbarashe', 'vic@gmail.com', 'Fabio', 'slick@gmail.com'] + selected_recepients = self.mail_sender.get_email_addresses(mail_list) + self.assertEquals(selected_recepients, set(['simba@gmail.com', 'vic@gmail.com', 'fabio@gmail.com', 'slick@gmail.com'])) + + def test_remove_duplicate_emails_with_routing_format(self): + mail_list = ['simbarashe', 'simba', 'Fabio', 'Fabinho'] + selected_recepients = self.mail_sender.get_email_addresses(mail_list) + self.assertEquals(selected_recepients, set(['simba@gmail.com', 'fabio@gmail.com'])) -- cgit v1.2.3