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 должны быть (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 и при наличии передает его 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, то это будет байтовый объект.

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

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() при False decode_data.

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

Объекты DebuggingServer

class smtpd.DebuggingServer(localaddr, remoteaddr)

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

Объекты PureProxy

class smtpd.PureProxy(localaddr, remoteaddr)

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

Объекты MailmanProxy

class smtpd.MailmanProxy(localaddr, remoteaddr)

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

Объекты 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 Сообщает, что команда не реализована.