- Controller's
ready_timeout
parameter increased from1.0
to5.0
. This won't slow down Controller startup because it's just a timeout limit (instead of a sleep delay), but this should help prevent Controller from giving up too soon, especially during situations where system/network is a bit busy causing slowdowns. (See #262) - Timeout messages in
Controller.start()
gets more details and a mention about theready_timeout
parameter. (See #262) - Prevent sensitive AUTH information leak by sanitizing the repr() of AuthResult and LoginPassword.
- Maximum length of email address local part is customizable, defaults to no limit. (Closes #257)
- Support for PROXY Protocol_ (Closes #174)
- Example for authentication
- SSL Support for CLI. See
the man page <manpage>
for more info. (Closes #172) - New
UnixSocketController
class to implement Unix socket-based SMTP server (Closes #114)
pypy3
testenv for tox can now run on Windowsstatic
testenv now auto-skipped on Windows- Now uses Sphinx's Doctest facility, which is much more flexible than pytest's doctest
- GPG Signing Key info to
README.rst
and PyPI Long Desc - Hidden
static
test env for static code checking
- Fixed Documentation Issues that might cause automatic package builders to fail
- Also consider
EAFNOSUPPORT
in IPv6 detection (Closes #244, again) - Update PyPI Long Description
ready_timeout
now actually enforced, raisingTimeoutError
if breached- Hides only expected exceptions raised by
Controller._testconn()
- No longer fail with opaque "Unknown Error" if
hostname=""
(Closes #244) - No longer hardcode localhost as
::1
but perform IPv6 detection first (Closes #244)
- New
handle_EHLO
interaction where said method can now modify list of responses to the EHLO command (Closes #155)
- No longer have to workaround
bpo-27931
which has been fixed in Python 3.6 anyways. - New
handle_EHLO
interaction where said method can now modify list of responses to the EHLO command (Closes #155) authenticator
system improves onauth_callback
by enabling the called function to see the SMTP Session and other info. (auth_callback
will be deprecated in 2.0)__version__
is now an attribute in__init__.py
, and can be imported from the 'plain'aiosmtpd
module. (It gets reimported toaiosmtpd.smtp
, so programs relying onaiosmtpd.smtp.__version__
should still work.) (Closes #241)- Uses pure
pytest
for all test cases (Closes #198)
- Optional (default-disabled) logging of
AUTH
interaction -- with severe warnings
AUTH
command line now sanitized before logging (Closes #233)- Remove special handling for lone
=
during AUTH; it is now treated as simple Base64-encodedb""
. This is the correct, strict interpretation of4954
mentions about=
- Test for
SMTP.__init__
behavior after taking out code that edits TLS Context - Implement mechanism to limit the number of commands sent (Closes #145)
handle_exception()
no longer gets called when the client disconnected (Closes #127, #162)- Implement & enforce line-length-limit, thus becoming Compliant with RFC 5321 § 4.5.3.1.6
- Delay all SMTP Status Code replies during
DATA
phase until the phase termination (Closes #9) - Now catches
Controller.factory()
failure duringController.start()
(Closes #212) SMTP
no longer edits user-supplied SSL Context (Closes #191)- Implement waiting for SSL setup/handshake within
STARTTLS
handler to be able to catch and handle (log) errors and to avoid session hanging around until timeout in such cases - Add session peer information to some logging output where it was missing
- Support AUTH mechanisms with dash(es) in their names (Closes #224)
- Remove some double-logging of commands sent by clients
- LMTP servers now correctly advertise extensions in reply to
LHLO
(Closes #123, #124) NOOP
now accepted beforeSTARTTLS
even ifrequire_starttls=True
(Closes #124)
- Apache License version 2.0
- Support for SMTP
AUTH
, with AUTH hooks feature - Built-in implementation for
AUTH PLAIN
andAUTH LOGIN
logic (Closes #102) - Feature to inject keyword args during server class instantiation in
Controller.factory
(potentially Closes #194, #179) - Support for Python 3.8 and 3.9.0 (also Closes #188)
- Don't strip last
\r\n
prior to terminating dot. - Slight improvement to make Test Suite more maintainable
- No more failures/DeprecationWarnings for Python 3.8 (Closes #167)
- Faster
_handle_client()
processing - Faster method access for
smtp_*
,handle_*
, andauth_*
hooks
- Unit Tests that mocked too deep, possibly masking observable internal behaviors
- Drop support for Python 3.5
- Improve the documentation on enabling
STARTTLS
. (Closes #125) - Add customizable ident field to SMTP class constructor. (Closes #131)
- Remove asyncio.coroutine decorator as it was introduced in Python 3.5.
- Add Controller docstring, explain dual-stack binding. (Closes #140)
- Gracefully handle ASCII decoding exceptions. (Closes #142)
- Fix typo.
- Improve Controller ssl_context documentation.
- Add timeout feature. (Partial fix for #145)
- Drop support for Python 3.4.
- As per RFC 5321, §4.1.4, multiple
HELO
/EHLO
commands in the same session are semantically equivalent toRSET
. (Closes #78) - As per RFC 5321, $4.1.1.9,
NOOP
takes an optional argument, which is ignored. API BREAK If you have a handler that implementshandle_NOOP()
, it previously took zero arguments but now requires a single argument. (Closes #107) - The command line options
--version
/-v
has been added to print the package's current version number. (Closes #111) - General improvements in the
Controller
class. (Closes #104) - When aiosmtpd handles a
STARTTLS
it must arrange for the original transport to be closed when the wrapped transport is closed. This fixes a hidden exception which occurs when an EOF is received on the original tranport after the connection is lost. (Closes #83) - Widen the catch of
ConnectionResetError
andCancelledError
to also catch such errors from handler methods. (Closes #110) - Added a manpage for the
aiosmtpd
command line script. (Closes #116) - Added much better support for the
HELP
. There's a new decorator called@syntax()
which you can use in derived classes to decoratesmtp_*()
methods. These then show up inHELP
responses. This also fixesHELP
responses for theLMTP
subclass. (Closes #113) - The
Controller
class now takes an optional keyword argumentssl_context
which is passed directly to the asynciocreate_server()
call.
- Release.
- Improved documentation.
- The connection peer is displayed in all INFO level logging.
- When running the test suite, you can include a
-E
option after the--
separator to boost the debugging output. - The main SMTP readline loops are now more robust against connection resets and mid-read EOFs. (Closes #62)
Proxy
handlers work withSMTP
servers regardless of the value of thedecode_data
argument.- The command line script is now installed as
aiosmtpd
instead ofsmtpd
. - The
SMTP
class now does a better job of handling Unicode, when the client does not claim to supportSMTPUTF8
but sends non-ASCII anyway. The server forces ASCII-only handling whenenable_SMTPUTF8=False
(the default) is passed to the constructor. The command line argumentsdecode_data=True
andenable_SMTPUTF8=True
are no longer mutually exclusive. - Officially support Windows. (Closes #76)
- A new handler hook API has been added which provides more flexibility but requires more responsibility (e.g. hooks must return a string status). Deprecate
SMTP.ehlo_hook()
andSMTP.rset_hook()
. - Deprecate handler
process_message()
methods. Use the new asynchronoushandle_DATA()
methods, which take a session and an envelope object. - Added the
STARTTLS
extension. Given by Konstantin Volkov. - Minor changes to the way the
Debugging
handler printsmail_options
andrcpt_options
(although the latter is still not support inSMTP
). DATA
method now respects original line endings, and passing size limits is now handled better. Given by Konstantin Volkov.- The
Controller
class has two new optional keyword arguments.ready_timeout
specifies a timeout in seconds that can be used to limit the amount of time it waits for the server to become ready. This can also be overridden with the environment variableAIOSMTPD_CONTROLLER_TIMEOUT
. (Closes #35)enable_SMTPUTF8
is passed through to theSMTP
constructor in the default factory. If you overrideController.factory()
you can passself.enable_SMTPUTF8
yourself.
- Handlers can define a
handle_tls_handshake()
method, which takes a session object, and is called if SSL is enabled during the making of the connection. (Closes #48) - Better Windows compatibility.
- Better Python 3.4 compatibility.
- Use
flufl.testing
package for nose2 and flake8 plugins. - The test suite has achieved 100% code coverage. (Closes #2)
- The SMTP server connection identifier can be changed by setting the
__ident__
attribute on theSMTP
instance. (Closes #20) - Fixed a new incompatibility with the
atpublic
library.
- Fix typo in
Message.prepare_message()
handler. The craftedX-RcptTos
header is renamed toX-RcptTo
for backward compatibility with older libraries. - Add a few hooks to make subclassing easier:
SMTP.ehlo_hook()
is called just before the final, non-continuing 250 response to allow subclasses to add additionalEHLO
sub-responses.SMTP.rset_hook()
is called just before the final 250 command to allow subclasses to provide additionalRSET
functionality.Controller.make_socket()
allows subclasses to customize the creation of the socket before binding.
- Officially support Python 3.6.
- Fix support for both IPv4 and IPv6 based on the
--listen
option. Given by Jason Coombs. (Closes #3) - Correctly handle client disconnects. Given by Konstantin vz'One Enchant.
- The SMTP class now takes an optional
hostname
argument. Use this if you want to avoid the use ofsocket.getfqdn()
. Given by Konstantin vz'One Enchant. - Close the transport and thus the connection on SMTP
QUIT
. (Closes #11) - Added an
AsyncMessage
handler. Given by Konstantin vz'One Enchant. - Add an examples/ directory.
- Flake8 clean.
- Initial release.