Description
Bug report
Bug description:
The documentation for logging.handlers.SMTPHandler
describes the secure
argument as follows:
To specify the use of a secure protocol (TLS), pass in a tuple to the
secure
argument. This will only be used when authentication credentials are supplied. The tuple should 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 thesmtplib.SMTP.starttls()
method.)
However, from Python 3.12 on, only the empty tuple actually works.
With a single-value-tuple or a two-value-tuple, smtplib.SMTP.starttls()
throws an exception like this:
Traceback (most recent call last):
File "/usr/lib/python3.13/logging/handlers.py", line 1097, in emit
smtp.starttls(*self.secure)
~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: SMTP.starttls() takes 1 positional argument but 3 were given
The reason seems immediately obvious from the last sentence in the description of the secure
argument: The tuple is passed to smtplib.SMTP.starttls()
.
The documentation for this method states:
Changed in version 3.12: The deprecated
keyfile
andcertfile
parameters have been removed.
SMTPHandler
still relies on the these parameters.
Here's a minimal script to reproduce the error (requires a mocked SMTP server on port 1025):
#!/usr/bin/env python3
import logging
from logging.handlers import SMTPHandler
logger = logging.getLogger()
handler = SMTPHandler(
mailhost=("localhost", 1025),
fromaddr="foo@localhost",
toaddrs="bar@localhost",
subject="Test",
credentials=("foo", "bar"),
secure=(
"/path/to/private.key",
"/path/to/cert.pem"
),
)
logger.addHandler(handler)
logger.error("SMTPHandler is broken")
Note that Python 3.11 is not affected and the above code successfully attempts to issue a STARTTLS command.
CPython versions tested on:
3.11, 3.12, 3.13
Operating systems tested on:
Linux
Linked PRs
Metadata
Metadata
Assignees
Labels
Projects
Status