tools.win_pg_dump_controller
2022-05-05
Child:34db5b44491d
tools.win_pg_dump_controller/win_pg_dump_controller/smtp_connector.py
+ Возможность отправлять оповещения по почте
| 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 ) |