Explorar el Código

fix: add timeout to SMTPClient to prevent worker blocking (#4352)

Charles Zhou hace 11 meses
padre
commit
2eb468f885
Se han modificado 1 ficheros con 28 adiciones y 12 borrados
  1. 28 12
      api/libs/smtp.py

+ 28 - 12
api/libs/smtp.py

@@ -1,3 +1,4 @@
+import logging
 import smtplib
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
@@ -13,15 +14,30 @@ class SMTPClient:
         self._use_tls = use_tls
 
     def send(self, mail: dict):
-        smtp = smtplib.SMTP(self.server, self.port)
-        if self._use_tls:
-            smtp.starttls()
-        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.username, mail['to'], msg.as_string())
-        smtp.quit()
+        smtp = None
+        try:
+            smtp = smtplib.SMTP(self.server, self.port, timeout=10)
+            if self._use_tls:
+                smtp.starttls()
+            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()