SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用来传输电子邮件的协议,主要用于系统之间的邮件信息传递,并提供有关来信的通知。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其它网络之间的邮件传输。
SMTP是请求/响应协议,主要是在客户端和服务端(逻辑上)之间进行请求和应答,因此就涉及到响应的命令和应答码。
|--------| |--------|
| | --------Request-------> | |
| client | | server |
| | <-------Response------- | |
|--------| |--------|
SMTP基本命令集:
命令 描述
------------------------------
HELO 向服务器标识用户身份
发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL 初始化邮件传输
mail from:
RCPT 标识单个的邮件接收人;常在MAIL命令后面
可有多个rcpt to:
DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束。
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应OK
QUIT 结束会话
RSET 重置会话,当前传输被取消
SMTP 应答码:
应答码 说明
--------------------------------
501 参数格式错误
502 命令不可实现
503 错误的命令序列
504 命令参数不可实现
211 系统状态或系统帮助响应
214 帮助信息
220 服务就绪
221 服务关闭
421 服务未就绪,关闭传输信道
250 要求的邮件操作完成
251 用户非本地,将转发向<forward-path>
450 要求的邮件操作未完成,邮箱不可用
550 要求的邮件操作未完成,邮箱不可用
451 放弃要求的操作;处理过程中出错
551 用户非本地,请尝试<forward-path>
452 系统存储不足,要求的操作未执行
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行
354 开始邮件输入,以"."结束
554 操作失败
SMTP将传输的内容封装在邮件对象中,邮件对象主要包括信封和内容两部分。
示例:
|--------------------------------|
| MAIL FROM: xiaoming@163.com | 信封
| RCPT TO : 12345678@qq.com |
|--------------------------------|
| From:xiaoming |
| To: xiaohong | 头部
| Date:2020/5/10 |
| Subject: test |
|--------------------------------|
| Dear xiaohong: |
| I miss you very much. | 内容
| ... |
|--------------------------------|
SMTP协议在传输报文时,只能够传输7位的ASCII格式的报文,不支持不使用7位ASCII格式的语种,也不支持语音和视频数据的传输,因此需要扩展协议MIME来解决此问题。
MIME协议定义了5种头部,加在原始STMP头部,如下:
1. MIME-Version:MIME版本
2. Content-Type:内容类型
3. Content-Tansfer-Encoding:传输编码
4. Content-ID:内容标识
5. Content-Description:内容描述
SMTP协议的工作过程可分为如下3个过程:
1. 客户端通过25端口与服务端建立TCP连接,服务端返回应答码220,并提供服务端的域名;
2. 客户端收到应答码,发送HELO命令,启动SMTP会话,通过HELo命令,客户端向服务端提供标识信息;
3. 服务端响应应答码250,通知客户端建立会话成功。
1. 客户端发送“MAIL; FROM”通知服务端发信人的邮箱与域名;
2. 服务端向客户端响应“250”;
3. 客户端发送“RCPT; TO”命令向服务端告知收信人的邮箱与域名;
4. 服务端向客户端响应“250”;
5. 客户端发送“DTAT”命令进行报文传送初始化;
6. 服务端响应“354”,表示可以进行邮件输入了;
7. 客户端发送报文内容,每行以CR与LF终止,报文以只有一个“.”的行终止;
8. 服务端向客户端响应“250”。
1. SMTP客户端发送“QUIT”命令;
2. 服务端响应“221”;
3. 关闭TCP连接。