5. 电子邮件 -- SMTP 和 RFC-822 (ELECTRONIC MAIL)
5.1 简介 (INTRODUCTION)
电子邮件是互联网中最重要的应用之一。它使用两个关键协议:
- RFC-822: 定义邮件消息的格式
- SMTP: 简单邮件传输协议, 用于邮件传输
每台互联网主机应该 (SHOULD) 实现 SMTP 和 RFC-822 以发送和接收电子邮件。
5.2 协议逐步分析 (PROTOCOL WALK-THROUGH)
5.2.1 RFC-822
RFC-822 定义了邮件消息的语法。邮件消息由以下部分组成:
- 头部 (Header): 包含 From、To、Subject、Date 等字段
- 正文 (Body): 实际消息内容
常见头部字段
- From: 消息发起者 (必需)
- To: 主要收件人 (发送时必需)
- Cc: 抄送收件人
- Bcc: 密件抄送收件人
- Subject: 主题行
- Date: 消息发送的日期和时间
- Message-ID: 唯一消息标识符
- Received: 跟踪信息
5.2.2 SMTP
SMTP 是在主机之间传输邮件消息的协议。SMTP 使用 TCP 端口 25。
SMTP 命令
- HELO: 向服务器标识客户端
- EHLO: 扩展 HELO (ESMTP)
- MAIL FROM: 指定发件人
- RCPT TO: 指定收件人
- DATA: 开始消息内容
- RSET: 重置事务
- VRFY: 验证收件人
- EXPN: 展开邮件列表
- HELP: 帮助信息
- NOOP: 无操作
- QUIT: 关闭连接
SMTP 回复代码
SMTP 使用三位数回复代码:
- 2xx: 肯定完成
- 3xx: 肯定中间
- 4xx: 暂时否定完成
- 5xx: 永久否定完成
5.3 具体问题 (SPECIFIC ISSUES)
5.3.1 SMTP
5.3.1.1 发送策略 (Sending Strategy)
SMTP 客户端应该 (SHOULD) 实现可配置的策略, 用于排队和重试失败的邮件传输。重试策略应该 (SHOULD) 使用指数退避。
5.3.1.2 接收策略 (Receiving Strategy)
SMTP 服务器必须 (MUST) 接受发往有效本地收件人的邮件。SMTP 服务器应该 (SHOULD) 在接受邮件之前检查收件人有效性。
5.3.1.3 错误处理 (Error Handling)
SMTP 实现必须 (MUST) 正确处理所有 SMTP 回复代码。临时失败 (4xx) 应导致重试; 永久失败 (5xx) 应导致未送达通知。
5.3.1.4 超时 (Timeouts)
SMTP 实现必须 (MUST) 使用适当的超时:
- 初始 220 消息: 5 分钟
- MAIL 命令: 5 分钟
- RCPT 命令: 5 分钟
- DATA 发起: 2 分钟
- DATA 块: 3 分钟
- DATA 终止: 10 分钟
5.3.2 RFC-822
5.3.2.1 消息格式 (Message Format)
实现必须 (MUST) 生成符合 RFC-822 语法的消息。但是, 实现应该 (SHOULD) 在接受可能有轻微偏差的消息时保持宽容。
5.3.2.2 地址格式 (Address Formats)
RFC-822 定义了几种地址格式。实现必须 (MUST) 支持邮箱地址, 并且应该 (SHOULD) 支持组地址。
5.3.2.3 日期和时间 (Date and Time)
所有邮件消息必须 (MUST) 包含 Date 头部字段。日期必须 (MUST) 使用 RFC-822 日期和时间格式。
5.4 SMTP 要求摘要 (SMTP REQUIREMENTS SUMMARY)
| 功能 | 章节 | MUST | SHOULD | MAY |
|---|---|---|---|---|
| 实现 SMTP | 5.1 | x | ||
| 实现 RFC-822 | 5.1 | x | ||
| 接受本地收件人的邮件 | 5.3.1.2 | x | ||
| 重试使用指数退避 | 5.3.1.1 | x | ||
| 正确处理所有回复代码 | 5.3.1.3 | x | ||
| 使用适当的超时 | 5.3.1.4 | x | ||
| 生成符合 RFC-822 的消息 | 5.3.2.1 | x | ||
| 包含 Date 头部 | 5.3.2.3 | x |