[PATCH 4 of 6] e-mail: properly handle no recipients when there is no email_to set

Thomas De Schampheleire patrickdepinguin at gmail.com
Sun Aug 2 20:51:38 UTC 2015


# HG changeset patch
# User Thomas De Schampheleire <thomas.de.schampheleire at gmail.com>
# Date 1438543505 -7200
#      Sun Aug 02 21:25:05 2015 +0200
# Node ID c758464b9b91693580cb6927a1b37a02f2bf334b
# Parent  8929f6591543076d718674a621feac1060a1a7e7
e-mail: properly handle no recipients when there is no email_to set

When the configuration file does not contain a value for email_to, and no
recipients are specified in a call to send_email, recipients would be set to
    [None, admins]
which causes an error when logging this list as ' '.join(recipients).

diff --git a/kallithea/lib/celerylib/tasks.py b/kallithea/lib/celerylib/tasks.py
--- a/kallithea/lib/celerylib/tasks.py
+++ b/kallithea/lib/celerylib/tasks.py
@@ -267,9 +267,16 @@ def send_email(recipients, subject, body
 
     if not recipients:
         # if recipients are not defined we send to email_config + all admins
-        admins = [u.email for u in User.query()
-                  .filter(User.admin == True).all()]
-        recipients = [email_config.get('email_to')] + admins
+        recipients = [u.email for u in User.query()
+                      .filter(User.admin == True).all()]
+        if email_config.get('email_to') is not None:
+            recipients += [email_config.get('email_to')]
+
+        # If there are still no recipients, there are no admins and no address
+        # configured in email_to, so return.
+        if not recipients:
+            log.error("No recipients specified and no fallback available.")
+            return False
 
         log.warning("No recipients specified for '%s' - sending to admins %s", subject, ' '.join(recipients))
 
diff --git a/kallithea/tests/other/test_mail.py b/kallithea/tests/other/test_mail.py
--- a/kallithea/tests/other/test_mail.py
+++ b/kallithea/tests/other/test_mail.py
@@ -68,3 +68,25 @@ class TestMail(BaseTestCase):
         self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
         self.assertIn(body, smtplib_mock.lastmsg)
         self.assertIn(html_body, smtplib_mock.lastmsg)
+
+    def test_send_mail_no_recipients_no_email_to(self):
+        mailserver = 'smtp.mailserver.org'
+        recipients = []
+        envelope_from = 'noreply at mailserver.org'
+        subject = 'subject'
+        body = 'body'
+        html_body = 'html_body'
+
+        config_mock = {
+                'smtp_server': mailserver,
+                'app_email_from': envelope_from,
+        }
+        with mock.patch('kallithea.lib.celerylib.tasks.config', config_mock):
+            kallithea.lib.celerylib.tasks.send_email(recipients, subject, body, html_body)
+
+        self.assertSetEqual(smtplib_mock.lastdest, set([TEST_USER_ADMIN_EMAIL]))
+        self.assertEqual(smtplib_mock.lastsender, envelope_from)
+        self.assertIn('From: %s' % envelope_from, smtplib_mock.lastmsg)
+        self.assertIn('Subject: %s' % subject, smtplib_mock.lastmsg)
+        self.assertIn(body, smtplib_mock.lastmsg)
+        self.assertIn(html_body, smtplib_mock.lastmsg)


More information about the kallithea-general mailing list