Spec-Zone.ru › Python 3.8

smtpd — SMTP-сервер

Исходный код: Lib/smtpd.py

Этот модуль предлагает несколько классов для реализации SMTP-серверов (серверов электронной почты).

См. также

Пакет aiosmtpd рекомендуется в качестве замены для этого модуля. Он основан на asyncio и предоставляет более простой API. smtpd следует считать устаревшим.

Наличествуют несколько реализаций сервера; одна — это общая реализация ничего не делающего, которую можно переопределить, а две другие предлагают конкретные стратегии отправки почты.

Кроме того, SMTPChannel можно расширить для реализации очень специфического поведения взаимодействия с клиентами SMTP.

Код поддерживает RFC 5321, а также расширения RFC 1870 SIZE и RFC 6531 SMTPUTF8.

Объекты SMTPServer

class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)

Создаёт новый объект SMTPServer, который связывается с локальным адресом localaddr. Он будет обрабатывать remoteaddr как ретранслятор SMTP вверх по потоку. И localaddr, и remoteaddr должны быть кортежами (хост, порт). Объект наследуется от asyncore.dispatcher, и поэтому при создании помещает себя в цикл событий asyncore.

data_size_limit задаёт максимальное количество байтов, которые будут приняты в команде DATA. Значения None или 0 означают отсутствие ограничения.

map — это карта сокетов, используемая для подключений (подходящее значение — первоначально пустой словарь). Если не указано, используется глобальная карта сокетов asyncore.

enable_SMTPUTF8 определяет, следует ли включить расширение SMTPUTF8 (как определено в RFC 6531). Значение по умолчанию — False. При True, SMTPUTF8 принимается в качестве параметра к команде MAIL и, при наличии, передаётся в process_message() в списке kwargs['mail_options']. decode_data и enable_SMTPUTF8 не могут быть установлены в значение True одновременно.

decode_data задаёт, следует ли декодировать часть данных SMTP-транзакции с помощью UTF-8. Когда decode_data равно False (по умолчанию), сервер рекламирует расширение 8BITMIME (RFC 6152), принимает параметр BODY=8BITMIME для команды MAIL и, при наличии, передаёт его в process_message() в списке kwargs['mail_options']. decode_data и enable_SMTPUTF8 не могут быть установлены в значение True одновременно.

process_message(peer, mailfrom, rcpttos, data, **kwargs)

Вызывает исключение NotImplementedError. Переопределите этот метод в подклассах, чтобы сделать что-нибудь полезное с этим сообщением. Переданный в конструктор параметр remoteaddr будет доступен как атрибут _remoteaddr. peer — адрес удалённого хоста, mailfrom — отправитель сообщения, rcpttos — получатели сообщения, а data — строка, содержащая содержимое электронного письма (которое должно быть в формате RFC 5321).

Если параметр конструктора decode_data установлен в True, аргумент data будет строкой Unicode. Если он установлен в False, это будет объект bytes.

kwargs — словарь, содержащий дополнительную информацию. Он пуст, если decode_data=True был передан как аргумент инициализации, в противном случае содержит следующие ключи:

mail_options:

список всех полученных параметров команды MAIL (элементы — строковые значения в верхнем регистре; пример: ['BODY=8BITMIME', 'SMTPUTF8']).

rcpt_options:

аналогично mail_options, но для команды RCPT. В настоящее время RCPT TO опции не поддерживаются, поэтому на данный момент это всегда будет пустой список.

Реализации process_message должны использовать подпись **kwargs для принятия произвольных ключевых аргументов, так как в будущем улучшения функций могут добавить ключи в словарь kwargs.

Возврат None запрашивает обычный 250 Ok ответ; в противном случае возвращает желаемую строку ответа в формате RFC 5321.

channel_class

Переопределите это в подклассах, чтобы использовать пользовательский SMTPChannel для управления SMTP-клиентами.

В версии 3.4: Аргумент конструктора map.

Изменено в версии 3.5: localaddr и remoteaddr теперь могут содержать IPv6-адреса.

В версии 3.5: Параметры конструктора decode_data и enable_SMTPUTF8, а также параметр kwargs для process_message() при decode_data — False.

Изменено в версии 3.6: Значение по умолчанию для decode_data теперь False.

Объекты DebuggingServer

class smtpd.DebuggingServer(localaddr, remoteaddr)

Создаёт новый отладочный сервер. Аргументы такие же, как у SMTPServer. Сообщения будут игнорироваться и выводиться на стандартный вывод.

Объекты PureProxy

class smtpd.PureProxy(localaddr, remoteaddr)

