Spec-Zone.ru › Python 3.7

smtpd — SMTP-сервер

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

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

См. также

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

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

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

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

Объекты 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, это будет объект байтов.

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

Содержит полное доменное имя сервера, возвращаемое 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/smtpd.html

Spec-Zone.ru

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