开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
电子邮件服务模型中的客户称为邮件用户代理(MUA),主要用于编辑和发送邮件,以及从服务器中下载、管理、阅读邮件等。
提供送信功能的服务器称为邮件传输代理(MTA),MTA也提供邮件存储功能。
提供收信功能的服务器称为邮件投递代理(MDA),MDA主要负责将MTA接受的邮件投递到收件人的邮箱中。
电子邮件服务器传递信件过程的行为:
- 接受用户投递的邮件
- 将用户投递的邮件转发给其他邮件服务器
- 接收其他邮件服务区转投的信件,并将邮件存储到自身管理的用户邮箱中
- 为发起读信请求的用户提供读取服务
电子邮件协议
常用的电子邮件协议:
- SMTP:常用于发送邮件
- POP3:常用于接收邮件
- IMAP4:常用于接收邮件
IMAP4比POP3强大,但也要占用更多资源,所以大多数站点使用SMTP搭配POP3搭建邮件服务器。
SMTP协议
SMTP即简单邮件传输协议,属于TCP/IP协议簇。能跨越网络传输邮件,即实现“SMTP邮件中继”。
SMTP两种工作模式:
- 电子邮件从客户端传到服务器
- 电子邮件在两台SMTP服务器之间传递
例如,SMTP服务器mail.test.com收到一封发送到chan@163.com的邮件,则其工作流程如下:
- SMTP服务器获取收件方域名与自身域名进行比较,发现不一致
- SMTP服务器请求DNS服务器查找163.com的MX记录并获取相应的远端SMTP服务器IP地址
- SMTP服务器根据获得的IP地址将邮件转发给远端SMTP服务器
客户端向服务器发送邮件过程:
- 客户端向服务器发送连接请求,建立TCP连接
- 客户端发送
helo/chlo命令表明自己身份 - 客户端发送
mail from命令设置发件人邮箱地址 - 客户端发送
rcpt to命令声明收件人地址 - 客户端使用
data命令,并输入正文内容,输入完毕以“.”表示输入结束 - 结束此次发送,用
quit命令退出
常用的SMTP命令如下:
| 命令 | 说明 |
|---|---|
| helo/ehlo 客户端主机名 | 向服务器表明自己的身份 |
| mail from: 发件人邮箱 | 设置发件人身份 |
| rcpt to: 收件人邮箱 | 设置收件人邮箱地址,若需将邮件发送给多人,可重复使用此命令 |
| data | 使用此命令,开始输入邮件正文,以“ . ”结束正文输入 |
| vrfy 邮箱地址 | 验证指定邮箱是否存在,考虑到安全问题,此命令一般禁用 |
| noop | 空操作,要求服务器返回OK应答,一般用作测试 |
| rset | 重置会话,取消当前传输 |
客户端向SMTP服务器发送命令后总会收到来自服务器的响应码:
| 响应码 | 说明 |
|---|---|
| 220 | 服务器就绪 |
| 250 | 要求的邮箱操作完成 |
| 354 | 开始邮件输入,以“ . ”结束 |
| 450 | 要求的邮件操作未完成,邮箱不可用 |
| 452 | 系统存储不足,要求的操作未执行 |
| 454 | 临时认证失败,可能账号被临时冻结 |
| 550 | 要求的邮件操作未完成,邮箱不可用 |
POP3协议
POP3即邮局协议第3版,属于TCP/IP协议簇,主要用于查收邮件。POP3支持离线邮件处理,当邮件递达服务器后,邮件客户端可下载所有未阅读的电子邮件。POP3默认使用110号端口,工作流程如下:
- 客户端向服务器发起连接请求,连接到110端口
- 连接成功后客户端使用
user命令表明收件人身份,使用pass命令进行用户认证 - 认证成功后客户端使用
list命令查看POP3服务器中的邮件列表,再使用rert命令查看邮件内容 - 查看完毕,使用
quit命令退出客户端,关闭连接
用户若想通过POP3服务器收取信件,必须先通过身份认证,只有认证成功的用户才可以使用POP3服务器提供的功能。
POP3常用的命令如下:
| 命令 | 说明 |
|---|---|
| user 用户名 | 表明收件人身份 |
| pass 密码 | 验证收件人身份 |
| stat | 查看邮件服务器的邮件状态,包括邮件的数量与大小 |
| list | 显示邮件服务器中的邮件列表,包括邮件的数量与每封邮件的大小 |
| uidl | 查看邮件服务器中的邮件数量与每封邮件的唯一标识符 |
| retr [msg#] | 显示指定邮件的内容,其中[msg#]表示邮件编号 |
| dele [msg#] | 标记邮件为已删除 |
| rset | 重置所有标记为删除的邮件 |
| noop | 空操作,一般用检测服务器连接状态 |
| quit | 退出 |
POP3服务器也会返回响应信息,“+OK”表示命令执行成功,“-ERR”表示失败。