summaryrefslogtreecommitdiff
path: root/ick2/sendmail.py
diff options
context:
space:
mode:
Diffstat (limited to 'ick2/sendmail.py')
-rw-r--r--ick2/sendmail.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/ick2/sendmail.py b/ick2/sendmail.py
new file mode 100644
index 0000000..0b0d34e
--- /dev/null
+++ b/ick2/sendmail.py
@@ -0,0 +1,92 @@
+# Copyright 2018 Lars Wirzenius
+#
+# This program 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.
+#
+# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import email.message
+import smtplib
+
+
+body_tmpl = """\
+This is a notification from ick, the CI system.
+
+Project: {project}
+Build ID: {build_id}
+Log ID: {log}
+Worker: {worker}
+Status: {status}
+Exit code: {exit_code}
+
+Build log is attached.
+
+"""
+
+
+class Sendmail:
+
+ config_fields = [
+ 'from_addr',
+ 'smtp_server',
+ 'smtp_port',
+ 'smtp_user',
+ 'smtp_password',
+ ]
+
+ def __init__(self):
+ self._config = None
+
+ def set_config(self, config):
+ for field in self.config_fields:
+ assert field in config
+ self._config = config
+
+ def send(self, recipients, build, log):
+ msg = self.construct_msg(recipients, build, log)
+ self._send_msg(recipients, msg)
+
+ def _send_msg(self, recipients, msg):
+ server = smtplib.SMTP()
+ server.connect(
+ host=self._config['smtp_server'], port=self._config['smtp_port'])
+ server.ehlo()
+ server.starttls()
+ server.login(self._config['smtp_user'], self._config['smtp_password'])
+ server.sendmail(self._config['from_addr'], recipients, msg.as_bytes())
+
+ def construct_msg(self, recipients, build, log):
+ msg = email.message.Message()
+ msg.add_header('From', self._config['from_addr'])
+ msg.add_header('To', ', '.join(recipients))
+ msg.add_header('Subject', self.get_subject(build))
+ msg.add_header('Content-Type', 'multipart/mixed')
+ msg.attach(self.get_body(build))
+ msg.attach(self.get_log(log))
+ return msg
+
+ def get_subject(self, build):
+ return 'Ick notification: {build_id} {status}'.format(**build)
+
+ def get_body(self, build):
+ msg = email.message.Message()
+ msg.set_payload(body_tmpl.format(**build))
+ msg.add_header('Content-Type', 'text/plain')
+ return msg
+
+ def get_log(self, log):
+ msg = email.message.Message()
+ msg.set_payload(log)
+ msg.add_header('Content-Type', 'text/plain')
+ msg.add_header(
+ 'Content-Disposition', 'inline', filename='build.log')
+ return msg