| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | import loggingimport smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextclass 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.error(f"SMTP error occurred: {str(e)}")            raise        except TimeoutError as e:            logging.error(f"Timeout occurred while sending email: {str(e)}")            raise        except Exception as e:            logging.error(f"Unexpected error occurred while sending email: {str(e)}")            raise        finally:            if smtp:                smtp.quit()
 |