跳到主要内容

附录 E. 其他网关问题 (Other Gateway Issues)

本附录讨论连接 SMTP 与其他邮件系统的邮件网关的特殊考虑事项.

E.1. 网关责任 (Gateway Responsibilities)

连接 SMTP 与另一邮件系统的邮件网关必须:

  1. 转换地址

    • 在 SMTP 格式和其他系统格式之间转换
    • 维护双向映射
    • 记录转换规则
  2. 转换头部

    • 将 SMTP 头部字段映射到其他系统中的等价字段
    • 保留语义含义
    • 添加网关特定跟踪字段
  3. 转换内容

    • 处理字符集差异
    • 必要时转换内容编码
    • 尽可能保留附件
  4. 处理投递通知

    • 在系统之间转换 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. 通往具有不同字符集的系统的网关必须:

  1. 识别编码: 检测传入消息的字符集
  2. 安全转换: 转换为目标系统编码
  3. 清晰标记: 在头部中指示编码 (MIME Content-Type)
  4. 处理失败: 处理无法转换的字符

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!)

防止方法:

  1. 跨网关跟踪 Message-ID
  2. 添加网关特定跟踪头部
  3. 限制跨网关转换的 hop count
  4. 检测重复网关处理

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. 最佳实践

  1. 记录转换: 清楚记录所有地址和头部转换
  2. 保留信息: 尽可能保留原始信息
  3. 添加跟踪: 添加网关特定头部用于调试
  4. 彻底测试: 用各种消息类型和边界情况测试
  5. 监控: 记录网关操作用于排障
  6. 更新: 保持网关软件更新以获得安全性和兼容性