все 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Сообщить о неточности