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 должны быть (host, port) кортежем. Объект наследует отasyncore.dispatcherи таким образом вставляется в событийный циклasyncoreпри создании экземпляра.data_size_limit указывает максимальное количество байтов, которое будет принято в команде
DATA. значениеNoneили0не означает ограничения.map - карта сокет, используемая для соединений (первоначально пустой словарь является подходящим значение). Если не определенный глобальная карта сокет
asyncore- используемый.enable_SMTPUTF8 определяет необходимость активизации внутреннего номера
SMTPUTF8(как определено в RFC 6531). Значение по умолчанию -False. ПриTrueSMTPUTF8принимается в качестве параметра для команды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 - словарь, содержащий дополнительную информацию. Он пуст, если
decode_data=Trueбыл задан в качестве аргумента init, в противном случае он содержит следующие ключи: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()приFalsedecode_data.Изменено в версии 3.6: Теперь decode_data
Falseпо умолчанию.-
Объекты DebuggingServer¶
-
class
smtpd.DebuggingServer(localaddr, remoteaddr)¶ Создайть новый сервер отладки. Аргументы приведены в соответствии с
SMTPServer. Сообщения будут отброшены и напечатаны на stdout.
Объекты PureProxy¶
-
class
smtpd.PureProxy(localaddr, remoteaddr)¶ Создайть новый чистый прокси-сервер. Аргументы приведены в соответствии с
SMTPServer. Все будет передано remoteaddr. Обратите внимание, что запуск этого имеет хороший шанс сделать Вам в открытый relay, так что, пожалуйста, будьте осторожны.
Объекты MailmanProxy¶
-
class
smtpd.MailmanProxy(localaddr, remoteaddr)¶ Создайть новый чистый прокси-сервер. Аргументы приведены в соответствии с
SMTPServer. Все будет передано remoteaddr, если только локальная конфигурации почтальона не знают об адресе, и в этом случае оно будет обрабатываться через почтальона. Обратите внимание, что запуск этого имеет хороший шанс сделать Вам открытой relay, так что, пожалуйста, будьте осторожны.
Объекты 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_classSMTPServer.Изменено в версии 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. В режиме расширенной команды принимает 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 Сообщает, что команда не реализована. -
