Документация Python неофициальный перевод
Содержание страницы

21.18. smtpd – SMTP-серверsmtpd – SMTP Server

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


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

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

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

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

21.18.1. Объекты SMTPServerSMTPServer Objects

class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432)

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

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

process_message(peer, mailfrom, rcpttos, data)

Вызывает исключение NotImplementedError. Переопределите этот метод в подклассах, чтобы выполнять с этим сообщением полезные действия. Всё, что было передано в конструктор как remoteaddr, будет доступно как _remoteaddr атрибут. peer – адрес удалённого хоста, mailfrom – отправитель конверта, rcpttos – получатели конверта, а data – строка с содержимым письма (должна быть в формате RFC 2822 формат).

channel_class

Переопределите этот метод в подклассах, чтобы использовать собственный SMTPChannel для управления SMTP-клиентами.

21.18.2. Объекты DebuggingServerDebuggingServer Objects

class smtpd.DebuggingServer(localaddr, remoteaddr)

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

21.18.3. Объекты PureProxyPureProxy Objects

class smtpd.PureProxy(localaddr, remoteaddr)

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

21.18.4. Объекты MailmanProxyMailmanProxy Objects

class smtpd.MailmanProxy(localaddr, remoteaddr)

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

21.18.5. Объекты SMTPChannelSMTPChannel Objects

class smtpd.SMTPChannel(server, conn, addr)

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

Чтобы использовать собственную реализацию SMTPChannel, необходимо переопределить атрибут SMTPServer.channel_class вашего SMTPServer.

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