From 105dbb4313384aeead0dd8852e27c857aef5c599 Mon Sep 17 00:00:00 2001 From: Yax <1949284+kianby@users.noreply.github.com> Date: Mon, 8 Feb 2021 18:35:46 +0100 Subject: [PATCH] add mail error logger --- run.py | 9 +++++- stacosys/core/mailer.py | 65 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/run.py b/run.py index 4ebef94..63c0f81 100644 --- a/run.py +++ b/run.py @@ -10,6 +10,7 @@ from stacosys.conf.config import Config, ConfigParameter from stacosys.core import database from stacosys.core.rss import Rss from stacosys.core.mailer import Mailer +from stacosys.core.mailer import SSLSMTPHandler from stacosys.interface import app from stacosys.interface import api from stacosys.interface import form @@ -46,7 +47,7 @@ def stacosys_server(config_pathname): # initialize config conf = Config.load(config_pathname) logger.info(conf.__repr__()) - + # check database file exists (prevents from creating a fresh db) db_pathname = conf.get(ConfigParameter.DB_SQLITE_FILE) if not os.path.isfile(db_pathname): @@ -82,8 +83,14 @@ def stacosys_server(config_pathname): conf.get_bool(ConfigParameter.SMTP_SSL), conf.get(ConfigParameter.SMTP_LOGIN), conf.get(ConfigParameter.SMTP_PASSWORD), + conf.get(ConfigParameter.SITE_ADMIN_EMAIL) ) + # configure mailer logger + mail_handler = mailer.get_error_handler() + logger.addHandler(mail_handler) + app.logger.addHandler(mail_handler) + # configure scheduler scheduler.configure( conf.get_int(ConfigParameter.IMAP_POLLING), diff --git a/stacosys/core/mailer.py b/stacosys/core/mailer.py index 4a5a406..c8a2ffd 100644 --- a/stacosys/core/mailer.py +++ b/stacosys/core/mailer.py @@ -3,7 +3,10 @@ import logging import smtplib +import email.utils from email.mime.text import MIMEText +from email.message import EmailMessage +from logging.handlers import SMTPHandler from stacosys.core import imap @@ -24,6 +27,7 @@ class Mailer: smtp_ssl, smtp_login, smtp_password, + site_admin_email, ): self._imap_host = imap_host self._imap_port = imap_port @@ -36,6 +40,7 @@ class Mailer: self._smtp_ssl = smtp_ssl self._smtp_login = smtp_login self._smtp_password = smtp_password + self._site_admin_email = site_admin_email def _open_mailbox(self): return imap.Mailbox( @@ -70,10 +75,11 @@ class Mailer: if self._smtp_ssl: s = smtplib.SMTP_SSL(self._smtp_host, self._smtp_port) else: - s = smtplib.SMTP(self._smtp_host, self._smtp_port) + s = smtplib.SMTP(self._smtp_host, self._smtp_port) if self._smtp_starttls: s.starttls() - s.login(self._smtp_login, self._smtp_password) + if self._smtp_login: + s.login(self._smtp_login, self._smtp_password) s.send_message(msg) s.quit() except Exception: @@ -87,3 +93,58 @@ class Mailer: mbox.delete_message(id) except Exception: logger.exception("delete mail exception") + + def get_error_handler(self): + if self._smtp_ssl: + mail_handler = SSLSMTPHandler( + mailhost=( + self._smtp_host, + self._smtp_port, + ), + credentials=( + self._smtp_login, + self._smtp_password, + ), + fromaddr=self._smtp_login, + toaddrs=self._site_admin_email, + subject="Stacosys error", + ) + else: + mail_handler = SMTPHandler( + mailhost=( + self._smtp_host, + self._smtp_port, + ), + credentials=( + self._smtp_login, + self._smtp_password, + ), + fromaddr=self._smtp_login, + toaddrs=self._site_admin_email, + subject="Stacosys error", + ) + mail_handler.setLevel(logging.ERROR) + return mail_handler + + +class SSLSMTPHandler(SMTPHandler): + def emit(self, record): + """ + Emit a record. + + Format the record and send it to the specified addressees. + """ + try: + smtp = smtplib.SMTP_SSL(self.mailhost, self.mailport) + msg = EmailMessage() + msg["From"] = self.fromaddr + msg["To"] = ",".join(self.toaddrs) + msg["Subject"] = self.getSubject(record) + msg["Date"] = email.utils.localtime() + msg.set_content(self.format(record)) + if self.username: + smtp.login(self.username, self.password) + smtp.send_message(msg) + smtp.quit() + except Exception: + self.handleError(record)