[原创] 任性DIY——赤裸的技术人生之剥开SMTP的衣裳

wateras1   2016-6-14 23:10 楼主
        在写这篇帖子之前发表过一篇讨论SMTP实现的帖子,大伙的反馈还是挺热烈的,今天就说说SMTP到底是干嘛的。
      
        首先来个官方对于SMTP协议的介绍:         

         SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件
它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样,SMTP也存在两个 端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。 在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息,具体的介绍可以看我之前发的链接 https://home.eeworld.com.cn/my/space-uid-361439-blogid-343574.html

  
    上面讲了那么多,其实SMTP就是一种简单邮件传输协议,这种协议是基于传输层为TCP的应用层协议。你想要实现发送邮件的功能就得靠它了,其实这种协议也还是比较简单的,发送邮件的功能通过邮件协议命令来实现的,主要的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发送一个消息功能
1.png
也是大伙对于上面的应答码看不明白,可以看下我之前发的SMTP应答码解释
https://home.eeworld.com.cn/my/space-uid-361439-blogid-360779.html
2.png
2:那如何实现一对多的模式发送邮件呢?
其实只要多次调用RCPT TO:;这条命令就行
3.png
4.png
对于ESP8266里面实现的WIFI邮件功能,其实就是将命令组合起来调用而已:
https://bbs.eeworld.com.cn/thread-491842-1-1.html
其实SMTP就是那么简单,要实现发送邮件的功能也就是上面几条命令而已,技术就是这样懂得永远觉得简单,不懂的永远觉得那么难,一下就到11点了,实现了SMTP协议也仅仅是实现了发送邮件功能,如果你想实现离线下载邮件,那就不得不提POP3协议了,由于时间原因,明晚继续~~~~~~~~~~~~~~~~

最后温馨提醒:CRLF是\r\n,在调试SMTP时,之前一直出现失败,主要原因是邮件服务器把邮件当作垃圾邮件处理了导致无法发送成功,所以大伙主要发送的主题不要随便写,尽量规避掉服务器的约束~~~~~~~~·~~~~



淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目

回复评论 (8)

厉害
点赞  2016-6-14 23:15

本来打算用8266来讲解的,考虑到方便性就用telnet了
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-6-14 23:18
昨晚睡着了,没能及时看到你发帖!
RTEMS
点赞  2016-6-15 07:53
多谢分享
加油!在电子行业默默贡献自己的力量!:)
点赞  2016-6-15 09:45
引用: wateras1 发表于 2016-6-14 23:18
本来打算用8266来讲解的,考虑到方便性就用telnet了

嗯嗯,原理是一样的
点赞  2016-6-15 12:51

7楼 nmg 

I want to know

How  about the littleshrimp's Email box?
点赞  2016-6-15 14:07
引用: nmg 发表于 2016-6-15 14:07
I want to know

How  about the littleshrimp's Email box?

你太坏了,我发了就从此没人发原创帖了
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-6-15 19:49
引用: soso 发表于 2016-6-15 09:45
多谢分享

后面还有重头戏
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-6-15 20:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复