From fd3fd66a1db8925e5a9a3d34acdd213f49378877 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Mon, 30 Apr 2018 17:24:27 +0300 Subject: Add: notification service --- ick2/sendmail.py | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 ick2/sendmail.py (limited to 'ick2/sendmail.py') 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 . + + +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 -- cgit v1.2.1