smtpd — SMTP-сервер

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


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

Не рекомендуется, начиная с версии 3.6: smtpd будет удален в Python 3.12 (подробнее см. PEP 594). Пакет aiosmtpd является рекомендуемой заменой этого модуля. Он основан на asyncio и предоставляет более простой API.

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

Кроме того, 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 - это словарь, содержащий дополнительную информацию. Он пуст, если в качестве аргумента init было передано 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. Сообщения будут отброшены и выведены на stdout.

Объекты PureProxy

class smtpd.PureProxy(localaddr, remoteaddr)

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

Объекты MailmanProxy

class smtpd.MailmanProxy(localaddr, remoteaddr)

Deprecated since version 3.9, will be removed in version 3.11: MailmanProxy является устаревшим, он зависит от модуля Mailman, который больше не существует и поэтому уже сломан.

Создайте новый чистый прокси-сервер. Аргументы в соответствии с 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. Переводит сервер в расширенный командный режим.

НООП

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

QUIT

Чистое закрытие соединения.

ПОЧТА

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

RCPT

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

RSET

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

ДАННЫЕ

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

HELP

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

VRFY

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

EXPN

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

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