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 (сервер не знает, действителен ли адрес)
ПРИМЕР
Сообщает, что команда не выполнена.