第 36 章 / 共 51 章
卷五 · 扩展、运维与实战

邮件扩展:xmail 三协议

一封信从构造到投递再到收回:xmail 打底(MIME 解析与构造),SMTP/POP3/IMAP 三个客户端各自成军,共享传输与 SASL。

本章导读

站位:协议应用层的集大成。前置:build.bat xsmtp(或 xpop3 / ximap——自动携带 xmail)。TCP/TLS 纪律沿用 ch23/24,SASL 凭据纪律沿用 ch44 的信任分层。

36.1 家族地图

四库分工:xmail(89 符号)是 MIME 基础层——编解码、字符集、地址/日期/参数解析、多部分、消息树、构造器、线上格式(dot-stuffing)与共享传输;xsmtp(44)/xpop3(48)/ximap(102)是三个协议客户端。注册表的 requires 让选任一协议自动带上 xmail——组合构建时 xmail 只编译一次。

36.2 MIME 层

收发共用:xrtMailTreeParse 把原始邮件解析成带限额的消息树(防恶意深嵌套),xrtMailBuilder 系列流式构造多部件邮件。编解码(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(ch44 纪律),绝不入源码
变体三协议独立可选;脚本 xsExtensionEnabled("xsmtp") 可运行期探测
选型只收不发的轮询任务用 POP3;多箱/检索/旗标/推送用 IMAP;发信 SMTP

常见错误

解析视图带出回调
症状
把 Retr 返回的消息树指针存起来,稍后访问崩溃。
原因
协议应答是借用视图,下次收发即失效——需要留存的内容用 MIME 层的 Write/Bytes 系列拷贝。
明文发信
症状
邮件与凭据在网络上裸奔。
原因
安全模式没配置——生产必须 STARTTLS 或 SSL;连接层由 xrt TLS 提供,证书校验默认开启,别为图省事关掉。

编程练习

基础解析与构造

用 MIME 层解析一封多部件样本,再以 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 延伸阅读