smtpd
— SMTP-сервер¶
Исходный код: Lib/smtpd.py.
Этот модуль предлагает несколько классов для реализации серверов SMTP (электронной почты).
Не рекомендуется, начиная с версии 3.6: smtpd
будет удален в Python 3.12 (подробнее см. PEP 594). Пакет aiosmtpd является рекомендуемой заменой этого модуля. Он основан на asyncio
и предоставляет более простой API.
Присутствует несколько реализаций сервера; одна из них является общей реализацией «ничего не делать», которую можно переопределить, в то время как две другие предлагают конкретные стратегии отправки почты.
Кроме того, 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 должны быть кортежем (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 будет строкой юникода. Если он имеет значениеFalse
, то это будет объект байтов.kwargs - это словарь, содержащий дополнительную информацию. Он пуст, если в качестве аргумента init было передано
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
. Сообщения будут отброшены и выведены на stdout.
Объекты PureProxy¶
-
class
smtpd.
PureProxy
(localaddr, remoteaddr)¶ Создайте новый чистый прокси-сервер. Аргументы в соответствии с
SMTPServer
. Все будет передаваться на remoteaddr. Обратите внимание, что при запуске этой программы велика вероятность превратить вас в открытый ретранслятор, поэтому будьте осторожны.
Объекты MailmanProxy¶
-
class
smtpd.
MailmanProxy
(localaddr, remoteaddr)¶ Deprecated since version 3.9, will be removed in version 3.11:
MailmanProxy
является устаревшим, он зависит от модуляMailman
, который больше не существует и поэтому уже сломан.Создайте новый чистый прокси-сервер. Аргументы в соответствии с
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()
.
Класс
SMTPChannel
работает путем вызова методов с именемsmtp_<command>
при получении командной строки от клиента. В базовый классSMTPChannel
встроены методы для обработки следующих команд (и реагирования на них соответствующим образом):Команда
Принятые меры
HELO
Принимает приветствие от клиента и сохраняет его в
seen_greeting
. Переводит сервер в базовый командный режим.EHLO
Принимает приветствие от клиента и сохраняет его в
seen_greeting
. Переводит сервер в расширенный командный режим.НООП
Не предпринимает никаких действий.
QUIT
Чистое закрытие соединения.
ПОЧТА
Принимает синтаксис «MAIL FROM:» и сохраняет указанный адрес как
mailfrom
. В расширенном командном режиме принимает атрибут SIZE RFC 1870 и отвечает соответствующим образом, основываясь на значении data_size_limit.RCPT
Принимает синтаксис «RCPT TO:» и сохраняет предоставленные адреса в списке
rcpttos
.RSET
Сбрасывает параметры
mailfrom
,rcpttos
иreceived_data
, но не приветствие.ДАННЫЕ
Устанавливает внутреннее состояние в
DATA
и сохраняет оставшиеся строки от клиента вreceived_data
до получения терминатора"\r\n.\r\n"
.HELP
Возвращает минимальную информацию о синтаксисе команды
VRFY
Возвращает код 252 (сервер не знает, действителен ли адрес)
EXPN
Сообщает, что команда не выполнена.
-