import logging import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText class SMTPClient: def __init__( self, server: str, port: int, username: str, password: str, _from: str, use_tls=False, opportunistic_tls=False ): self.server = server self.port = port self._from = _from self.username = username self.password = password self.use_tls = use_tls self.opportunistic_tls = opportunistic_tls def send(self, mail: dict): smtp = None try: if self.use_tls: if self.opportunistic_tls: smtp = smtplib.SMTP(self.server, self.port, timeout=10) smtp.starttls() else: smtp = smtplib.SMTP_SSL(self.server, self.port, timeout=10) else: smtp = smtplib.SMTP(self.server, self.port, timeout=10) if self.username and self.password: smtp.login(self.username, self.password) msg = MIMEMultipart() msg["Subject"] = mail["subject"] msg["From"] = self._from msg["To"] = mail["to"] msg.attach(MIMEText(mail["html"], "html")) smtp.sendmail(self._from, mail["to"], msg.as_string()) except smtplib.SMTPException as e: logging.exception(f"SMTP error occurred: {str(e)}") raise except TimeoutError as e: logging.exception(f"Timeout occurred while sending email: {str(e)}") raise except Exception as e: logging.exception(f"Unexpected error occurred while sending email: {str(e)}") raise finally: if smtp: smtp.quit()