tools.win_pg_dump_controller
2022-05-05
Child:34db5b44491d
tools.win_pg_dump_controller/win_pg_dump_controller/smtp_connector.py
+ Возможность отправлять оповещения по почте
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/win_pg_dump_controller/smtp_connector.py Thu May 05 22:25:18 2022 +0300 1.3 @@ -0,0 +1,63 @@ 1.4 +# coding: utf-8 1.5 + 1.6 +from .config import Config 1.7 + 1.8 +from email.message import EmailMessage 1.9 +from smtplib import SMTP, SMTPException 1.10 +from typing import List, Optional 1.11 +from socket import gethostname 1.12 +from datetime import datetime 1.13 +from os.path import basename, exists 1.14 + 1.15 + 1.16 +class MailError(Exception): 1.17 + pass 1.18 + 1.19 + 1.20 +class MailSender(object): 1.21 + def __init__(self, 1.22 + server: Optional[str], port: Optional[int], 1.23 + mail_from: Optional[str], mail_to: Optional[str]): 1.24 + self.server = server 1.25 + self.mail_from = mail_from 1.26 + self.mail_to = mail_to if mail_to is not None else 'root' 1.27 + self.port = port if port is not None else 25 1.28 + 1.29 + def sendmail(self, content: str, logs: List[str]) -> None: 1.30 + if self.server: 1.31 + msg = EmailMessage() 1.32 + msg['To'] = self.mail_to 1.33 + if self.mail_from: 1.34 + msg['From'] = self.mail_from 1.35 + 1.36 + msg['Subject'] = f'{gethostname()}: Posgres backup - {datetime.now()}' 1.37 + msg.set_content(content) 1.38 + msg.make_mixed() 1.39 + for f in logs: 1.40 + try: 1.41 + if exists(f): 1.42 + msg.add_attachment(open(f).read(), filename=basename(f)) 1.43 + 1.44 + except IOError as e: 1.45 + raise MailError(f'Error on open logfile "{f}": {e}') 1.46 + 1.47 + try: 1.48 + s = SMTP(host=self.server, port=self.port) 1.49 + s.helo(gethostname()) 1.50 + s.sendmail( 1.51 + from_addr=(self.mail_from if self.mail_from is not None else ''), 1.52 + to_addrs=self.mail_to, 1.53 + msg=msg.as_bytes() 1.54 + ) 1.55 + s.quit() 1.56 + except SMTPException as e: 1.57 + raise MailError(f'Error on sending Email: {e}') 1.58 + 1.59 + @classmethod 1.60 + def from_config(cls, config: Config): 1.61 + return cls( 1.62 + server=config.smtp_server, 1.63 + mail_from=config.mail_from, 1.64 + mail_to=config.mail_to, 1.65 + port=config.smtp_port 1.66 + ) 1.67 \ No newline at end of file