smtpd — SMTP-сервер

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


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

Утратил актуальность с версии 3.6, будет удален в версии 3.12: Модуль smtpd устарел (подробнее см. PEP 594). Рекомендуется использовать пакет aiosmtpd для замены этого модуля. Он основан на asyncio и предоставляет более простой API.

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

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

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

Availability: это не Emscripten, это был не я.

Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.

Объекты SMTP-сервера

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

Создайте новый объект SMTPServer, который привязывается к локальному адресу localaddr. Он будет обрабатывать remoteaddr как вышестоящий SMTP-ретранслятор. И localaddr, и remoteaddr должны быть кортежем (host, port). Объект наследуется от 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, и когда present передает его в 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 будет строка в юникоде. Если для него задано значение False, это будет объект bytes.

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

почтовые опции:

список всех полученных параметров для команды 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 по умолчанию.

Отладка серверных объектов

class smtpd.DebuggingServer(localaddr, remoteaddr)

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

Чистые прокси-объекты

class smtpd.PureProxy(localaddr, remoteaddr)

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

Объекты SMTP-канала

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 одновременно.

Чтобы использовать пользовательскую реализацию SMTP-канала, вам необходимо переопределить 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 после того, как клиент отправит строку «ДАННЫЕ».

seen_greeting

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

mailfrom

Содержит строку, содержащую адрес, указанный в строке «ПОЧТА ОТ:» от клиента.

rcpttos

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

received_data

Содержит строку, содержащую все данные, отправленные клиентом во время состояния ДАННЫХ, вплоть до конечного "\r\n.\r\n", но не включая его.

fqdn

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

peer

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

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

Команда

Принятые меры

helo

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

ЭХО

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

НУП

Не предпринимает никаких действий.

выходить

Полностью закрывает соединение.

почта

Принимает синтаксис «MAIL FROM:» и сохраняет указанный адрес как mailfrom. В режиме расширенной команды принимает атрибут РАЗМЕРА RFC 1870 и отвечает соответствующим образом на основе значения data_size_limit.

РКПТ

Принимает синтаксис «RCPT TO:» и сохраняет указанные адреса в списке rcpttos.

RSET (НАБОР)

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

данные

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

помощь

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

ВРФИ

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

ПРИМЕР

Сообщает, что команда не выполнена.

Вернуться на верх