Spec-Zone.ru › Python 3.5

smtpd — SMTP-сервер

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

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

См. также

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

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

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

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

1. Объекты SMTPServer

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

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

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

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

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

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

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=False или enable_SMTPUTF8=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(), когда один или несколько из них указаны.

2. Объекты DebuggingServer

class smtpd.DebuggingServer(localaddr, remoteaddr)

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

3. Объекты PureProxy

class smtpd.PureProxy(localaddr, remoteaddr)

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

4. Объекты MailmanProxy

class smtpd.MailmanProxy(localaddr, remoteaddr)

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

5. Объекты SMTPChannel

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

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

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

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

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

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

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

Для использования собственной реализации SMTPChannel необходимо переопределить SMTPServer.channel_class вашего SMTPServer.

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

У объекта 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.5/library/smtpd.html

Spec-Zone.ru

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