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