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 должны быть кортежами (хост, порт). Объект наследуется от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. -
Объекты 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 -
Содержит полное доменное имя (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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/smtpd.html