From 17160fd6d6d7850294a9a465a3e5e399e5028bb6 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Thu, 15 Mar 2012 12:02:08 +0000 Subject: [PATCH] Fixes #14314: Improved SMTP timeout handling. --- Lib/logging/handlers.py | 7 +++++-- Lib/test/test_logging.py | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index bebd79a8fe1..f8632ceb1b4 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -867,7 +867,7 @@ class SMTPHandler(logging.Handler): A handler class which sends an SMTP email for each logging event. """ def __init__(self, mailhost, fromaddr, toaddrs, subject, - credentials=None, secure=None): + credentials=None, secure=None, timeout=1.0): """ Initialize the handler. @@ -881,6 +881,8 @@ class SMTPHandler(logging.Handler): will be either an empty tuple, or a single-value tuple with the name of a keyfile, or a 2-value tuple with the names of the keyfile and certificate file. (This tuple is passed to the `starttls` method). + A timeout in seconds can be specified for the SMTP connection (the + default is one second). """ logging.Handler.__init__(self) if isinstance(mailhost, tuple): @@ -897,6 +899,7 @@ class SMTPHandler(logging.Handler): self.toaddrs = toaddrs self.subject = subject self.secure = secure + self.timeout = timeout def getSubject(self, record): """ @@ -919,7 +922,7 @@ class SMTPHandler(logging.Handler): port = self.mailport if not port: port = smtplib.SMTP_PORT - smtp = smtplib.SMTP(self.mailhost, port) + smtp = smtplib.SMTP(self.mailhost, port, timeout=self.timeout) msg = self.format(record) msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % ( self.fromaddr, diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index be84be682f7..b0f8f9fb165 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -936,8 +936,9 @@ class SMTPHandlerTest(BaseTest): r = logging.makeLogRecord({'msg': 'Hello'}) self.handled = threading.Event() h.handle(r) - self.handled.wait() + self.handled.wait(5.0) # 14314: don't wait forever server.stop() + self.assertTrue(self.handled.is_set()) self.assertEqual(len(self.messages), 1) peer, mailfrom, rcpttos, data = self.messages[0] self.assertEqual(mailfrom, 'me')