--- /dev/null
+# Stubs for smtpd (Python 2 and 3)\r
+import sys\r
+import socket\r
+import asyncore\r
+import asynchat\r
+\r
+from typing import Any, DefaultDict, List, Optional, Text, Tuple, Type\r
+\r
+_Address = Tuple[str, int] # (host, port)\r
+\r
+\r
+class SMTPChannel(asynchat.async_chat):\r
+ COMMAND: int\r
+ DATA: int\r
+\r
+ if sys.version_info >= (3, 3):\r
+ command_size_limits: DefaultDict[str, int]\r
+\r
+ if sys.version_info >= (3,):\r
+ smtp_server: SMTPServer\r
+ conn: socket.socket\r
+ addr: Any\r
+ received_lines: List[Text]\r
+ smtp_state: int\r
+ seen_greeting: str\r
+ mailfrom: str\r
+ rcpttos: List[str]\r
+ received_data: str\r
+ fqdn: str\r
+ peer: str\r
+\r
+ command_size_limit: int\r
+ data_size_limit: int\r
+\r
+ if sys.version_info >= (3, 5):\r
+ enable_SMTPUTF8: bool\r
+\r
+ if sys.version_info >= (3, 3):\r
+ @property\r
+ def max_command_size_limit(self) -> int: ...\r
+\r
+ if sys.version_info >= (3, 5):\r
+ def __init__(self, server: SMTPServer, conn: socket.socket, addr: Any, data_size_limit: int = ...,\r
+ map: Optional[asyncore._maptype] = ..., enable_SMTPUTF8: bool = ..., decode_data: bool = ...) -> None: ...\r
+ elif sys.version_info >= (3, 4):\r
+ def __init__(self, server: SMTPServer, conn: socket.socket, addr: Any, data_size_limit: int = ...,\r
+ map: Optional[asyncore._maptype] = ...) -> None: ...\r
+ else:\r
+ def __init__(self, server: SMTPServer, conn: socket.socket, addr: Any, data_size_limit: int = ...) -> None: ...\r
+ def push(self, msg: bytes) -> None: ...\r
+ def collect_incoming_data(self, data: bytes) -> None: ...\r
+ def found_terminator(self) -> None: ...\r
+ def smtp_HELO(self, arg: str) -> None: ...\r
+ def smtp_NOOP(self, arg: str) -> None: ...\r
+ def smtp_QUIT(self, arg: str) -> None: ...\r
+ def smtp_MAIL(self, arg: str) -> None: ...\r
+ def smtp_RCPT(self, arg: str) -> None: ...\r
+ def smtp_RSET(self, arg: str) -> None: ...\r
+ def smtp_DATA(self, arg: str) -> None: ...\r
+ if sys.version_info >= (3, 3):\r
+ def smtp_EHLO(self, arg: str) -> None: ...\r
+ def smtp_HELP(self, arg: str) -> None: ...\r
+ def smtp_VRFY(self, arg: str) -> None: ...\r
+ def smtp_EXPN(self, arg: str) -> None: ...\r
+\r
+class SMTPServer(asyncore.dispatcher):\r
+ channel_class: Type[SMTPChannel]\r
+\r
+ data_size_limit: int\r
+ enable_SMTPUTF8: bool\r
+\r
+ if sys.version_info >= (3, 5):\r
+ def __init__(self, localaddr: _Address, remoteaddr: _Address,\r
+ data_size_limit: int = ..., map: Optional[asyncore._maptype] = ...,\r
+ enable_SMTPUTF8: bool = ..., decode_data: bool = ...) -> None: ...\r
+ elif sys.version_info >= (3, 4):\r
+ def __init__(self, localaddr: _Address, remoteaddr: _Address,\r
+ data_size_limit: int = ..., map: Optional[asyncore._maptype] = ...) -> None: ...\r
+ else:\r
+ def __init__(self, localaddr: _Address, remoteaddr: _Address,\r
+ data_size_limit: int = ...) -> None: ...\r
+ def handle_accepted(self, conn: socket.socket, addr: Any) -> None: ...\r
+ def process_message(self, peer: _Address, mailfrom: str, rcpttos: List[Text], data: str, **kwargs: Any) -> Optional[str]: ...\r
+\r
+class DebuggingServer(SMTPServer): ...\r
+class PureProxy(SMTPServer): ...\r
+class MailmanProxy(PureProxy): ...\r