[tor-commits] [gettor/master] Check SMTP error code and remove request from db

cohosh at torproject.org cohosh at torproject.org
Mon Apr 27 21:52:03 UTC 2020


commit 3a878213ba18178005238b0ded179fa84c5e1129
Author: Cecylia Bocovich <cohosh at torproject.org>
Date:   Mon Apr 27 14:36:58 2020 -0400

    Check SMTP error code and remove request from db
    
    This adds an extra check on SMTP errors to see if it's due to a bad
    recipient address and then removes the request from the database. This
    prevents one bad request from hanging up the processing of other
    requests (see https://bugs.torproject.org/34027).
---
 gettor/services/email/sendmail.py | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/gettor/services/email/sendmail.py b/gettor/services/email/sendmail.py
index 4d908b3..c4fdc95 100644
--- a/gettor/services/email/sendmail.py
+++ b/gettor/services/email/sendmail.py
@@ -18,19 +18,13 @@ import configparser
 from email.mime.text import MIMEText
 
 from twisted.internet import defer
-from twisted.mail.smtp import sendmail
+from twisted.mail import smtp
 
 from ...utils.db import SQLite3 as DB
 from ...utils.commons import log
 from ...utils import strings
 
 
-class SMTPError(Exception):
-    """
-    Error if we can't send emails.
-    """
-    pass
-
 from email.mime.text import MIMEText
 class Sendmail(object):
     """
@@ -70,7 +64,7 @@ class Sendmail(object):
         Errback if we don't/can't send the message.
         """
         log.debug("Could not send email.")
-        raise SMTPError("{}".format(error))
+        raise error
 
     def sendmail(self, email_addr, subject, body):
         """
@@ -93,7 +87,7 @@ class Sendmail(object):
 
         log.debug("Calling asynchronous sendmail.")
 
-        return sendmail(
+        return smtp.sendmail(
             self.settings.get("sendmail_host"), self.settings.get("sendmail_addr"), email_addr, message,
             requireTransportSecurity=True
         ).addCallback(self.sendmail_callback).addErrback(self.sendmail_errback)
@@ -217,7 +211,14 @@ class Sendmail(object):
                         id=id, service="email", date=date
                     )
 
-            except SMTPError as e:
+            except smtp.SMTPClientError as e:
+                if e.code == 501: # Bad recipient address syntax
+                    yield self.conn.remove_request(
+                        id=id, service="email", date=date
+                    )
+                log.info("Error sending email: {}.".format(e))
+
+            except Exception as e:
                 log.info("Error sending email: {}.".format(e))
 
         elif link_requests:
@@ -270,7 +271,14 @@ class Sendmail(object):
                         id=id, service="email", date=date
                     )
 
-            except SMTPError as e:
+            except smtp.SMTPClientError as e:
+                if e.code == 501: # Bad recipient address syntax
+                    yield self.conn.remove_request(
+                        id=id, service="email", date=date
+                    )
+                log.info("Error sending email: {}.".format(e))
+
+            except Exception as e:
                 log.info("Error sending email: {}.".format(e))
         else:
             log.debug("No pending email requests. Keep waiting.")



More information about the tor-commits mailing list