Глава 36 / 51
Том 5 · Расширения, эксплуатация и практика

Почта: семейство 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.

Приёмка: полный путь curl; пуш Idle приходит за секунды; медленный сервер не блокирует worker движка.

Итоги

ПунктВывод
Структурабаза xmail + три протокольных клиента; requires несёт автоматически
MIMEразбор дерева с лимитами + потоковый Builder, самостоятельны
Отправкасеансовый SMTP API + Submit одним шагом
Приёмопрос POP3 / полнофункциональный IMAP (поиск/флаги/Idle/сжатие)
Дисциплинапредставления только взаймы; данные — через окружение; TLS включён
Дальнейшее чтение по xrt
  • xrt · tls — шифрованная основа почтового транспорта