Создаёт новый сервер чистого прокси. Аргументы такие же, как у SMTPServer. Всё будет пересылаться в remoteaddr. Обратите внимание, что запуск этого варианта с большой вероятностью сделает ваш компьютер открытым ретранслятором, поэтому будьте осторожны.

Объекты MailmanProxy

class smtpd.MailmanProxy(localaddr, remoteaddr)

Создаёт новый сервер чистого прокси. Аргументы такие же, как у SMTPServer. Всё будет пересылаться в remoteaddr, если локальные конфигурации Mailman не знают об адресе, в этом случае он будет обработан через Mailman. Обратите внимание, что запуск этого варианта с большой вероятностью сделает ваш компьютер открытым ретранслятором, поэтому будьте осторожны.

Объекты SMTPChannel

class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False)

Создайте новый объект SMTPChannel, который управляет общением между сервером и одним SMTP-клиентом.

conn и addr соответствуют переменным экземпляра, описанным ниже.

data_size_limit указывает максимальное количество байтов, которые будут приняты в команде DATA. Значение None или 0 означает отсутствие ограничения.

enable_SMTPUTF8 определяет, следует ли включить расширение SMTPUTF8 (как определено в RFC 6531). По умолчанию значение False. decode_data и enable_SMTPUTF8 не могут быть установлены в значение True одновременно.

В map можно указать словарь, чтобы избежать использования глобального сокета.

decode_data указывает, следует ли декодировать часть данных SMTP-транзакции с помощью UTF-8. По умолчанию значение False. decode_data и enable_SMTPUTF8 не могут быть установлены в значение True одновременно.

Чтобы использовать собственную реализацию SMTPChannel, необходимо переопределить SMTPServer.channel_class вашего SMTPServer.

Изменено в версии 3.5: Были добавлены параметры decode_data и enable_SMTPUTF8.

Изменено в версии 3.6: По умолчанию decode_data теперь False.

У объекта SMTPChannel есть следующие переменные экземпляра:

smtp_server

Содержит SMTPServer, который породил этот канал.

conn

Содержит объект сокета, соединяющийся с клиентом.

addr

Содержит адрес клиента, второе значение, возвращаемое socket.accept.

received_lines

Содержит список строк (декодированных с помощью UTF-8), полученных от клиента. Строки содержат переводы "\r\n" строки, преобразованные в "\n".

smtp_state

Содержит текущее состояние канала. Изначально оно будет COMMAND, а затем DATA после отправки клиентом строки “DATA”.

seen_greeting

Содержит строку, содержащую приветствие, отправленное клиентом в строке “HELO”.

mailfrom

Содержит строку, содержащую адрес, указанный в строке “MAIL FROM:” от клиента.

rcpttos

Содержит список строк, содержащих адреса, указанные в строках “RCPT TO:” от клиента.

received_data

Содержит строку, содержащую все данные, отправленные клиентом во время состояния DATA, но не включая заключительную "\r\n.\r\n".

fqdn

Содержит полное доменное имя (FQDN) сервера, возвращенное socket.getfqdn().

peer

Содержит имя клиента-пир, возвращенное conn.getpeername(), где conn — conn.

Объект SMTPChannel работает путем вызова методов, названных smtp_<command> при получении строки команды от клиента. В базовый класс SMTPChannel встроенные методы для обработки следующих команд (и соответствующего реагирования):

Команда

Выполняемые действия

HELO

Принимает приветствие от клиента и сохраняет его в seen_greeting. Устанавливает сервер в режим базовых команд.

EHLO

Принимает приветствие от клиента и сохраняет его в seen_greeting. Устанавливает сервер в расширенный режим команд.

NOOP

Не выполняет никаких действий.

QUIT

Закрывает соединение должным образом.

MAIL

Принимает синтаксис “MAIL FROM:” и сохраняет предоставленный адрес как mailfrom. В расширенном режиме команд принимает атрибут SIZE из RFC 1870 и отвечает соответствующим образом на основе значения data_size_limit.

RCPT

Принимает синтаксис “RCPT TO:” и сохраняет предоставленные адреса в список rcpttos.

RSET

Сбрасывает mailfrom, rcpttos и received_data, но не приветствие.

DATA

Устанавливает внутреннее состояние в DATA и сохраняет оставшиеся строки от клиента в received_data до получения терминатора "\r\n.\r\n".

HELP

Возвращает минимальную информацию о синтаксисе команды.

VRFY

Возвращает код 252 (сервер не знает, является ли адрес действительным).

EXPN

Сообщает, что команда не реализована.

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/smtpd.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API