附录 E. 其他网关问题 (Other Gateway Issues)
本附录讨论连接 SMTP 与其他邮件系统的邮件网关的特殊考虑事项.
E.1. 网关责任 (Gateway Responsibilities)
连接 SMTP 与另一邮件系统的邮件网关必须:
-
转换地址
- 在 SMTP 格式和其他系统格式之间转换
- 维护双向映射
- 记录转换规则
-
转换头部
- 将 SMTP 头部字段映射到其他系统中的等价字段
- 保留语义含义
- 添加网关特定跟踪字段
-
转换内容
- 处理字符集差异
- 必要时转换内容编码
- 尽可能保留附件
-
处理投递通知
- 在系统之间转换 DSN
- 适当报告失败
- 映射错误代码
E.2. X.400 网关示例
SMTP 到 X.400:
- 将 RFC 5322 地址转换为 X.400 O/R 地址
- 将 SMTP 头部映射到 X.400 P2 头部
- 保留消息内容
X.400 到 SMTP:
- 将 X.400 O/R 地址转换为 RFC 5322 格式
- 将 X.400 头部映射到 SMTP 头部
- 维护投递报告
E.3. 地址映射挑战
问题: 不同地址方案
SMTP: [email protected]
UUCP: host!user
X.400: /C=US/ADMD=ATT/PRMD=XYZ/S=Smith/G=John/
网关必须:
- 双向转换地址
- 处理不同部分中的地址 (envelope 和 headers)
- 处理无法转换的地址
E.4. 字符集问题
SMTP 传统上使用 7-bit ASCII. 通往具有不同字符集的系统的网关必须:
- 识别编码: 检测传入消息的字符集
- 安全转换: 转换为目标系统编码
- 清晰标记: 在头部中指示编码 (MIME Content-Type)
- 处理失败: 处理无法转换的字符
E.5. 内容转换
当内容格式不同时:
文本:
- 行结束转换 (CRLF vs LF vs CR)
- 字符集转换
- 文本 wrapping/unwrapping
二进制:
- 编码 (Base64, Quoted-Printable)
- 类型保留
- 文件名处理
富文本:
- HTML 与其他格式之间转换
- 格式保留
- fallback 到 plain text
E.6. 网关中的循环防止
网关必须防止邮件循环:
SMTP -> Gateway A -> Other System -> Gateway B -> SMTP (loop!)
防止方法:
- 跨网关跟踪 Message-ID
- 添加网关特定跟踪头部
- 限制跨网关转换的 hop count
- 检测重复网关处理
E.7. 错误处理
网关特定错误:
转换失败:
- 无法转换的地址 -> 返回 5xx 错误
- 字符集问题 -> 返回错误或 best-effort 转换
- 格式不兼容 -> 拒绝或带损失警告转换
投递失败:
- 其他系统拒绝 -> 转换为 SMTP 错误代码
- 其他系统 timeout -> 返回临时失败 (4xx)
- 永久失败 -> 返回永久失败 (5xx)
E.8. 网关 Received 头部
网关必须添加适当 Received 头部:
Received: from smtp.example.com by gateway.example.com
with SMTP (gateway to X400) id 12345
for [email protected]; Wed, 24 Dec 2024 10:00:00 +0000
包括:
- 源协议 (SMTP)
- 目标协议 (注释中)
- 网关标识
- Timestamp
E.9. 最佳实践
- 记录转换: 清楚记录所有地址和头部转换
- 保留信息: 尽可能保留原始信息
- 添加跟踪: 添加网关特定头部用于调试
- 彻底测试: 用各种消息类型和边界情况测试
- 监控: 记录网关操作用于排障
- 更新: 保持网关软件更新以获得安全性和兼容性