Документация Python неофициальный перевод

smtpd.md

172 строк · 17.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.10/library/smtpd.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`smtpd`](https://python-all.ru/3.10/library/smtpd.html#module-smtpd) – SMTP-сервер89**Исходный код:** [Lib/smtpd.py](https://python-all.ru/src/3.10/Lib/smtpd.py)1011---1213Этот модуль предоставляет несколько классов для реализации SMTP-серверов (электронной почты).1415Устарело с версии 3.6: [`smtpd`](https://python-all.ru/3.10/library/smtpd.html#module-smtpd) будет удалён в Python 3.12 (подробнее см. [**PEP 594**](https://python-all.ru/3.10/library/smtpd.html)). [aiosmtpd](https://python-all.ru/3.10/library/smtpd.html) – рекомендуемая замена этого модуля. Он основан на [`asyncio`](https://python-all.ru/3.10/library/asyncio.html#module-asyncio) и предоставляет более простой API.1617Предусмотрено несколько реализаций сервера; одна из них – универсальная реализация, которая ничего не делает и может быть переопределена, в то время как две другие предлагают конкретные стратегии отправки почты.1819Кроме того, SMTPChannel может быть расширен для реализации очень специфического поведения взаимодействия с SMTP-клиентами.2021Код поддерживает [**RFC 5321**](https://python-all.ru/3.10/library/smtpd.html), а также расширения [**RFC 1870**](https://python-all.ru/3.10/library/smtpd.html) SIZE и [**RFC 6531**](https://python-all.ru/3.10/library/smtpd.html) SMTPUTF8.2223## Объекты SMTPServer2425#### `class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)`2627Создаёт новый объект [`SMTPServer`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer), который привязывается к локальному адресу *localaddr*. Он будет рассматривать *remoteaddr* как вышестоящий SMTP-ретранслятор. Оба *localaddr* и *remoteaddr* должны быть кортежем [(host, port)](https://python-all.ru/3.10/library/socket.html#host-port) . Объект наследуется от [`asyncore.dispatcher`](https://python-all.ru/3.10/library/asyncore.html#asyncore.dispatcher) и поэтому встраивается в цикл событий [`asyncore`](https://python-all.ru/3.10/library/asyncore.html#module-asyncore) при создании.2829*data\_size\_limit* задаёт максимальное количество байт, которое будет принято в команде `DATA`. Значение `None` или `0` означает отсутствие ограничения.3031*map* – это карта сокетов для использования соединениями (в качестве подходящего значения можно использовать изначально пустой словарь). Если не указано, используется глобальная карта сокетов [`asyncore`](https://python-all.ru/3.10/library/asyncore.html#module-asyncore).3233*enable\_SMTPUTF8* определяет, должно ли быть включено расширение `SMTPUTF8` (как определено в [**RFC 6531**](https://python-all.ru/3.10/library/smtpd.html)). По умолчанию `False`. Когда `True`, `SMTPUTF8` принимается как параметр команды `MAIL` и при наличии передаётся в [`process_message()`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer.process_message) в списке `kwargs['mail_options']`. *decode\_data* и *enable\_SMTPUTF8* не могут быть одновременно установлены в `True`.3435*decode\_data* определяет, должна ли часть данных SMTP-транзакции быть декодирована с использованием UTF-8. Когда *decode\_data* равно `False` (по умолчанию), сервер объявляет расширение `8BITMIME` ([**RFC 6152**](https://python-all.ru/3.10/library/smtpd.html)), принимает параметр `BODY=8BITMIME` команды `MAIL` и при наличии передаёт его в [`process_message()`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer.process_message) в списке `kwargs['mail_options']`. *decode\_data* и *enable\_SMTPUTF8* не могут быть одновременно установлены в `True`.3637#### `process_message(peer, mailfrom, rcpttos, data, **kwargs)`3839Вызывает исключение [`NotImplementedError`](https://python-all.ru/3.10/library/exceptions.html#NotImplementedError). Переопределите этот метод в подклассах, чтобы сделать что-то полезное с этим сообщением. То, что было передано в конструктор как *remoteaddr*, будет доступно как атрибут `_remoteaddr`. *peer* – адрес удалённого хоста, *mailfrom* – отправитель конверта, *rcpttos* – получатели конверта, а *data* – строка, содержащая содержимое электронного письма (которое должно быть в формате [**RFC 5321**](https://python-all.ru/3.10/library/smtpd.html) ).4041Если ключевое слово конструктора *decode\_data* установлено в `True`, аргумент *data* будет строкой Unicode. Если установлено в `False`, он будет объектом bytes.4243*kwargs* – это словарь, содержащий дополнительную информацию. Он пуст, если `decode_data=True` был передан как аргумент инициализации, в противном случае он содержит следующие ключи:4445> ***mail\_options*:**46>47> список всех полученных параметров команды `MAIL` (элементы – строки в верхнем регистре; пример: `['BODY=8BITMIME', 'SMTPUTF8']`).48>49> ***rcpt\_options*:**50>51> то же, что и *mail\_options*, но для команды `RCPT`. В настоящее время не поддерживается ни один `RCPT TO` параметр, поэтому пока это всегда будет пустой список.5253Реализации `process_message` должны использовать сигнатуру `**kwargs` для принятия произвольных именованных аргументов, поскольку будущие улучшения могут добавлять ключи в словарь kwargs.5455Верните `None` для запроса обычного ответа `250 Ok`; в противном случае верните нужную строку ответа в формате [**RFC 5321**](https://python-all.ru/3.10/library/smtpd.html).5657#### `channel_class`5859Переопределите это в подклассах, чтобы использовать собственный [`SMTPChannel`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel) для управления SMTP-клиентами.6061Новое в версии 3.4: Аргумент конструктора *map*.6263Изменено в версии 3.5: *localaddr* и *remoteaddr* теперь могут содержать IPv6-адреса.6465Новое в версии 3.5: Параметры конструктора *decode\_data* и *enable\_SMTPUTF8*, а также параметр *kwargs* для [`process_message()`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer.process_message), когда *decode\_data* равно `False`.6667Изменено в версии 3.6: Теперь *decode\_data* по умолчанию имеет значение `False`.6869## Объекты DebuggingServer7071#### `class smtpd.DebuggingServer(localaddr, remoteaddr)`7273Создаёт новый отладочный сервер. Аргументы – как в [`SMTPServer`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer). Сообщения будут отбрасываться и выводиться на stdout.7475## Объекты PureProxy7677#### `class smtpd.PureProxy(localaddr, remoteaddr)`7879Создаёт новый сервер-чистый прокси. Аргументы – как в [`SMTPServer`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer). Всё будет пересылаться на *remoteaddr*. Имейте в виду, что его запуск с большой вероятностью сделает вас открытым ретранслятором, поэтому будьте осторожны.8081## Объекты MailmanProxy8283#### `class smtpd.MailmanProxy(localaddr, remoteaddr)`8485Устарело с версии 3.9, будет удалено в версии 3.11: [`MailmanProxy`](https://python-all.ru/3.10/library/smtpd.html#smtpd.MailmanProxy) устарел, так как зависит от модуля `Mailman`, который больше не существует, и поэтому уже не работает.8687Создаёт новый чистый прокси-сервер. Аргументы те же, что и в [`SMTPServer`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer). Всё будет перенаправляться на *remoteaddr*, если только локальные настройки mailman не знают об адресе – в этом случае обработка пойдёт через mailman. Учтите, что запуск этого сервера с большой вероятностью превратит вас в открытый релей, так что будьте осторожны.8889## Объекты SMTPChannel9091#### `class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)`9293Создаёт новый объект [`SMTPChannel`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel), управляющий взаимодействием между сервером и одним SMTP-клиентом.9495*conn* и *addr* описаны ниже в переменных экземпляра.9697*data\_size\_limit* задаёт максимальное количество байт, которое будет принято в команде `DATA`. Значение `None` или `0` означает отсутствие ограничения.9899*enable\_SMTPUTF8* определяет, следует ли включить расширение `SMTPUTF8` (как определено в [**RFC 6531**](https://python-all.ru/3.10/library/smtpd.html)). По умолчанию `False`. *decode\_data* и *enable\_SMTPUTF8* не могут одновременно иметь значение `True`.100101Словарь можно указать в *map*, чтобы избежать использования глобальной карты сокетов.102103*decode\_data* указывает, следует ли декодировать данные SMTP-транзакции с использованием UTF-8. По умолчанию `False`. *decode\_data* и *enable\_SMTPUTF8* не могут одновременно иметь значение `True`.104105Чтобы использовать собственную реализацию SMTPChannel, нужно переопределить [`SMTPServer.channel_class`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer.channel_class) вашего [`SMTPServer`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer).106107Изменено в версии 3.5: Добавлены параметры *decode\_data* и *enable\_SMTPUTF8*.108109Изменено в версии 3.6: Теперь *decode\_data* по умолчанию имеет значение `False`.110111[`SMTPChannel`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel) имеет следующие переменные экземпляра:112113#### `smtp_server`114115Содержит объект [`SMTPServer`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPServer), создавший этот канал.116117#### `conn`118119Содержит объект сокета, подключённого к клиенту.120121#### `addr`122123Содержит адрес клиента – второе значение, возвращаемое [`socket.accept`](https://python-all.ru/3.10/library/socket.html#socket.socket.accept)124125#### `received_lines`126127Содержит список строк (декодированных в UTF-8), полученных от клиента. Строки имеют окончание `"\r\n"`, преобразованное в `"\n"`.128129#### `smtp_state`130131Содержит текущее состояние канала. Изначально это `COMMAND`, а затем `DATA` после того, как клиент отправит строку «DATA».132133#### `seen_greeting`134135Содержит строку с приветствием, отправленным клиентом в его «HELO».136137#### `mailfrom`138139Содержит строку с адресом, указанным в строке «MAIL FROM:» от клиента.140141#### `rcpttos`142143Содержит список строк с адресами, указанными в строках «RCPT TO:» от клиента.144145#### `received_data`146147Содержит строку со всеми данными, отправленными клиентом в состоянии DATA, включая всё до завершающего `"\r\n.\r\n"`, но не включая его.148149#### `fqdn`150151Содержит полное доменное имя сервера, возвращаемое [`socket.getfqdn()`](https://python-all.ru/3.10/library/socket.html#socket.getfqdn).152153#### `peer`154155Содержит имя клиента, возвращаемое `conn.getpeername()`, где `conn` – это [`conn`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.conn).156157[`SMTPChannel`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel) работает, вызывая методы с именем `smtp_<command>` при получении командной строки от клиента. В базовый класс [`SMTPChannel`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel) встроены методы для обработки следующих команд (и соответствующих ответов на них):158159| Команда | Выполняемое действие |160| --- | --- |161| HELO | Принимает приветствие от клиента и сохраняет его в [`seen_greeting`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.seen_greeting). Переводит сервер в режим базовых команд. |162| EHLO | Принимает приветствие от клиента и сохраняет его в [`seen_greeting`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.seen_greeting). Переводит сервер в расширенный режим команд. |163| NOOP | Не выполняет никаких действий. |164| QUIT | Корректно закрывает соединение. |165| MAIL | Принимает синтаксис «MAIL FROM:» и сохраняет указанный адрес как [`mailfrom`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.mailfrom). В расширенном режиме команд принимает атрибут SIZE [**RFC 1870**](https://python-all.ru/3.10/library/smtpd.html) и отвечает соответствующим образом в зависимости от значения *data\_size\_limit*. |166| RCPT | Принимает синтаксис «RCPT TO:» и сохраняет указанные адреса в списке [`rcpttos`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.rcpttos). |167| RSET | Сбрасывает [`mailfrom`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.mailfrom), [`rcpttos`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.rcpttos) и [`received_data`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.received_data), но не приветствие. |168| DATA | Устанавливает внутреннее состояние в `DATA` и сохраняет остальные строки от клиента в [`received_data`](https://python-all.ru/3.10/library/smtpd.html#smtpd.SMTPChannel.received_data) до получения терминатора `"\r\n.\r\n"`. |169| HELP | Возвращает минимальную информацию о синтаксисе команд |170| VRFY | Возвращает код 252 (сервер не знает, действителен ли адрес) |171| EXPN | Сообщает, что команда не реализована. |172