# 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 build notification from ick. Controller: {controller_url} Project: {project} Build ID: {build_id} Log ID: {log} Worker: {worker} Exit code: {exit_code} Build log is attached. """ class Sendmail: config_fields = [ 'from_addr', 'controller_url', '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 '{status} {build_id}: Ick build notification'.format(**build) def get_body(self, build): msg = email.message.Message() msg.set_payload(body_tmpl.format( controller_url=self._config['controller_url'], **build)) msg.add_header('Content-Type', 'text/plain') return msg def get_log(self, log): msg = email.message.Message() msg.set_payload(log.encode('utf-8')) msg.add_header('Content-Type', 'text/plain; charset=utf-8') msg.add_header( 'Content-Disposition', 'inline', filename='build.log') return msg