# HG changeset patch # User Thomas De Schampheleire # Date 1438543505 -7200 # Node ID 88a5fb51d83744befbdb2aaeae63d8c5e735749a # Parent 1339fd56f3020dbf46c922ad27278b9f21c30234 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 -r 1339fd56f302 -r 88a5fb51d837 kallithea/lib/celerylib/tasks.py --- a/kallithea/lib/celerylib/tasks.py Sun Aug 02 21:17:14 2015 +0200 +++ b/kallithea/lib/celerylib/tasks.py Sun Aug 02 21:25:05 2015 +0200 @@ -267,9 +267,16 @@ 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 -r 1339fd56f302 -r 88a5fb51d837 kallithea/tests/other/test_mail.py --- a/kallithea/tests/other/test_mail.py Sun Aug 02 21:17:14 2015 +0200 +++ b/kallithea/tests/other/test_mail.py Sun Aug 02 21:25:05 2015 +0200 @@ -68,3 +68,25 @@ 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@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)