1、SMTP:简单邮件传送协议。位于应用层。
1)SMTP是存储转发协议:允许信件通过一系列的服务器发送到最终的目的地。服务器在一个队列中存储到达的信件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器。
SMTP是面向文本的、基于命令的协议。客户机发出一个命令,服务器处理该命令并给客户机发回一个应答。这个对话继续,直至会话结束。
缺省情况下,命令序列是同步的,即在发出下一个命令前,必须收到前一个命令的应答(但协议的某个扩展使用了流水线,放松了这个同步要求)。
沿任一方向发送的每一行以CRLF终止。
2)命令与应答
从客户机发送的每个命令行由一个4字符命令后跟一组可选的参数组成。所有命令都是不区分大小写的。
应答的主要目的是表达成功或失败状态信息。应答由3位数字应答代码+空格+可阅读描述组成。这个应答格式是从FTP协议继承下来的。对于多行应答,“-”用作指示有更多的应答行到达。
3位应答代码中的每一位传递不同层次的信息。
(1)第1位是最重要的,传递命令是成功还是失败的信息。
1:肯定初步应答。命令成功,但服务器期望客户机提供附加的信息。没有SMTP命令使用这个应答类型。
2:肯定完成应答。命令成功,且服务器不要求任何其他的信息。如常见的250。
3:肯定中间应答。命令成功,且服务器提示(需要)其他的数据。目前data是使用这个应答类型的唯一命令。
4:临时否定应答。临时失败,以后尝试该命令可能成功。如典型的磁盘空间不足。
5:永久失败。重试也不能成功。如语法错误和未知用户。
(2)第2位指定应答的类别。
0:与命令的语法有关,(上述的)永久失败是使用它的唯一应答。
1:对附加信息请求的应答,仅由对help命令的应答使用。
2:通信通道。与通信通道有关的应答包括连接问候、quit命令和服务器关闭连接的通知。
5:邮件系统,有最大的变化。其他值仅用于3~5个命令,而这个值用于12个命令。
(3)第3位为前2位的各种组合提供更进一步的分类。对第3位的特定值没有特殊的意义,仅用于区分前2位的特定组合。
3)使用示例。在命令行上使用SMTP发送邮件:
dig -t A smtp.icoremail.net。以下是部分输出:
;; QUESTION SECTION: ;smtp.icoremail.net. IN A ;; ANSWER SECTION: smtp.icoremail.net. 600 IN CNAME mail1.icoremail.net. mail1.icoremail.net. 600 IN A 223.252.214.65 mail1.icoremail.net. 600 IN A 223.252.214.64
telnet 223.252.214.65 25。以下黑体字为用户输入的SMTP命令,灰体字为相应的SMTP应答,"//"后为注释:
helo localhost 250 OK auth login 334 dXNlcm5hbWU6 dGVzdA== // 用户名test的base64编码(`echo -n "test" | base64`) 334 UGFzc3dvcmQ6 YXN3MjM0Mndl // 密码asw2342we的base64编码 235 Authentication successful mail from:<test@coremail.cn> 250 Mail OK rcpt to:<31***09@qq.com> 250 Mail OK data 354 End data with <CR><LF>.<CR><LF> from:<test@coremail.cn> to:<31***09@qq.com> subject:A Test Mail. This is just a test mail. // 正文与subject之间需要一个空行 . 250 Mail OK queued as AQIMCgDHQz3qexZWMDIUAQ--.51371S2
关于base64编码可参考http://www.cnblogs.com/hanerfan/p/4079846.html
参考资料:
《Internet Email协议开发指南》
《TCP/IP详解 卷1:协议》
不断学习中。。。