===================
 NEWS for aiosmtpd
===================

1.2.4 (2021-01-24)
==================

Added
-----
* Optional (default-disabled) logging of ``AUTH`` interaction -- with severe warnings

Fixed/Improved
--------------
* ``AUTH`` command line now sanitized before logging (Closes #233)
* Remove special handling for lone ``=`` during AUTH;
  it is now treated as simple Base64-encoded ``b""``.
  This is the correct, strict interpretation of :rfc:`4954` mentions about ``=``


1.2.3 (2021-01-14)
==================

Added
-----
* Test for ``SMTP.__init__`` behavior after taking out code that edits TLS Context
* Implement mechanism to limit the number of commands sent (Closes #145)

Fixed/Improved
--------------
* ``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 during ``Controller.start()`` (Closes #212)
* :class:`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 before ``STARTTLS`` even if ``require_starttls=True`` (Closes #124)


1.2.2 (2020-11-08)
==================

Added
-----
* **Apache License version 2.0**
* Support for SMTP ``AUTH``, with AUTH hooks feature
* Built-in implementation for ``AUTH PLAIN`` and ``AUTH 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)

Fixed/Improved
--------------
* 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_*``, and ``auth_*`` hooks

Removed
-------
* Unit Tests that mocked too deep, possibly masking observable internal behaviors
* Drop support for Python 3.5


1.2 (2018-09-01)
================
* 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)


1.1 (2017-07-06)
================
* Drop support for Python 3.4.
* As per RFC 5321, §4.1.4, multiple ``HELO`` / ``EHLO`` commands in the same
  session are semantically equivalent to ``RSET``.  (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 implements
  ``handle_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`` and ``CancelledError`` 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 decorate ``smtp_*()``
  methods.  These then show up in ``HELP`` responses.  This also fixes
  ``HELP`` responses for the ``LMTP`` subclass.  (Closes #113)
* The ``Controller`` class now takes an optional keyword argument
  ``ssl_context`` which is passed directly to the asyncio ``create_server()``
  call.

1.0 (2017-05-15)
================
* Release.

1.0rc1 (2017-05-12)
===================
* Improved documentation.

1.0b1 (2017-05-07)
==================
* 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 with ``SMTP`` servers regardless of the value of the
  ``decode_data`` argument.
* The command line script is now installed as ``aiosmtpd`` instead of
  ``smtpd``.
* The ``SMTP`` class now does a better job of handling Unicode, when the
  client does not claim to support ``SMTPUTF8`` but sends non-ASCII anyway.
  The server forces ASCII-only handling when ``enable_SMTPUTF8=False`` (the
  default) is passed to the constructor.  The command line arguments
  ``decode_data=True`` and ``enable_SMTPUTF8=True`` are no longer mutually
  exclusive.
* Officially support Windows.  (Closes #76)

1.0a5 (2017-04-06)
==================
* 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()`` and ``SMTP.rset_hook()``.
* Deprecate handler ``process_message()`` methods.  Use the new asynchronous
  ``handle_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 prints ``mail_options``
  and ``rcpt_options`` (although the latter is still not support in ``SMTP``).
* ``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 variable
    ``AIOSMTPD_CONTROLLER_TIMEOUT``. (Closes #35)
  - ``enable_SMTPUTF8`` is passed through to the ``SMTP`` constructor in the
    default factory.  If you override ``Controller.factory()`` you can pass
    ``self.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)

1.0a4 (2016-11-29)
==================
* The SMTP server connection identifier can be changed by setting the
  ``__ident__`` attribute on the ``SMTP`` instance.  (Closes #20)
* Fixed a new incompatibility with the ``atpublic`` library.

1.0a3 (2016-11-24)
==================
* Fix typo in ``Message.prepare_message()`` handler.  The crafted
  ``X-RcptTos`` header is renamed to ``X-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 additional ``EHLO`` sub-responses.
  * ``SMTP.rset_hook()`` is called just before the final 250 command to allow
    subclasses to provide additional ``RSET`` functionality.
  * ``Controller.make_socket()`` allows subclasses to customize the creation
    of the socket before binding.

1.0a2 (2016-11-22)
==================
* 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 of ``socket.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.

1.0a1 (2015-10-19)
==================
* Initial release.
