2024-05-14 23:44:53 +08:00
|
|
|
import logging
|
2024-02-07 18:08:41 +08:00
|
|
|
import smtplib
|
|
|
|
from email.mime.multipart import MIMEMultipart
|
|
|
|
from email.mime.text import MIMEText
|
|
|
|
|
|
|
|
|
|
|
|
class SMTPClient:
|
2024-05-30 18:56:46 +08:00
|
|
|
def __init__(self, server: str, port: int, username: str, password: str, _from: str, use_tls=False, opportunistic_tls=False):
|
2024-02-07 18:08:41 +08:00
|
|
|
self.server = server
|
|
|
|
self.port = port
|
|
|
|
self._from = _from
|
|
|
|
self.username = username
|
|
|
|
self.password = password
|
2024-05-30 18:56:46 +08:00
|
|
|
self.use_tls = use_tls
|
|
|
|
self.opportunistic_tls = opportunistic_tls
|
2024-02-07 18:08:41 +08:00
|
|
|
|
|
|
|
def send(self, mail: dict):
|
2024-05-14 23:44:53 +08:00
|
|
|
smtp = None
|
|
|
|
try:
|
2024-05-30 18:56:46 +08:00
|
|
|
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)
|
|
|
|
|
2024-05-14 23:44:53 +08:00
|
|
|
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()
|