邮件扩展: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。
小结
| 要点 | 结论 |
|---|---|
| 结构 | xmail 打底 + 三协议客户端;requires 自动携带 |
| MIME | 树解析(限额)+ Builder 流式构造,独立可用 |
| 发信 | SMTP 会话式 API + Submit 一步投递 |
| 收信 | POP3 轮询 / IMAP 全功能(检索/旗标/Idle/压缩) |
| 纪律 | 视图即借即用;凭据走环境;TLS 默认开 |
- xrt 参考 · tls — 邮件传输的加密底座