import smtplib import ssl from dataclasses import dataclass from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import make_msgid from pathlib import Path @dataclass class MailConfig: server: str port: int secure: str username: str password: str email: str @dataclass class Message: mailto: str subject: str html: str attachment: list class SmtpMailer: connected = False def __init__(self, cfg=None): if cfg is None: cfg = default_cfg self.mail_cfg = cfg self.reply_to = "versand@global-cube.com" self.context = ssl.create_default_context() def __enter__(self): try: if self.mail_cfg.secure == "ssl": self.mailserver = smtplib.SMTP_SSL(self.mail_cfg.server, self.mail_cfg.port, context=self.context) else: self.mailserver = smtplib.SMTP(self.mail_cfg.server, self.mail_cfg.port) if self.mail_cfg.secure == "tls": self.context.minimum_version = ssl.TLSVersion["TLSv1_2"] self.mailserver.ehlo() self.mailserver.starttls(context=self.context) self.mailserver.login(self.mail_cfg.username, self.mail_cfg.password) self.connected = True except smtplib.SMTPException as e: print(e) return self def __exit__(self, exc_type, exc_val, exc_tb): if self.connected: self.mailserver.quit() def send(self, mailto, subject, html, attachment=None): msg = self.message(mailto, subject, html, attachment) msg["Message-ID"] = make_msgid(domain=self.mail_cfg.server) # res = {"id": msg["Message-ID"], "mailto": mailto, "status": "OK"} try: self.mailserver.sendmail(self.mail_cfg.email, mailto, msg.as_string()) except smtplib.SMTPException as e: print(e) pass def message(self, mailto, subject, html, attachment): msg = MIMEMultipart("alternative") msg["From"] = self.mail_cfg.email msg["To"] = mailto msg["Subject"] = subject msg.attach(MIMEText(html, "html")) for name, filename in attachment or []: with open(filename, "rb") as f: part = MIMEApplication(f.read(), Name=name) part["Content-Disposition"] = f'attachment; filename="{name}"' msg.attach(part) return msg default_cfg = MailConfig( server="mail.global-cube.com", port=465, secure="ssl", username="versand", password="y6!avXX3tQvr", email="versand@global-cube.com", ) if __name__ == "__main__": base_dir = str(Path(__file__).parent.parent) with SmtpMailer() as m: m.send( "robert.bedner@gmail.com", "Test 1234567", "kein Kommentar", [ ( "Umsatz_Bruttoertrag_Aftersales.pdf", base_dir + "/Portal/Publish/daten/gaps_vers_tag/Umsatz_Bruttoertrag_Aftersales_0.pdf", ) ], )