summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter/services/mail_sender.py
diff options
context:
space:
mode:
authorFolker Bernitt <fbernitt@thoughtworks.com>2015-11-04 17:08:18 +0100
committerFolker Bernitt <fbernitt@thoughtworks.com>2015-11-04 17:08:18 +0100
commit9c2318ee52b70437cd4e834539d20ed00194280d (patch)
treebc082958ce522b48235e8ac5fe07b65ce8bc70f4 /service/pixelated/adapter/services/mail_sender.py
parent1726b1ec3797b20b97adb184210c9e601a7c82b9 (diff)
Add error handling to MailSender
- Issue #499
Diffstat (limited to 'service/pixelated/adapter/services/mail_sender.py')
-rw-r--r--service/pixelated/adapter/services/mail_sender.py27
1 files changed, 26 insertions, 1 deletions
diff --git a/service/pixelated/adapter/services/mail_sender.py b/service/pixelated/adapter/services/mail_sender.py
index faf3d228..4ffb76b0 100644
--- a/service/pixelated/adapter/services/mail_sender.py
+++ b/service/pixelated/adapter/services/mail_sender.py
@@ -32,14 +32,33 @@ class SMTPDownException(Exception):
NOT_NEEDED = None
+class MailSenderException(Exception):
+
+ def __init__(self, message, email_error_map):
+ super(MailSenderException, self).__init__(message, email_error_map)
+ self.email_error_map = email_error_map
+
+
class MailSender(object):
def __init__(self, smtp_config, keymanager):
self._smtp_config = smtp_config
self._keymanager = keymanager
+ @defer.inlineCallbacks
def sendmail(self, mail):
recipients = flatten([mail.to, mail.cc, mail.bcc])
+
+ results = yield self._send_mail_to_all_recipients(mail, recipients)
+ all_succeeded = reduce(lambda a, b: a and b, [r[0] for r in results])
+
+ if not all_succeeded:
+ error_map = self._build_error_map(recipients, results)
+ raise MailSenderException('Failed to send mail to all recipients', error_map)
+
+ defer.returnValue(all_succeeded)
+
+ def _send_mail_to_all_recipients(self, mail, recipients):
outgoing_mail = self._create_outgoing_mail()
deferreds = []
@@ -47,7 +66,13 @@ class MailSender(object):
smtp_recipient = self._create_twisted_smtp_recipient(recipient)
deferreds.append(outgoing_mail.send_message(mail.to_smtp_format(), smtp_recipient))
- return defer.gatherResults(deferreds)
+ return defer.DeferredList(deferreds, fireOnOneErrback=False, consumeErrors=True)
+
+ def _build_error_map(self, recipients, results):
+ error_map = {}
+ for email, error in [(recipients[idx], r[1]) for idx, r in enumerate(results)]:
+ error_map[email] = error
+ return error_map
def _create_outgoing_mail(self):
return OutgoingMail(str(self._smtp_config.account_email),