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
     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