Содержание страницы
smtpd – SMTP-сервер¶smtpd – SMTP Server
Исходный код: Lib/smtpd.py
Этот модуль предоставляет несколько классов для реализации SMTP-серверов (электронной почты).
См. также
Пакет aiosmtpd является рекомендуемой
заменой этого модуля. Он основан на asyncio и предоставляет
более простой API. smtpd следует считать устаревшим.
Предусмотрено несколько реализаций сервера; одна из них – универсальная реализация, которая ничего не делает и может быть переопределена, в то время как две другие предлагают конкретные стратегии отправки почты.
Кроме того, SMTPChannel может быть расширен для реализации очень специфического поведения взаимодействия с SMTP-клиентами.
Код поддерживает RFC 5321, а также расширения RFC 1870 SIZE и RFC 6531 SMTPUTF8.
Объекты SMTPServer¶SMTPServer Objects
-
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 будет строкой 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¶DebuggingServer Objects
-
class
smtpd.DebuggingServer(localaddr, remoteaddr)¶ Создаёт новый отладочный сервер. Аргументы – как в
SMTPServer. Сообщения будут отбрасываться и выводиться на stdout.
Объекты PureProxy¶PureProxy Objects
-
class
smtpd.PureProxy(localaddr, remoteaddr)¶ Создаёт новый сервер-чистый прокси. Аргументы – как в
SMTPServer. Всё будет пересылаться на remoteaddr. Имейте в виду, что его запуск с большой вероятностью сделает вас открытым ретранслятором, поэтому будьте осторожны.
Объекты MailmanProxy¶MailmanProxy Objects
-
class
smtpd.MailmanProxy(localaddr, remoteaddr)¶ Создаёт новый чистый прокси-сервер. Аргументы те же, что и в
SMTPServer. Всё будет перенаправляться на remoteaddr, если только локальные настройки mailman не знают об адресе – в этом случае обработка пойдёт через mailman. Учтите, что запуск этого сервера с большой вероятностью превратит вас в открытый релей, так что будьте осторожны.
Объекты SMTPChannel¶SMTPChannel Objects
-
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. В расширенном режиме команд принимает атрибут 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
Сообщает, что команда не реализована.
-