tools.win_pg_dump_controller

Yohn Y. 2022-05-05 Child:34db5b44491d

2:7c93b0305522 Go to Latest

tools.win_pg_dump_controller/win_pg_dump_controller/smtp_connector.py

+ Возможность отправлять оповещения по почте

History
awgur@2 1 # coding: utf-8
awgur@2 2
awgur@2 3 from .config import Config
awgur@2 4
awgur@2 5 from email.message import EmailMessage
awgur@2 6 from smtplib import SMTP, SMTPException
awgur@2 7 from typing import List, Optional
awgur@2 8 from socket import gethostname
awgur@2 9 from datetime import datetime
awgur@2 10 from os.path import basename, exists
awgur@2 11
awgur@2 12
awgur@2 13 class MailError(Exception):
awgur@2 14 pass
awgur@2 15
awgur@2 16
awgur@2 17 class MailSender(object):
awgur@2 18 def __init__(self,
awgur@2 19 server: Optional[str], port: Optional[int],
awgur@2 20 mail_from: Optional[str], mail_to: Optional[str]):
awgur@2 21 self.server = server
awgur@2 22 self.mail_from = mail_from
awgur@2 23 self.mail_to = mail_to if mail_to is not None else 'root'
awgur@2 24 self.port = port if port is not None else 25
awgur@2 25
awgur@2 26 def sendmail(self, content: str, logs: List[str]) -> None:
awgur@2 27 if self.server:
awgur@2 28 msg = EmailMessage()
awgur@2 29 msg['To'] = self.mail_to
awgur@2 30 if self.mail_from:
awgur@2 31 msg['From'] = self.mail_from
awgur@2 32
awgur@2 33 msg['Subject'] = f'{gethostname()}: Posgres backup - {datetime.now()}'
awgur@2 34 msg.set_content(content)
awgur@2 35 msg.make_mixed()
awgur@2 36 for f in logs:
awgur@2 37 try:
awgur@2 38 if exists(f):
awgur@2 39 msg.add_attachment(open(f).read(), filename=basename(f))
awgur@2 40
awgur@2 41 except IOError as e:
awgur@2 42 raise MailError(f'Error on open logfile "{f}": {e}')
awgur@2 43
awgur@2 44 try:
awgur@2 45 s = SMTP(host=self.server, port=self.port)
awgur@2 46 s.helo(gethostname())
awgur@2 47 s.sendmail(
awgur@2 48 from_addr=(self.mail_from if self.mail_from is not None else ''),
awgur@2 49 to_addrs=self.mail_to,
awgur@2 50 msg=msg.as_bytes()
awgur@2 51 )
awgur@2 52 s.quit()
awgur@2 53 except SMTPException as e:
awgur@2 54 raise MailError(f'Error on sending Email: {e}')
awgur@2 55
awgur@2 56 @classmethod
awgur@2 57 def from_config(cls, config: Config):
awgur@2 58 return cls(
awgur@2 59 server=config.smtp_server,
awgur@2 60 mail_from=config.mail_from,
awgur@2 61 mail_to=config.mail_to,
awgur@2 62 port=config.smtp_port
awgur@2 63 )