Simple Mail Tranfer Protocol(SMTP) gaunthan Posted on May 26 2016 ? Application Layer ? ? Computer Networking ? ## 概述 **SMTP**(Simple Mail Tranfer Protocol,简单邮件传输协议)是一种TCP协议支持的提供可靠且有效电子邮件传输的**应用层协议**,用于由源地址到目的地址传送邮件,控制信件的中转方式。 SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息。由于SMTP使用**客户端-服务器**模型,因此负责发送邮件的SMTP进程就是SMTP客户,而负责接收邮件的SMTP进程就是SMTP服务器。至于邮件内部的格式,邮件如何存储,以及邮件系统应以多快的速度来发送邮件,SMTP也都未做出规定。 SMTP规定了**14条命令**和**21种应答信息**。每条命令用几个字母组成,而每一种应答信息一般只有一行信息,由一个**3位数字代码**开始,后面附上(也可以不附上)简单的文字说明。 ## 命令 SMTP总共有14条命令,每一条命令都是以`<CRLF>`结束的。下表列出了部分命令的说明: |命令|说明| |--| |HELO <domain>|向服务器标识用户身份。发送者能欺骗,但一般情况下服务器都能检测到。| |MAIL FROM: <reverse-path>|指定发送者。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。| |RCPT TO: <forward-path>|标识各个邮件接收者的地址。| |DATA|服务器将把其后的行为看作邮件数据去处理,以`<CRLF>.<CRLF>`标识数据的结尾。| |REST|退出/复位当前的邮件传输。| |NOOP|要求服务器仅做OK应答。(用于测试)| |QUIT|要求服务器返回一个OK应答并关闭传输。| |HELP|查询服务器支持什么命令| |VRFY <string>|验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。| |EXPN <string>|验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。| |AUTH LOGIN|进行用户认证。用户名和密码都是经过*Base64*加密之后的字符串。| ## 应答 SMTP总共有21种应答信息,下面列出了部分应答的说明: |应答|说明| |--| |214|帮助信息| |220|服务器就绪| |250|请求动作已完成| |354|DATA命令的响应| |500|命令有语法错误或命令过长| |501|参数有语法错误| |502|命令未执行| |554|邮件传输出错| 由于现在的邮件服务器都有一系列的反垃圾策略[^企业退信说明],因此投递出去的邮件有可能被服务器拒收。 [^企业退信说明]: [企业退信说明](http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html) ## 工作过程 SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CRLF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体为: 1. 建立TCP连接(端口**25**)。 2. 客户端向服务器发送`HELO`命令以标识发件人自己的身份,然后客户端发送`MAIL`命令。 3. 服务器端以OK作为响应,表示准备接收。 4. 客户端发送`RCPT`命令。 5. 服务器端表示是否愿意为收件人接收邮件。 6. 协商结束,发送邮件,用命令`DATA`发送输入内容。 7. 结束此次发送,用`QUIT`命令退出。 ## 实测 下面将以163的SMTP服务器作为示例,演示如何使用Telnet进行SMTP邮件的发送: ### 建立连接 在终端中敲入命令`telnet smtp.163.com 25`。之后可以看到类似以下信息:  ### 激活会话 敲入命令`HELO smtptest`,可以看到如下回应:  ### 认证用户 敲入命令`AUTH LOGIN`,之后用Base64编码自己的帐号和密码,分别发送出去:  这里用帐号*myaccount*和密码*mypasswd*来作演示,两者的Base64编码分别是bXlhY2NvdW50和bXlwYXNzd2Q=。如果验证成功,则会看到如下响应:  ### 发送邮件 下面的通信过程展示了如何发送一封邮件(为方便,接收人和发送人为同一人):  ### 验证结果 之后登陆163邮箱验证结果即可!   ## Appendix - [常用邮件服务器](http://wenku.baidu.com/link?url=A8P2ZKEz01tG_zpSoZOXZg_oL8QTf9Iyhifs-tqq3DdisX_ZimOtoJzfZ03vcOpSoqpEnlaJ1xdiKQ8Rgi3ndBs8TfibzoEV7ePLhXCp1ay) - [Sending Mail (SMTP)](http://www.cs.cf.ac.uk/Dave/PERL/node175.html) ## References - JamesF.Kurose, KeithW.Ross, 库罗斯,等. 计算机网络:自顶向下方法[M]. 高等教育出版社, 2009. - 谢希仁. 计算机网络.第6版[M]. 电子工业出版社, 2013. 赏 Wechat Pay Alipay TCP/IP 协议栈 Domain Name System(DNS)