gh-127712: Fix secure argument of logging.handlers.SMTPHandler (GH-127726)

GH-127712: Fix `secure` argument of `logging.handlers.SMTPHandler`

Python 3.12 removed support for the `keyfile` and `certfile` parameters
in `smtplib.SMTP.starttls()`, requiring a `ssl.SSLContext` instead.
`SMTPHandler` now creates a context from the `secure` tuple and passes
that to `starttls`.
This commit is contained in:
s-hamann 2025-02-10 12:34:27 +00:00 committed by GitHub
parent 94cd2e0dde
commit d7672e5d5a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 2 deletions

View file

@ -1043,7 +1043,8 @@ class SMTPHandler(logging.Handler):
only be used when authentication credentials are supplied. The tuple
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).
certificate file. (This tuple is passed to the
`ssl.SSLContext.load_cert_chain` method).
A timeout in seconds can be specified for the SMTP connection (the
default is one second).
"""
@ -1096,8 +1097,23 @@ class SMTPHandler(logging.Handler):
msg.set_content(self.format(record))
if self.username:
if self.secure is not None:
import ssl
try:
keyfile = self.secure[0]
except IndexError:
keyfile = None
try:
certfile = self.secure[1]
except IndexError:
certfile = None
context = ssl._create_stdlib_context(
certfile=certfile, keyfile=keyfile
)
smtp.ehlo()
smtp.starttls(*self.secure)
smtp.starttls(context=context)
smtp.ehlo()
smtp.login(self.username, self.password)
smtp.send_message(msg)

View file

@ -0,0 +1 @@
Fix handling of the ``secure`` argument of :class:`logging.handlers.SMTPHandler`.