From 42dc9d04006c0bdecba6e0c8a29038b01d5a62d7 Mon Sep 17 00:00:00 2001 From: levental Date: Tue, 20 Sep 2016 19:34:01 +0200 Subject: [PATCH] Fixed #26210 -- Prevented SMTP backend from trying to send mail after a connection failure. --- django/core/mail/backends/smtp.py | 7 ++++--- tests/mail/tests.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/django/core/mail/backends/smtp.py b/django/core/mail/backends/smtp.py index 4d554a2c42..05006a2b17 100644 --- a/django/core/mail/backends/smtp.py +++ b/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 diff --git a/tests/mail/tests.py b/tests/mail/tests.py index 93e2127d63..e518ca46d5 100644 --- a/tests/mail/tests.py +++ b/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): """