smtpd
— Сервер SMTP¶
Вихідний код: Lib/smtpd.py
Цей модуль пропонує кілька класів для реалізації серверів SMTP (електронної пошти).
Застаріло з версії 3.6, буде видалено у версії 3.12: The smtpd
module is deprecated
(see PEP 594 for details).
The aiosmtpd package is a recommended
replacement for this module. It is based on asyncio
and provides a
more straightforward API.
Присутні кілька реалізацій сервера; один — це загальна реалізація нічого не робити, яку можна перевизначити, тоді як інші два пропонують спеціальні стратегії надсилання пошти.
Крім того, SMTPChannel можна розширити, щоб реалізувати дуже специфічну поведінку взаємодії з клієнтами SMTP.
Код підтримує RFC 5321, а також розширення RFC 1870 SIZE і RFC 6531 SMTPUTF8.
Availability: not Emscripten, not WASI.
This module does not work or is not available on WebAssembly platforms
wasm32-emscripten
and wasm32-wasi
. See
WebAssembly platforms for more information.
Об’єкти 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
. Значення «Немає» або «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
, це буде об’єкт 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. Зауважте, що це має хороші шанси зробити вас відкритим реле, тому будьте обережні.
Об’єкти 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
. Значення «Немає» або «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¶
Holds the fully qualified domain name of the server as returned by
socket.getfqdn()
.
SMTPChannel
працює, викликаючи методи з назвоюsmtp_<command>
після отримання командного рядка від клієнта. У базовий класSMTPChannel
вбудовано методи обробки наступних команд (і відповідної відповіді на них):Команда
Дії прийняті
ПРИВІТ
Приймає привітання від клієнта та зберігає його в
seen_greeting
. Перемикає сервер у базовий командний режим.EHLO
Приймає привітання від клієнта та зберігає його в
seen_greeting
. Встановлює сервер у режим розширених команд.NOOP
Не вживає жодних заходів.
ВИЙТИ
Чисто закриває з’єднання.
ПОШТА
Приймає синтаксис «MAIL FROM:» і зберігає надану адресу як
mailfrom
. У розширеному командному режимі приймає атрибут RFC 1870 SIZE і відповідає належним чином на основі значення data_size_limit.RCPT
Приймає синтаксис «RCPT TO:» і зберігає надані адреси в списку
rcpttos
.RESET
Скидає
mailfrom
,rcpttos
іreceived_data
, але не привітання.ДАНІ
Встановлює внутрішній стан на
DATA
і зберігає решту рядків від клієнта вreceived_data
, доки не буде отримано термінатор"\r\n.\r\n"
.ДОПОМОГА
Повертає мінімальну інформацію про синтаксис команди
VRFY
Повертає код 252 (сервер не знає, чи адреса дійсна)
EXPN
Повідомляє, що команда не реалізована.