Python Glossary English

все Python 3до 3.12Удалено из стандартной библиотекипонятие

smtpd

удалённые модули

Модуль с простым SMTP-сервером на asyncore для приёма почты. Удалён в Python 3.12 — используйте пакет aiosmtpd или свой сервер на asyncio.

Синтаксис

import smtpd  # до 3.12

smtpd давал SMTPServer и DebuggingServer: python -m smtpd -n -c DebuggingServer поднимал сервер, печатавший входящие письма, — удобно для тестов отправки. Модуль стоял на asyncore и вместе с ним устарел в Python 3.6 и по PEP 594 удалён в 3.12. Как переписать: для тестов почты возьмите сторонний пакет aiosmtpd (python -m aiosmtpd -n — тот же отладочный сервер), его держат вне стандартной библиотеки. Если нужен минимальный свой сервер, пишите его на asyncio: asyncio.start_server() и разбор команд построчно через reader.readline(). Отправка писем по-прежнему в smtplib.

Примеры

# Python 3.12+
try:
    import smtpd
except ModuleNotFoundError as e:
    print(type(e).__name__)  # → ModuleNotFoundError
# Python 3.12+
import asyncio, socket
async def handle(reader, writer):
    writer.write(b'220 ready\r\n')
    line = await reader.readline()
    if line.startswith(b'HELO'):
        writer.write(b'250 hello\r\n')
    await writer.drain()
    writer.close()
async def main():
    a, b = socket.socketpair()
    server_side = await asyncio.open_connection(sock=a)
    reader, writer = await asyncio.open_connection(sock=b)
    task = asyncio.create_task(handle(*server_side))
    print(await reader.readline())  # → b'220 ready\r\n'
    writer.write(b'HELO me\r\n')
    print(await reader.readline())  # → b'250 hello\r\n'
    await task
    writer.close()
asyncio.run(main())

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности