http://home.eeworld.com.cn/my/space-uid-361439-blogid-360809.html
2016在写这篇帖子之前发表过一篇讨论SMTP实现的帖子,大伙的反馈还是挺热烈的,今天就说说SMTP到底是干嘛的。
首先来个官方对于SMTP协议的介绍:
SMTP(Simple Mail Transfer Protocol)即。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样,SMTP也存在两个 端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。 在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息,具体的介绍可以看我之前发的链接 http://home.eeworld.com.cn/my/space-uid-361439-blogid-343574.html
上面讲了那么多,其实SMTP就是一种
HELO;识别发送方到接收SMTP的一个HELLO命令
MAIL FROM:;为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件到一个或多个邮箱中。
RCPT TO:;标识各个接收者的地址
DATA
接收SMTP将把其后的行为看作邮件数据去处理,以.;标识数据的结尾。
REST;退出/复位当前的邮件传输
NOOP;要求接收SMTP仅做OK应答。(用于测试)
QUIT;要求接收SMTP返回一个OK应答并关闭传输。
VRFY;验证指定的邮箱是否存在,由于安全因素,多禁止此命令。
EXPN;验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。
HELP;查询服务器支持什么命令
没错,其实看起来很高大上的发送邮件邮件就是通过上面几条命令来实现的,现在我们拿Telnet来实现上面的功能:对于邮件服务器的端口如果不带SSL功能默认是25.下面我就拿新浪邮箱来做个简单的测试:
1:用telnet实现发送单封邮件功能,发送邮件的流程如下:
下面实现通过一个新浪邮箱向我QQ发送一个消息功能
也是大伙对于上面的应答码看不明白,可以看下我之前发的SMTP应答码解释
2:那如何实现一对多的模式发送邮件呢?
其实只要多次调用RCPT TO:;这条命令就行
对于ESP8266里面实现的WIFI邮件功能,其实就是将命令组合起来调用而已:
其实SMTP就是那么简单,要实现发送邮件的功能也就是上面几条命令而已,技术就是这样懂得永远觉得简单,不懂的永远觉得那么难,一下就到11点了,实现了SMTP协议也仅仅是实现了发送邮件功能,如果你想实现离线下载邮件,那就不得不提POP3协议了,由于时间原因,明晚继续~~~~~~~~~~~~~~~~
最后温馨提醒:CRLF是\r\n,在调试SMTP时,之前一直出现失败,主要原因是邮件服务器把邮件当作垃圾邮件处理了导致无法发送成功,所以大伙主要发送的主题不要随便写,尽量规避掉服务器的约束~~~~~~~~·~~~~