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