From 8c2ed66a96782a00efd2c5f24bdcf5e3ee6bf593 Mon Sep 17 00:00:00 2001 From: Sergey Lavrinenko Date: Fri, 11 Mar 2016 20:48:24 +0300 Subject: [PATCH 1/3] More specific error in SMTPBackend.send. Fixes #60 --- emails/backend/smtp/backend.py | 19 ++++++++++++------- emails/backend/smtp/exceptions.py | 15 +++++++++++++++ emails/testsuite/loader/test_loaders.py | 1 - 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 emails/backend/smtp/exceptions.py diff --git a/emails/backend/smtp/backend.py b/emails/backend/smtp/backend.py index 86b7e82..1086c54 100644 --- a/emails/backend/smtp/backend.py +++ b/emails/backend/smtp/backend.py @@ -1,14 +1,15 @@ # encoding: utf-8 from __future__ import unicode_literals - -__all__ = ['SMTPBackend', ] - import smtplib import logging from functools import wraps from ..response import SMTPResponse from .client import SMTPClientWithResponse, SMTPClientWithResponse_SSL from ...utils import DNS_NAME +from .exceptions import SMTPConnectNetworkError + + +__all__ = ['SMTPBackend'] logger = logging.getLogger(__name__) @@ -85,16 +86,20 @@ class SMTPBackend: def _send(self, **kwargs): + response = None try: client = self.get_client() - except (IOError, smtplib.SMTPException) as exc: - logger.exception("Error connecting smtp server") + except IOError as exc: + response = self.make_response(exception=SMTPConnectNetworkError.from_ioerror(exc)) + except smtplib.SMTPException as exc: response = self.make_response(exception=exc) + + if response: if not self.fail_silently: response.raise_if_needed() return response - - return client.sendmail(**kwargs) + else: + return client.sendmail(**kwargs) def sendmail(self, from_addr, to_addrs, msg, mail_options=None, rcpt_options=None): diff --git a/emails/backend/smtp/exceptions.py b/emails/backend/smtp/exceptions.py new file mode 100644 index 0000000..fccab18 --- /dev/null +++ b/emails/backend/smtp/exceptions.py @@ -0,0 +1,15 @@ +# encoding: utf-8 +from __future__ import unicode_literals +import socket + + +class SMTPConnectNetworkError(IOError): + """Network error during connection establishment.""" + + @classmethod + def from_ioerror(cls, exc): + o = cls() + o.errno = exc.errno + o.filename = exc.filename + o.strerror = exc.strerror + return o diff --git a/emails/testsuite/loader/test_loaders.py b/emails/testsuite/loader/test_loaders.py index c7de9d6..2069df7 100644 --- a/emails/testsuite/loader/test_loaders.py +++ b/emails/testsuite/loader/test_loaders.py @@ -169,7 +169,6 @@ def test_external_urls(): success = 0 for url in [ - 'https://github.com/lavr/python-emails', 'http://yandex.com', 'http://www.smashingmagazine.com/' ]: From f81fe216dd78c5ef0c7390f8087dc0f2ea5b3f62 Mon Sep 17 00:00:00 2001 From: Sergey Lavrinenko Date: Sat, 12 Mar 2016 00:26:39 +0300 Subject: [PATCH 2/3] py33 test fix --- requirements/tests-3.3.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/tests-3.3.txt b/requirements/tests-3.3.txt index b6d69fd..11a7074 100644 --- a/requirements/tests-3.3.txt +++ b/requirements/tests-3.3.txt @@ -1,4 +1,4 @@ --requirement=base.txt --requirement=tests-base.txt -django \ No newline at end of file +django<1.9 From c113421eac26847e53d3213c9921fff24e8bb323 Mon Sep 17 00:00:00 2001 From: Sergey Lavrinenko Date: Sat, 12 Mar 2016 00:29:49 +0300 Subject: [PATCH 3/3] Disable pypy travis failing tests --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 686b017..54c9c7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ python: - "2.7" - "3.3" - "3.4" - - "pypy" script: py.test --cov emails