| 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.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() | |