smtpd — SMTP-сервер
Исходный код: Lib/smtpd.py
Этот модуль предлагает несколько классов для реализации SMTP (электронной почты) серверов.
См. также
Пакет aiosmtpd рекомендуется в качестве замены для этого модуля. Он основан на asyncio и предоставляет более простой API. smtpd следует считать устаревшим.
Несколько реализаций серверов присутствуют; одна — это универсальная реализация без действий, которая может быть переопределена, а две другие предлагают конкретные стратегии отправки почты.
Кроме того, SMTPChannel может быть расширен для реализации очень специфичного поведения взаимодействия с SMTP-клиентами.
Код поддерживает RFC 5321, а также расширения RFC 1870 SIZE и RFC 6531 SMTPUTF8.
1. Объекты SMTPServer
-
class smtpd.SMTPServer(localaddr, remoteaddr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=True) -
Создает новый объект
SMTPServer, который привязывается к локальному адресу localaddr. Он будет обрабатывать remoteaddr как SMTP-ретранслятор. Оба localaddr и remoteaddr должны быть кортежем (хост, порт). Объект наследуется отasyncore.dispatcherи, следовательно, вставит себя в цикл событийasyncoreпри создании.data_size_limit указывает максимальное количество байтов, которое будет принято в
DATAкоманде. ЗначениеNoneили0означает отсутствие ограничения.map — это карта сокетов для использования в соединениях (изначально пустой словарь является подходящим значением). Если не указано, используется глобальная карта сокетов
asyncore.enable_SMTPUTF8 определяет, следует ли включить расширение
SMTPUTF8(как определено в RFC 6531). По умолчаниюFalse. Если установленоTrue, decode_data должно бытьFalse(иначе возникает ошибка). КогдаTrue,SMTPUTF8принимается в качестве параметра командыMAILи, если он есть, передается вprocess_message()в спискеkwargs['mail_options'].decode_data указывает, следует ли декодировать часть данных SMTP-транзакции с использованием UTF-8. По умолчанию
Trueпо причинам обратной совместимости, но изменится наFalseв Python 3.6; явно укажите значение ключевого слова, чтобы избежатьDeprecationWarning. Когда decode_data установлено вFalse, сервер объявляет расширение8BITMIME(RFC 6152), принимает параметрBODY=8BITMIMEк командеMAILи, если он есть, передает его вprocess_message()в спискеkwargs['mail_options'].-
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=Falseилиenable_SMTPUTF8=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(), когда один или несколько из них указаны. -
2. Объекты DebuggingServer
-
class smtpd.DebuggingServer(localaddr, remoteaddr) -
Создает новый отладочный сервер. Аргументы такие же, как у
SMTPServer. Сообщения будут отбрасываться и выводиться на стандартный вывод.
3. Объекты PureProxy
-
class smtpd.PureProxy(localaddr, remoteaddr) -
Создаёт новый прокси-сервер. Аргументы такие же, как у
SMTPServer. Всё будет перенаправлено на remoteaddr. Обратите внимание, что запуск этого способа может сделать ваш сервер открытым ретранслятором, поэтому будьте осторожны.
4. Объекты MailmanProxy
-
class smtpd.MailmanProxy(localaddr, remoteaddr) -
Создаёт новый прокси-сервер. Аргументы такие же, как у
SMTPServer. Всё будет перенаправлено на remoteaddr, если локальные конфигурации Mailman знают об адресе, в этом случае он будет обработать через Mailman. Обратите внимание, что запуск этого способа может сделать ваш сервер открытым ретранслятором, поэтому будьте осторожны.
5. Объекты SMTPChannel
-
class smtpd.SMTPChannel(server, conn, addr, data_size_limit=33554432, map=None, enable_SMTPUTF8=False, decode_data=True) -
Создайте новый объект
SMTPChannel, который управляет общением между сервером и одним клиентом SMTP.conn и addr соответствуют переменным экземпляра, описанным ниже.
data_size_limit задает максимальное количество байтов, которое будет принято в команде
DATA. ЗначениеNoneили0означает отсутствие ограничения.enable_SMTPUTF8 определяет, следует ли включить расширение
SMTPUTF8(как определено в RFC 6531). По умолчанию значениеFalse. Если оба enable_SMTPUTF8 и decode_data установлены в значениеTrue, возникает исключениеValueError.В map можно указать словарь, чтобы избежать использования глобального сокета.
decode_data определяет, следует ли декодировать часть данных SMTP-транзакции с помощью UTF-8. По умолчанию значение
Trueдля обеспечения обратной совместимости, но в Python 3.6 оно изменится наFalse. Чтобы избежатьDeprecationWarning, явно укажите значение ключевого слова.Для использования собственной реализации SMTPChannel необходимо переопределить
SMTPServer.channel_classвашегоSMTPServer.Изменено в версии 3.5: аргументы decode_data и enable_SMTPUTF8 были добавлены.
У объекта
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.5/library/smtpd.html