Browse Source

Fixed #26210 -- Prevented SMTP backend from trying to send mail after a connection failure.

levental 8 years ago
parent
commit
42dc9d0400
2 changed files with 17 additions and 3 deletions
  1. 4 3
      django/core/mail/backends/smtp.py
  2. 13 0
      tests/mail/tests.py

+ 4 - 3
django/core/mail/backends/smtp.py

@@ -41,8 +41,9 @@ class EmailBackend(BaseEmailBackend):
 
     def open(self):
         """
-        Ensures we have a connection to the email server. Returns whether or
-        not a new connection was required (True or False).
+        Ensure an open connection to the email server. Return whether or not a
+        new connection was required (True or False) or None if an exception
+        passed silently.
         """
         if self.connection:
             # Nothing to do if the connection is already open.
@@ -102,7 +103,7 @@ class EmailBackend(BaseEmailBackend):
             return
         with self._lock:
             new_conn_created = self.open()
-            if not self.connection:
+            if not self.connection or new_conn_created is None:
                 # We failed silently on open().
                 # Trying to send would be pointless.
                 return

+ 13 - 0
tests/mail/tests.py

@@ -1448,6 +1448,19 @@ class SMTPBackendTests(BaseEmailBackendTests, SMTPBackendTestsBase):
         finally:
             SMTP.send = send
 
+    def test_send_messages_after_open_failed(self):
+        """
+        send_messages() shouldn't try to send messages if open() raises an
+        exception after initializing the connection.
+        """
+        backend = smtp.EmailBackend()
+        # Simulate connection initialization success and a subsequent
+        # connection exception.
+        backend.connection = True
+        backend.open = lambda: None
+        email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com'])
+        self.assertEqual(backend.send_messages([email]), None)
+
 
 class SMTPBackendStoppedServerTest(SMTPBackendTestsBase):
     """