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

smtpd.md

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

1> **Источник:** https://python-all.ru/3.4/library/smtpd.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.18. [`smtpd`](https://python-all.ru/3.4/library/smtpd.html#module-smtpd) – SMTP-сервер89**Исходный код:** [Lib/smtpd.py](https://python-all.ru/src/3.4/Lib/smtpd.py)1011---1213Этот модуль предоставляет несколько классов для реализации SMTP-серверов (электронной почты).1415> **См. также**16>17> Пакет [aiosmtpd](https://python-all.ru/3.4/library/smtpd.html) рекомендуется в качестве замены этого модуля. Он основан на [`asyncio`](https://python-all.ru/3.4/library/asyncio.html#module-asyncio) и предоставляет более простой API. [`smtpd`](https://python-all.ru/3.4/library/smtpd.html#module-smtpd) следует считать устаревшим.1819Предусмотрено несколько реализаций сервера; одна из них – универсальная реализация, которая ничего не делает и может быть переопределена, в то время как две другие предлагают конкретные стратегии отправки почты.2021Кроме того, SMTPChannel может быть расширен для реализации очень специфического поведения взаимодействия с SMTP-клиентами.2223Код поддерживает [**RFC 5321**](https://python-all.ru/3.4/library/smtpd.html), а также расширение SIZE [**RFC 1870**](https://python-all.ru/3.4/library/smtpd.html).2425## 21.18.1. Объекты SMTPServer2627#### `class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None)`2829Создаёт новый объект [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer), который привязывается к локальному адресу *localaddr*. Он будет рассматривать *remoteaddr* как вышестоящий SMTP-ретранслятор. Он наследуется от [`asyncore.dispatcher`](https://python-all.ru/3.4/library/asyncore.html#asyncore.dispatcher) и, таким образом, при создании встраивается в цикл событий [`asyncore`](https://python-all.ru/3.4/library/asyncore.html#module-asyncore).3031*data\_size\_limit* задаёт максимальное количество байт, которое будет принято в команде `DATA`. Значение `None` или `0` означает отсутствие ограничения.3233Словарь можно указать в *map*, чтобы избежать использования глобальной карты сокетов.3435#### `process_message(peer, mailfrom, rcpttos, data)`3637Вызывает исключение [`NotImplementedError`](https://python-all.ru/3.4/library/exceptions.html#NotImplementedError). Переопределите этот метод в подклассах, чтобы выполнять с этим сообщением полезные действия. Всё, что было передано в конструктор как *remoteaddr*, будет доступно как `_remoteaddr` атрибут. *peer* – адрес удалённого хоста, *mailfrom* – отправитель конверта, *rcpttos* – получатели конверта, а *data* – строка с содержимым письма (должна быть в формате [**RFC 2822**](https://python-all.ru/3.4/library/smtpd.html) формат).3839#### `channel_class`4041Переопределите этот метод в подклассах, чтобы использовать собственный [`SMTPChannel`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel) для управления SMTP-клиентами.4243Изменено в версии 3.4: Был добавлен аргумент *map*.4445## 21.18.2. Объекты DebuggingServer4647#### `class smtpd.DebuggingServer(localaddr, remoteaddr)`4849Создаёт новый отладочный сервер. Аргументы такие же, как у [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer). Сообщения будут отброшены и выведены в stdout.5051## 21.18.3. Объекты PureProxy5253#### `class smtpd.PureProxy(localaddr, remoteaddr)`5455Создаёт новый чистый прокси-сервер. Аргументы такие же, как у [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer). Всё будет ретранслироваться на *remoteaddr*. Имейте в виду, что запуск этого сервера может превратить вас в открытый ретранслятор, поэтому будьте осторожны.5657## 21.18.4. Объекты MailmanProxy5859#### `class smtpd.MailmanProxy(localaddr, remoteaddr)`6061Создаёт новый чистый прокси-сервер. Аргументы такие же, как у [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer). Всё будет ретранслироваться на *remoteaddr*, если только локальные настройки mailman не знают об адресе – в этом случае он будет обработан через mailman. Имейте в виду, что запуск этого сервера может превратить вас в открытый ретранслятор, поэтому будьте осторожны.6263## 21.18.5. Объекты SMTPChannel6465#### `class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None))`6667Создаёт новый объект [`SMTPChannel`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel), который управляет обменом данными между сервером и одним SMTP-клиентом.6869*conn* и *addr* описаны ниже в переменных экземпляра.7071*data\_size\_limit* задаёт максимальное количество байт, которое будет принято в команде `DATA`. Значение `None` или `0` означает отсутствие ограничения.7273Словарь можно указать в *map*, чтобы избежать использования глобальной карты сокетов.7475Чтобы использовать собственную реализацию SMTPChannel, необходимо переопределить атрибут [`SMTPServer.channel_class`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer.channel_class) вашего [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer).7677[`SMTPChannel`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel) имеет следующие переменные экземпляра:7879#### `smtp_server`8081Хранит [`SMTPServer`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPServer), который породил этот канал.8283#### `conn`8485Содержит объект сокета, подключённого к клиенту.8687#### `addr`8889Хранит адрес клиента – второе значение, возвращаемое [`socket.accept`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept)9091#### `received_lines`9293Хранит список строк (декодированных в UTF-8), полученных от клиента. Строки имеют окончание `"\r\n"`, преобразованное в `"\n"`.9495#### `smtp_state`9697Хранит текущее состояние канала. Изначально это будет `COMMAND`, а после того, как клиент отправит строку «DATA» – `DATA`.9899#### `seen_greeting`100101Содержит строку с приветствием, отправленным клиентом в его «HELO».102103#### `mailfrom`104105Содержит строку с адресом, указанным в строке «MAIL FROM:» от клиента.106107#### `rcpttos`108109Содержит список строк с адресами, указанными в строках «RCPT TO:» от клиента.110111#### `received_data`112113Содержит строку со всеми данными, отправленными клиентом во время состояния DATA, до завершающей последовательности `"\r\n.\r\n"` (но не включая её).114115#### `fqdn`116117Содержит полное доменное имя сервера, возвращаемое функцией [`socket.getfqdn()`](https://python-all.ru/3.4/library/socket.html#socket.getfqdn).118119#### `peer`120121Содержит имя клиентского узла, возвращаемое `conn.getpeername()`, где `conn` – это [`conn`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.conn).122123Класс [`SMTPChannel`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel) работает, вызывая методы с именами `smtp_<command>` при получении командной строки от клиента. В базовый класс [`SMTPChannel`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel) встроены методы для обработки следующих команд (и соответствующих ответов на них):124125| Команда | Выполняемое действие |126| --- | --- |127| HELO | Принимает приветствие от клиента и сохраняет его в [`seen_greeting`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.seen_greeting). Переводит сервер в базовый режим команд. |128| EHLO | Принимает приветствие от клиента и сохраняет его в [`seen_greeting`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.seen_greeting). Переводит сервер в расширенный режим команд. |129| NOOP | Не выполняет никаких действий. |130| QUIT | Корректно закрывает соединение. |131| MAIL | Принимает синтаксис "MAIL FROM:" и сохраняет переданный адрес как [`mailfrom`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.mailfrom). В расширенном режиме команд принимает атрибут SIZE из [**RFC 1870**](https://python-all.ru/3.4/library/smtpd.html) и соответствующим образом отвечает в зависимости от значения *data\_size\_limit*. |132| RCPT | Принимает синтаксис "RCPT TO:" и сохраняет переданные адреса в список [`rcpttos`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.rcpttos). |133| RSET | Сбрасывает [`mailfrom`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.mailfrom), [`rcpttos`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.rcpttos) и [`received_data`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.received_data), но не приветствие. |134| DATA | Устанавливает внутреннее состояние в `DATA` и сохраняет остальные строки от клиента в [`received_data`](https://python-all.ru/3.4/library/smtpd.html#smtpd.SMTPChannel.received_data) до получения терминатора `"\r\n.\r\n"`. |135| HELP | Возвращает минимальную информацию о синтаксисе команд |136| VRFY | Возвращает код 252 (сервер не знает, действителен ли адрес) |137| EXPN | Сообщает, что команда не реализована. |138