Spec-Zone.ru › Python 3.6

smtpd — SMTP-сервер

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

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

См. также

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

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

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

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

21.18.1. Объекты 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.

21.18.2. Объекты DebuggingServer

class smtpd.DebuggingServer(localaddr, remoteaddr)

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

21.18.3. Объекты PureProxy

class smtpd.PureProxy(localaddr, remoteaddr)

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

21.18.4. Объекты MailmanProxy

class smtpd.MailmanProxy(localaddr, remoteaddr)

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

21.18.5. Объекты 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

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

peer

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

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

Команда

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

HELO

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

EHLO

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

NOOP

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

QUIT

Закрывает соединение надёжно.

MAIL

Принимает синтаксис «MAIL FROM:», сохраняет предоставленный адрес в качестве mailfrom. В расширенном режиме команд принимает атрибут RFC 1870 SIZE и отвечает соответствующим образом на основании значения 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/smtpd.html

Spec-Zone.ru

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