diff --git a/aiosmtpd/controller.py b/aiosmtpd/controller.py
index 075d74b..8a336d9 100644
--- a/aiosmtpd/controller.py
+++ b/aiosmtpd/controller.py
@@ -79,6 +79,24 @@ def get_localhost() -> Literal["::1", "127.0.0.1"]:
         raise
 
 
+def _server_to_client_ssl_ctx(server_ctx: ssl.SSLContext) -> ssl.SSLContext:
+    """
+    Given an SSLContext object with TLS_SERVER_PROTOCOL return a client
+    context that can connect to the server.
+    """
+    client_ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
+    client_ctx.options = server_ctx.options
+    client_ctx.check_hostname = False
+    # We do not verify the ssl cert for the server here simply because this
+    # is a local connection to poke at the server for it to do its lazy
+    # initialization sequence. The only purpose of this client context
+    # is to make a connection to the *local* server created using the same
+    # code. That is also the reason why we disable cert verification below
+    # and the flake8 check for the same.
+    client_ctx.verify_mode = ssl.CERT_NONE    # noqa: DUO122
+    return client_ctx
+
+
 class _FakeServer(asyncio.StreamReaderProtocol):
     """
     Returned by _factory_invoker() in lieu of an SMTP instance in case
@@ -425,7 +443,8 @@ class InetMixin(BaseController, metaclass=ABCMeta):
         with ExitStack() as stk:
             s = stk.enter_context(create_connection((hostname, self.port), 1.0))
             if self.ssl_context:
-                s = stk.enter_context(self.ssl_context.wrap_socket(s))
+                client_ctx = _server_to_client_ssl_ctx(self.ssl_context)
+                s = stk.enter_context(client_ctx.wrap_socket(s))
             s.recv(1024)
 
 
@@ -467,7 +486,8 @@ class UnixSocketMixin(BaseController, metaclass=ABCMeta):  # pragma: no-unixsock
             s: makesock = stk.enter_context(makesock(AF_UNIX, SOCK_STREAM))
             s.connect(self.unix_socket)
             if self.ssl_context:
-                s = stk.enter_context(self.ssl_context.wrap_socket(s))
+                client_ctx = _server_to_client_ssl_ctx(self.ssl_context)
+                s = stk.enter_context(client_ctx.wrap_socket(s))
             s.recv(1024)
 
 
diff --git a/setup.cfg b/setup.cfg
index 9f16d3a..63ae3a8 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -25,6 +25,7 @@ classifiers =
     Programming Language :: Python :: 3.7
     Programming Language :: Python :: 3.8
     Programming Language :: Python :: 3.9
+    Programming Language :: Python :: 3.10
     Programming Language :: Python :: Implementation :: CPython
     Programming Language :: Python :: Implementation :: PyPy
     Topic :: Communications :: Email :: Mail Transport Agents
diff --git a/tox.ini b/tox.ini
index e5ac6a3..678cd98 100644
--- a/tox.ini
+++ b/tox.ini
@@ -39,6 +39,7 @@ deps =
     pytest-print
     pytest-profiling
     pytest-sugar
+    py # needed for pytest-sugar as it doesn't declare dependency on it.
     diff_cover
 setenv =
     cov: COVERAGE_FILE={toxinidir}/_dump/.coverage
@@ -108,12 +109,14 @@ commands =
     python -m flake8 aiosmtpd setup.py housekeep.py release.py
     check-manifest -v
     pytest -v --tb=short aiosmtpd/qa
+    pytype --keep-going --jobs auto .
 deps =
     colorama
     flake8
     {[flake8_plugins]deps}
     pytest
     check-manifest
+    pytype
 
 [testenv:docs]
 basepython = python3

diff --git a/.github/workflows/unit-testing-and-coverage.yml b/.github/workflows/unit-testing-and-coverage.yml
index eb8daa1..8d4d2ef 100644
--- a/.github/workflows/unit-testing-and-coverage.yml
+++ b/.github/workflows/unit-testing-and-coverage.yml
@@ -89,7 +89,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ "macos-10.15", "ubuntu-18.04", "ubuntu-20.04", "windows-latest" ]
-        python-version: [ "3.6", "3.7", "3.8", "3.9", "pypy3" ]
+        python-version: [ "3.6", "3.7", "3.8", "3.9", "3.10", "pypy3.6" ]
     runs-on: ${{ matrix.os }}
     timeout-minutes: 15  # Slowest so far is pypy3 on MacOS, taking almost 7m
     steps:
@@ -98,7 +98,7 @@ jobs:
       with:
         fetch-depth: 0  # Required by codecov/codecov-action@v1
     - name: "Set up Python ${{ matrix.python-version }}"
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v4
       with:
         python-version: ${{ matrix.python-version }}
     - name: "Install dependencies"
diff --git a/aiosmtpd/tests/conftest.py b/aiosmtpd/tests/conftest.py
index 859d5ef..6a8c3dd 100644
--- a/aiosmtpd/tests/conftest.py
+++ b/aiosmtpd/tests/conftest.py
@@ -71,7 +71,7 @@ class Global:
 
 # If less than 1.0, might cause intermittent error if test system
 # is too busy/overloaded.
-AUTOSTOP_DELAY = 1.0
+AUTOSTOP_DELAY = 1.5
 SERVER_CRT = resource_filename("aiosmtpd.tests.certs", "server.crt")
 SERVER_KEY = resource_filename("aiosmtpd.tests.certs", "server.key")
 
diff --git a/aiosmtpd/tests/test_handlers.py b/aiosmtpd/tests/test_handlers.py
index a20df9a..d48593c 100644
--- a/aiosmtpd/tests/test_handlers.py
+++ b/aiosmtpd/tests/test_handlers.py
@@ -821,7 +821,7 @@ class TestProxyMocked:
             if rt == (
                 logger_name,
                 logging.INFO,
-                "we got some refusals: {'bart@example.com': (-1, 'ignore')}",
+                "we got some refusals: {'bart@example.com': (-1, b'ignore')}",
             ):
                 break
         else:
diff --git a/aiosmtpd/tests/test_server.py b/aiosmtpd/tests/test_server.py
index 0449310..bda6d3b 100644
--- a/aiosmtpd/tests/test_server.py
+++ b/aiosmtpd/tests/test_server.py
@@ -28,6 +28,7 @@ from aiosmtpd.controller import (
     UnixSocketUnthreadedController,
     _FakeServer,
     get_localhost,
+    _server_to_client_ssl_ctx,
 )
 from aiosmtpd.handlers import Sink
 from aiosmtpd.smtp import SMTP as Server
@@ -101,7 +102,10 @@ def safe_socket_dir() -> Generator[Path, None, None]:
 def assert_smtp_socket(controller: UnixSocketMixin) -> bool:
     assert Path(controller.unix_socket).exists()
     sockfile = controller.unix_socket
-    ssl_context = controller.ssl_context
+    if controller.ssl_context:
+        ssl_context = _server_to_client_ssl_ctx(controller.ssl_context)
+    else:
+        ssl_context = None
     with ExitStack() as stk:
         sock: socket.socket = stk.enter_context(
             socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
diff --git a/aiosmtpd/tests/test_smtp.py b/aiosmtpd/tests/test_smtp.py
index ce61af2..0907d37 100644
--- a/aiosmtpd/tests/test_smtp.py
+++ b/aiosmtpd/tests/test_smtp.py
@@ -7,6 +7,7 @@ import asyncio
 import itertools
 import logging
 import socket
+import sys
 import time
 import warnings
 from asyncio.transports import Transport
@@ -1060,7 +1061,12 @@ class TestAuthMechanisms(_CommonMethods):
         client.user = "goodlogin"
         client.password = PW
         auth_meth = getattr(client, "auth_" + mechanism)
-        if (mechanism, init_resp) == ("login", False):
+        if (mechanism, init_resp) == ("login", False) and (
+                sys.version_info < (3, 8, 9)
+                or (3, 9, 0) < sys.version_info < (3, 9, 4)):
+            # The bug with SMTP.auth_login was fixed in Python 3.10 and backported
+            # to 3.9.4 and and 3.8.9.
+            # See https://github.com/python/cpython/pull/24118 for the fixes.:
             with pytest.raises(SMTPAuthenticationError):
                 client.auth(mechanism, auth_meth, initial_response_ok=init_resp)
             client.docmd("*")
@@ -1940,12 +1946,16 @@ class TestAuthArgs:
     def test_warn_authreqnotls(self, caplog):
         with pytest.warns(UserWarning) as record:
             _ = Server(Sink(), auth_required=True, auth_require_tls=False)
-        assert len(record) == 1
-        assert (
-            record[0].message.args[0]
-            == "Requiring AUTH while not requiring TLS can lead to "
-            "security vulnerabilities!"
-        )
+        for warning in record:
+            if warning.message.args and (
+                warning.message.args[0]
+                == "Requiring AUTH while not requiring TLS can lead to "
+                "security vulnerabilities!"
+            ):
+                break
+            else:
+                pytest.xfail("Did not raise expected warning")
+
         assert caplog.record_tuples[0] == (
             "mail.log",
             logging.WARNING,

testing: Allow running pytype using tox for local testing
Currently, the qa job in Github Action used for CI doesn't match the 'qa' tox testenv and specifically skips the type checking using `pytype`.

If there isn't a reason to _not_ run pytype locally, we should probably bridge that gap and add pytype for qa jobs and _maybe_ consider using tox as the source of truth and run tests using that even in CI?
aiosmtpd/tests/test_handlers.py::TestDebugging::test_debugging aiosmtpd/tests/test_handlers.py::TestDebugging::test_debugging_bytes aiosmtpd/tests/test_handlers.py::TestDebugging::test_debugging_without_options aiosmtpd/tests/test_handlers.py::TestDebugging::test_debugging_with_options aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message[bytes] aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message[bytearray] aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message[str] aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message_err[None] aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message_err[List] aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message_err[Dict] aiosmtpd/tests/test_handlers.py::TestMessage::test_prepare_message_err[Tuple] aiosmtpd/tests/test_handlers.py::TestMessage::test_message aiosmtpd/tests/test_handlers.py::TestMessage::test_message_decoded aiosmtpd/tests/test_handlers.py::TestMessage::test_message_async aiosmtpd/tests/test_handlers.py::TestMessage::test_message_decoded_async aiosmtpd/tests/test_handlers.py::TestMailbox::test_mailbox aiosmtpd/tests/test_handlers.py::TestMailbox::test_mailbox_reset aiosmtpd/tests/test_handlers.py::TestCLI::test_debugging_no_args aiosmtpd/tests/test_handlers.py::TestCLI::test_debugging_two_args aiosmtpd/tests/test_handlers.py::TestCLI::test_debugging_stdout aiosmtpd/tests/test_handlers.py::TestCLI::test_debugging_stderr aiosmtpd/tests/test_handlers.py::TestCLI::test_debugging_bad_argument aiosmtpd/tests/test_handlers.py::TestCLI::test_sink_no_args aiosmtpd/tests/test_handlers.py::TestCLI::test_sink_any_args aiosmtpd/tests/test_handlers.py::TestCLI::test_mailbox_no_args aiosmtpd/tests/test_handlers.py::TestCLI::test_mailbox_too_many_args aiosmtpd/tests/test_handlers.py::TestCLI::test_mailbox aiosmtpd/tests/test_handlers.py::TestProxy::test_deliver_bytes aiosmtpd/tests/test_handlers.py::TestProxy::test_deliver_str aiosmtpd/tests/test_handlers.py::TestProxyMocked::test_recipients_refused aiosmtpd/tests/test_handlers.py::TestProxyMocked::test_oserror aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_HELO aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_EHLO_deprecated aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_EHLO_deprecated_warning aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_EHLO_new aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_EHLO_incompat[TooShort] aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_EHLO_incompat[TooLong] aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_MAIL aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_RCPT aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_DATA aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_AUTH aiosmtpd/tests/test_handlers.py::TestHooks::test_hook_NoHooks aiosmtpd/tests/test_handlers.py::TestDeprecation::test_process_message aiosmtpd/tests/test_handlers.py::TestDeprecation::test_process_message_async aiosmtpd/tests/test_handlers.py::TestDeprecation::test_ehlo_hook aiosmtpd/tests/test_handlers.py::TestDeprecation::test_rset_hook aiosmtpd/tests/test_server.py::TestServer::test_smtp_utf8 aiosmtpd/tests/test_server.py::TestServer::test_default_max_command_size_limit aiosmtpd/tests/test_server.py::TestServer::test_special_max_command_size_limit aiosmtpd/tests/test_server.py::TestServer::test_warn_authreq_notls aiosmtpd/tests/test_server.py::TestController::test_ready_timeout aiosmtpd/tests/test_server.py::TestController::test_factory_timeout aiosmtpd/tests/test_server.py::TestController::test_reuse_loop aiosmtpd/tests/test_server.py::TestController::test_socket_error_dupe aiosmtpd/tests/test_server.py::TestController::test_socket_error_default aiosmtpd/tests/test_server.py::TestController::test_server_attribute aiosmtpd/tests/test_server.py::TestController::test_enablesmtputf8_flag aiosmtpd/tests/test_server.py::TestController::test_serverhostname_arg aiosmtpd/tests/test_server.py::TestController::test_hostname_empty aiosmtpd/tests/test_server.py::TestController::test_hostname_none aiosmtpd/tests/test_server.py::TestController::test_testconn_raises aiosmtpd/tests/test_server.py::TestController::test_getlocalhost aiosmtpd/tests/test_server.py::TestController::test_getlocalhost_noipv6 aiosmtpd/tests/test_server.py::TestController::test_getlocalhost_6yes aiosmtpd/tests/test_server.py::TestController::test_getlocalhost_6no[99] aiosmtpd/tests/test_server.py::TestController::test_getlocalhost_6no[97] aiosmtpd/tests/test_server.py::TestController::test_getlocalhost_6inuse aiosmtpd/tests/test_server.py::TestController::test_getlocalhost_error aiosmtpd/tests/test_server.py::TestController::test_stop_default aiosmtpd/tests/test_server.py::TestController::test_stop_assert aiosmtpd/tests/test_server.py::TestController::test_stop_noassert aiosmtpd/tests/test_server.py::TestUnixSocketController::test_server_creation aiosmtpd/tests/test_server.py::TestUnixSocketController::test_server_creation_ssl aiosmtpd/tests/test_server.py::TestUnthreaded::test_unixsocket aiosmtpd/tests/test_server.py::TestUnthreaded::test_inet_loopstop aiosmtpd/tests/test_server.py::TestUnthreaded::test_inet_contstop aiosmtpd/tests/test_server.py::TestFactory::test_normal_situation aiosmtpd/tests/test_server.py::TestFactory::test_unknown_args_direct aiosmtpd/tests/test_server.py::TestFactory::test_unknown_args_inkwargs aiosmtpd/tests/test_server.py::TestFactory::test_factory_none aiosmtpd/tests/test_server.py::TestFactory::test_noexc_smtpd_missing aiosmtpd/tests/test_server.py::TestCompat::test_version aiosmtpd/tests/test_smtp.py::TestProtocol::test_honors_mail_delimiters aiosmtpd/tests/test_smtp.py::TestProtocol::test_empty_email aiosmtpd/tests/test_smtp.py::TestSMTP::test_binary[\x80FAIL\r\n] aiosmtpd/tests/test_smtp.py::TestSMTP::test_binary[\x80 aiosmtpd/tests/test_smtp.py::TestSMTP::test_helo aiosmtpd/tests/test_smtp.py::TestSMTP::test_close_then_continue aiosmtpd/tests/test_smtp.py::TestSMTP::test_helo_no_hostname aiosmtpd/tests/test_smtp.py::TestSMTP::test_helo_duplicate aiosmtpd/tests/test_smtp.py::TestSMTP::test_ehlo aiosmtpd/tests/test_smtp.py::TestSMTP::test_ehlo_duplicate aiosmtpd/tests/test_smtp.py::TestSMTP::test_ehlo_no_hostname aiosmtpd/tests/test_smtp.py::TestSMTP::test_helo_then_ehlo aiosmtpd/tests/test_smtp.py::TestSMTP::test_ehlo_then_helo aiosmtpd/tests/test_smtp.py::TestSMTP::test_noop aiosmtpd/tests/test_smtp.py::TestSMTP::test_noop_with_arg aiosmtpd/tests/test_smtp.py::TestSMTP::test_quit aiosmtpd/tests/test_smtp.py::TestSMTP::test_quit_with_args aiosmtpd/tests/test_smtp.py::TestSMTP::test_help aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[HELO] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[EHLO] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[MAIL] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[RCPT] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[DATA] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[RSET] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[NOOP] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[QUIT] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[VRFY] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_[AUTH] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_esmtp[MAIL] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_esmtp[RCPT] aiosmtpd/tests/test_smtp.py::TestSMTP::test_help_bad_arg aiosmtpd/tests/test_smtp.py::TestSMTP::test_expn aiosmtpd/tests/test_smtp.py::TestSMTP::test_no_helo[MAIL] aiosmtpd/tests/test_smtp.py::TestSMTP::test_no_helo[RCPT] aiosmtpd/tests/test_smtp.py::TestSMTP::test_no_helo[DATA] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[0] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[1] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[2] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[3] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[4] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[5] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[6] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[7] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[8] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[9] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[10] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[11] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[12] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[13] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[14] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[15] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[16] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[17] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[18] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[19] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[20] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[21] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[22] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[23] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[24] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[25] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[26] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[27] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[28] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[29] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[30] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[31] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[32] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[33] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[34] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[35] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[36] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[37] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[38] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_valid_address[39] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_smtp_errsyntax[noarg] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_smtp_errsyntax[nofrom] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_smtp_errsyntax[noaddr] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_smtp_errsyntax[params_noesmtp] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_smtp_errsyntax[malformed] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_params_esmtp[norm] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_params_esmtp[extralead] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_params_esmtp[extratail] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_from_twice aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_errsyntax[malformed] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_errsyntax[missing] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_errsyntax[badsyntax] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_errsyntax[space] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_params_unrecognized aiosmtpd/tests/test_smtp.py::TestSMTP::test_bpo27931fix_smtp aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_invalid_address[0] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_invalid_address[1] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_invalid_address[0] aiosmtpd/tests/test_smtp.py::TestSMTP::test_mail_esmtp_invalid_address[1] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_no_mail aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_smtp_errsyntax[noarg] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_smtp_errsyntax[noto] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_smtp_errsyntax[noaddr] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_smtp_errsyntax[params] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_smtp_errsyntax[malformed] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_esmtp_errsyntax[noarg] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_esmtp_errsyntax[noto] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_esmtp_errsyntax[noaddr] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_esmtp_errsyntax[badparams] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_esmtp_errsyntax[malformed] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_unknown_params aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[0] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[1] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[2] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[3] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[4] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[5] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[6] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[7] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[8] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[9] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[10] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[11] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[12] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[13] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[14] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[15] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[16] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[17] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[18] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[19] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[20] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[21] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[22] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[23] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[24] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[25] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[26] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[27] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[28] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[29] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[30] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[31] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[32] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[33] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[34] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[35] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[36] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[37] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[38] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[39] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[40] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[41] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_valid_address[42] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_invalid_address[0] aiosmtpd/tests/test_smtp.py::TestSMTP::test_rcpt_invalid_address[1] aiosmtpd/tests/test_smtp.py::TestSMTP::test_bpo27931fix_esmtp aiosmtpd/tests/test_smtp.py::TestSMTP::test_rset aiosmtpd/tests/test_smtp.py::TestSMTP::test_rset_with_arg aiosmtpd/tests/test_smtp.py::TestSMTP::test_vrfy aiosmtpd/tests/test_smtp.py::TestSMTP::test_vrfy_no_arg aiosmtpd/tests/test_smtp.py::TestSMTP::test_vrfy_not_address aiosmtpd/tests/test_smtp.py::TestSMTP::test_data_no_rcpt aiosmtpd/tests/test_smtp.py::TestSMTP::test_data_354 aiosmtpd/tests/test_smtp.py::TestSMTP::test_data_invalid_params aiosmtpd/tests/test_smtp.py::TestSMTP::test_empty_command aiosmtpd/tests/test_smtp.py::TestSMTP::test_too_long_command aiosmtpd/tests/test_smtp.py::TestSMTP::test_way_too_long_command aiosmtpd/tests/test_smtp.py::TestSMTP::test_unknown_command aiosmtpd/tests/test_smtp.py::TestSMTPNonDecoding::test_mail_invalid_body_param aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_no_ehlo aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_helo aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_not_enough_values aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_already_authenticated aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_auth_individually aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_rset_maintain_authenticated aiosmtpd/tests/test_smtp.py::TestSMTPAuth::test_auth_loginteract_warning aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_ehlo aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_not_supported_mechanism[GSSAPI] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_not_supported_mechanism[DIGEST-MD5] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_not_supported_mechanism[MD5] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_not_supported_mechanism[CRAM-MD5] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_custom_mechanism aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_disabled_mechanism aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_byclient[login-True] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_byclient[login-False] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_byclient[plain-True] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_byclient[plain-False] aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_bad_base64_encoding aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_bad_base64_length aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_too_many_values aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_bad_username aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_bad_password aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_empty aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_good_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain1_goodcreds_sanitized_log aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain2_good_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain2_bad_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain2_no_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain2_abort aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_plain2_bad_base64_encoding aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login2_bad_base64 aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login2_good_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_good_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_bad_base64 aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_bad_username aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_bad_password aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_empty_credentials aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_abort_username aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_login3_abort_password aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_DENYFALSE aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_DENYMISSING aiosmtpd/tests/test_smtp.py::TestAuthMechanisms::test_NONE aiosmtpd/tests/test_smtp.py::TestAuthenticator::test_success aiosmtpd/tests/test_smtp.py::TestAuthenticator::test_fail_withmesg aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_help_unauthenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_help_authenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_vrfy_unauthenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_mail_unauthenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_rcpt_unauthenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_rcpt_nomail_authenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_data_unauthenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_data_authenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_vrfy_authenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_mail_authenticated aiosmtpd/tests/test_smtp.py::TestRequiredAuthentication::test_data_norcpt_authenticated aiosmtpd/tests/test_smtp.py::TestResetCommands::test_helo aiosmtpd/tests/test_smtp.py::TestResetCommands::test_ehlo aiosmtpd/tests/test_smtp.py::TestResetCommands::test_rset aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_mail_with_size_too_large aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_mail_with_compatible_smtputf8 aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_mail_with_unrequited_smtputf8 aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_mail_with_incompatible_smtputf8 aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_mail_invalid_body aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_esmtp_no_size_limit aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_process_message_error aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_too_long_message_body aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_dots_escaped aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_unexpected_errors aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_unexpected_errors_unhandled aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_unexpected_errors_custom_response aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_exception_handler_exception aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_exception_handler_undescribable aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_exception_handler_multiple_connections_lost aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_bad_encodings aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_data_line_too_long aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_long_line_double_count aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_long_line_leak aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_too_long_body_delay_error aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_too_long_body_then_too_long_lines aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_too_long_line_delay_error aiosmtpd/tests/test_smtp.py::TestSMTPWithController::test_too_long_lines_then_too_long_body aiosmtpd/tests/test_smtp.py::TestCustomization::test_custom_hostname aiosmtpd/tests/test_smtp.py::TestCustomization::test_default_greeting aiosmtpd/tests/test_smtp.py::TestCustomization::test_custom_greeting aiosmtpd/tests/test_smtp.py::TestCustomization::test_mail_invalid_body_param aiosmtpd/tests/test_smtp.py::TestCustomization::test_limitlocalpart aiosmtpd/tests/test_smtp.py::TestClientCrash::test_connection_reset_during_DATA aiosmtpd/tests/test_smtp.py::TestClientCrash::test_connection_reset_during_command aiosmtpd/tests/test_smtp.py::TestClientCrash::test_connection_reset_in_long_command aiosmtpd/tests/test_smtp.py::TestClientCrash::test_close_in_command aiosmtpd/tests/test_smtp.py::TestClientCrash::test_close_in_command_2 aiosmtpd/tests/test_smtp.py::TestClientCrash::test_close_in_long_command aiosmtpd/tests/test_smtp.py::TestClientCrash::test_close_in_data aiosmtpd/tests/test_smtp.py::TestClientCrash::test_sockclose_after_helo aiosmtpd/tests/test_smtp.py::TestStrictASCII::test_ehlo aiosmtpd/tests/test_smtp.py::TestStrictASCII::test_bad_encoded_param aiosmtpd/tests/test_smtp.py::TestStrictASCII::test_mail_param aiosmtpd/tests/test_smtp.py::TestStrictASCII::test_data aiosmtpd/tests/test_smtp.py::TestSleepingHandler::test_close_after_helo aiosmtpd/tests/test_smtp.py::TestTimeout::test_timeout aiosmtpd/tests/test_smtp.py::TestAuthArgs::test_warn_authreqnotls aiosmtpd/tests/test_smtp.py::TestAuthArgs::test_log_authmechanisms aiosmtpd/tests/test_smtp.py::TestAuthArgs::test_authmechname_decorator_badname[has aiosmtpd/tests/test_smtp.py::TestAuthArgs::test_authmechname_decorator_badname[has.dot] aiosmtpd/tests/test_smtp.py::TestAuthArgs::test_authmechname_decorator_badname[has/slash] aiosmtpd/tests/test_smtp.py::TestAuthArgs::test_authmechname_decorator_badname[has\\backslash] aiosmtpd/tests/test_smtp.py::TestLimits::test_limit_wrong_type aiosmtpd/tests/test_smtp.py::TestLimits::test_limit_wrong_value_type aiosmtpd/tests/test_smtp.py::TestLimits::test_all_limit_15 aiosmtpd/tests/test_smtp.py::TestLimits::test_different_limits aiosmtpd/tests/test_smtp.py::TestLimits::test_different_limits_custom_default aiosmtpd/tests/test_smtp.py::TestLimits::test_limit_bogus aiosmtpd/tests/test_smtp.py::TestSanitize::test_loginpassword aiosmtpd/tests/test_smtp.py::TestSanitize::test_authresult