smtpd — SMTP-сервер
Исходный код: Lib/smtpd.py
Этот модуль предлагает несколько классов для реализации SMTP (электронной почты) серверов.
См. также
Пакет aiosmtpd рекомендуется как замена этому модулю. Он основан на asyncio и предоставляет более простой API. smtpd следует считать устаревшим.
Несколько реализаций сервера присутствуют; одна — это общая реализация «ничего не делать», которую можно переопределить, а две другие предлагают конкретные стратегии отправки почты.
Кроме того, SMTPChannel можно расширить, чтобы реализовать очень специфическое поведение взаимодействия с SMTP-клиентами.
Код поддерживает RFC 5321, а также расширения SIZE RFC 1870 и SMTPUTF8 RFC 6531.
Объекты SMTPServer
-
class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=False) -
Создает новый объект
SMTPServer, который привязывается к локальному адресу localaddr. Он будет обрабатывать remoteaddr как SMTP-ретранслятор вверх по потоку. Оба localaddr и remoteaddr должны быть кортежем (хост, порт). Объект наследуется от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 будет строкой Unicode. Если он установлен вFalse, это будет объект байтов.kwargs — словарь, содержащий дополнительную информацию. Он пуст, если в качестве аргумента инициализации был передан
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_dataFalse.Изменено в версии 3.6: По умолчанию decode_data теперь
False. -
Объекты DebuggingServer
-
class smtpd.DebuggingServer(localaddr, remoteaddr) -
Создает новый сервер отладки. Аргументы такие же, как у
SMTPServer. Сообщения будут игнорироваться и выводиться на стандартный вывод.
Объекты PureProxy
-
class smtpd.PureProxy(localaddr, remoteaddr) -
Создает новый прокси-сервер. Аргументы такие же, как у
SMTPServer. Всё будет перенаправлено на remoteaddr. Обратите внимание, что запуск этого способа с большой вероятностью сделает вас открытым ретранслятором, поэтому будьте осторожны.
Объекты MailmanProxy
-
class smtpd.MailmanProxy(localaddr, remoteaddr) -
Создает новый прокси-сервер. Аргументы такие же, как у
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. Устанавливает сервер в расширенный режим команд.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
Сообщает, что команда не реализована.
-
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/smtpd.html