Содержание страницы
21.18. smtpd – SMTP-сервер¶smtpd – SMTP Server
Исходный код: Lib/smtpd.py
Этот модуль предоставляет несколько классов для реализации SMTP-серверов (электронной почты).
См. также
Пакет aiosmtpd рекомендуется в качестве замены этого модуля. Он основан на asyncio и предоставляет более простой API. smtpd следует считать устаревшим.
Предусмотрено несколько реализаций сервера; одна из них – универсальная реализация, которая ничего не делает и может быть переопределена, в то время как две другие предлагают конкретные стратегии отправки почты.
Кроме того, SMTPChannel может быть расширен для реализации очень специфического поведения взаимодействия с SMTP-клиентами.
Код поддерживает RFC 5321, а также расширение SIZE RFC 1870.
21.18.1. Объекты SMTPServer¶SMTPServer Objects
- class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None)¶
Создаёт новый объект SMTPServer, который привязывается к локальному адресу localaddr. Он будет рассматривать remoteaddr как вышестоящий SMTP-ретранслятор. Он наследуется от asyncore.dispatcher и, таким образом, при создании встраивается в цикл событий asyncore.
data_size_limit задаёт максимальное количество байт, которое будет принято в команде DATA. Значение None или 0 означает отсутствие ограничения.
Словарь можно указать в map, чтобы избежать использования глобальной карты сокетов.
- process_message(peer, mailfrom, rcpttos, data)¶
Вызывает исключение NotImplementedError. Переопределите этот метод в подклассах, чтобы выполнять с этим сообщением полезные действия. Всё, что было передано в конструктор как remoteaddr, будет доступно как _remoteaddr атрибут. peer – адрес удалённого хоста, mailfrom – отправитель конверта, rcpttos – получатели конверта, а data – строка с содержимым письма (должна быть в формате RFC 2822 формат).
- channel_class¶
Переопределите этот метод в подклассах, чтобы использовать собственный SMTPChannel для управления SMTP-клиентами.
Изменено в версии 3.4: Был добавлен аргумент map.
21.18.2. Объекты DebuggingServer¶DebuggingServer Objects
- class smtpd.DebuggingServer(localaddr, remoteaddr)¶
Создаёт новый отладочный сервер. Аргументы такие же, как у SMTPServer. Сообщения будут отброшены и выведены в stdout.
21.18.3. Объекты PureProxy¶PureProxy Objects
- class smtpd.PureProxy(localaddr, remoteaddr)¶
Создаёт новый чистый прокси-сервер. Аргументы такие же, как у SMTPServer. Всё будет ретранслироваться на remoteaddr. Имейте в виду, что запуск этого сервера может превратить вас в открытый ретранслятор, поэтому будьте осторожны.
21.18.4. Объекты MailmanProxy¶MailmanProxy Objects
- class smtpd.MailmanProxy(localaddr, remoteaddr)¶
Создаёт новый чистый прокси-сервер. Аргументы такие же, как у SMTPServer. Всё будет ретранслироваться на remoteaddr, если только локальные настройки mailman не знают об адресе – в этом случае он будет обработан через mailman. Имейте в виду, что запуск этого сервера может превратить вас в открытый ретранслятор, поэтому будьте осторожны.
21.18.5. Объекты SMTPChannel¶SMTPChannel Objects
- class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None))¶
Создаёт новый объект SMTPChannel, который управляет обменом данными между сервером и одним SMTP-клиентом.
conn и addr описаны ниже в переменных экземпляра.
data_size_limit задаёт максимальное количество байт, которое будет принято в команде DATA. Значение None или 0 означает отсутствие ограничения.
Словарь можно указать в map, чтобы избежать использования глобальной карты сокетов.
Чтобы использовать собственную реализацию 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().
Класс 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 Сообщает, что команда не реализована.