Почта: семейство xmail
Письмо от конструирования до доставки и обратно: xmail кладёт фундамент (разбор и сборка MIME), а SMTP/POP3/IMAP выставляют трёх клиентов, разделяющих транспорт и SASL.
Обзор
build.bat xsmtp (или xpop3 / ximap — xmail подтянется сам). Дисциплина TCP/TLS наследуется из гл. 23/24, дисциплина учётных данных SASL — из уровней доверия гл. 44.36.1 Карта семейства
Четыре библиотеки делят работу: xmail (89 символов) — база MIME: кодеки, кодировки, разбор адресов/дат/параметров, multipart, дерево сообщения, конструкторы, проводной формат (dot-stuffing) и общий транспорт; xsmtp (44) / xpop3 (48) / ximap (102) — три протокольных клиента. requires реестра приносит xmail с любым протоколом — в комбинированных сборках xmail компилируется ровно один раз.
36.2 Слой MIME
Общий для приёма и отправки: xrtMailTreeParse разбирает исходное письмо в дерево с лимитами (защита от враждебной вложенности), семейство xrtMailBuilder потоково собирает multipart. Кодеки (QP/Base64), перевод кодировок в UTF-8, каноническое форматирование адресов и дат — самостоятельные функции: для чистого преобразования форматов протокольный клиент не нужен.
36.3 Отправка по SMTP
Сеансовый API: xrtSmtpClientOpen соединяет (открытый текст/STARTTLS/SSL), Capabilities согласовывает, Auth проходит SASL, Mail/Rcpt/Data или BDAT-блоки доставляют; более высокий xrtSmtpSubmit отправляет письмо целиком за один шаг. Разборщики команд и ответов выставлены отдельно — сценарии тестов и шлюзов работают офлайн.
36.4 Приём POP3 / IMAP
POP3 прямолинеен: Stat/List/Uidl инвентаризируют, Retr/Top забирают (RetrTree сразу даёт дерево сообщения). IMAP функционален: Select выбирает ящик, BeginSearch/BeginFetch потоково ищут и достают, BeginStore правит флаги, Append архивирует, BeginIdle ждёт пуша, Compress сжимает сеанс — разборщики элементов данных (imap_data) тестируются независимо.
36.5 Контракт и выбор
| Вопрос | Главное |
|---|---|
| Владение | дескрипторы клиентов выделяет библиотека: Close рвёт связь, Destroy освобождает; результаты разбора — заимствованные представления, копируйте до выхода из функции |
| Учётные данные | секреты SASL идут через окружение/Custom (дисциплина гл. 44), никогда в исходник |
| Варианты | три протокола выбираются независимо; скрипты проверяют в рантайме xsExtensionEnabled("xsmtp") |
| Выбор | только опрос почты: POP3; много ящиков/поиск/флаги/пуш: IMAP; отправка: SMTP |
Частые ошибки
- Симптом
- Указатель дерева из Retr сохранён на потом — обращение падает.
- Причина
- Ответы протокола — заимствованные представления, живущие до следующего обмена; оставляемое копируйте семейством Write/Bytes слоя MIME.
- Симптом
- Письма и учётные данные идут по сети без шифрования.
- Причина
- Не задан режим безопасности — в продакшне обязателен STARTTLS или SSL; канал связи даёт xrt TLS с проверкой сертификатов по умолчанию. Не выключайте её ради удобства.
Упражнения
Разберите слой MIME multipart-образец, пересоберите его Builder'ом и сравните байты.
SMTP-сеанс к локальному тест-серверу (или отладочному шлюзу), Submit письма, забор POP3 Retr.
Оберните приём-отправку в HTTP-маршруты (POST /mail/send, GET /mail/inbox), пуш IMAP Idle — в WS.
Итоги
| Пункт | Вывод |
|---|---|
| Структура | база xmail + три протокольных клиента; requires несёт автоматически |
| MIME | разбор дерева с лимитами + потоковый Builder, самостоятельны |
| Отправка | сеансовый SMTP API + Submit одним шагом |
| Приём | опрос POP3 / полнофункциональный IMAP (поиск/флаги/Idle/сжатие) |
| Дисциплина | представления только взаймы; данные — через окружение; TLS включён |
- xrt · tls — шифрованная основа почтового транспорта