5. ELECTRONIC MAIL -- SMTP AND RFC-822 (电子邮件 -- SMTP和RFC-822)
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): 实际的消息内容
常见标头字段 (Common Header Fields)
- From: 消息的发起者 (必需)
- To: 主要收件人 (发送时必需)
- Cc: 抄送收件人
- Bcc: 密送收件人
- Subject: 主题行
- Date: 消息发送的日期和时间
- Message-ID: 唯一的消息标识符
- Received: 跟踪信息
5.2.2 SMTP
SMTP是在主机之间传输邮件消息的协议。SMTP使用TCP端口25。
SMTP命令 (SMTP Commands)
- HELO: 向服务器标识客户端
- EHLO: 扩展HELO (ESMTP)
- MAIL FROM: 指定发件人
- RCPT TO: 指定收件人
- DATA: 开始消息内容
- RSET: 重置事务
- VRFY: 验证收件人
- EXPN: 展开邮件列表
- HELP: 帮助信息
- NOOP: 无操作
- QUIT: 关闭连接
SMTP回复代码 (SMTP Reply Codes)
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)
| 功能 | 章节 | 必须 | 应该 | 可以 | 不得 |
|---|---|---|---|---|---|
| 实现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 |