邮件服务器的SMTP
下面我们通过查看一个常见的情形来说明SMTP的基本操作。假设Alice给Bob发送一个简单的ASCII文本邮件消息:
●Alice调用自己的电子邮件用户代理,给出Bob的电子邮件地址,写好邮件内容,然后让用户代理发送本邮件消息。
●Alice的用户代理把该燃凳戚邮件消息发送到她的邮件服务器中,由邮件服务器把该消息排入某个消息队列中。
●运行在Alice的邮件服务器上的SMTP客户端看到消息队列中的这个邮件消息后,打开一个到运行在Bob的邮件服务器主机上的SMTP服务器端的TCP连接。
●经过最初的一些SMTP握手之后,SMTP客户把A1ice的邮件消息发送到TCP连接上。
●在Bob的邮件服务器主机上,SMTP服务器收到这个邮件消息后,把这个消息投递到Bob的邮箱中。
●Bob在方便的时候调用自己的电子邮件用户代理阅读该邮件消息。
需注意的是,SMTP通常不使用中间的邮件服务器主机中转邮件,即便源端和目的端邮件服务器主机位于地球上相反的位置也一样。假设Aiice的邮件服务器主机在香港,Bob的邮件服务器主机在阿拉巴马州,那么所建立的TCP连接将是这两台服务器主机之间的连接。具体地说,如果Bob的邮件服务器不工作了,那么A1ice发给Bob的邮件消息将存留在Alice的邮件服务器中等待新的尝试,而不会存放到某个中间的邮件服务器中。
下面查看SMTP把邮件消息从发送端邮件服务器传送到接收端邮件服务器的具体过程:
我们将看到,SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之后,SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信粗灶息之前先自我介绍一下。在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自皮陵我介绍完毕之后,客户发出邮件消息。SMTP可以指望由TCP提供的可靠数据传输服务把该消息无错地传送到服务器。如果客户还有其他邮件消息需发送到同一个服务器,它就在同一个TCP连接上重复上述过程;否则,它就指示TCP关闭该连接。
与HTTP的比较
我们简单地比较一下SMTP和HTTP。这两个协议都是用于从一台主机向另一台主机传送文件;HTTP用于从web服务器向Web用户代理(即浏览器)传送文件(或对象),SMTP用于从一个邮件服务器向另一个邮件服务器传送文件(也就是电子邮件消息)。在传送文件时,SMTP和持久HTTP都使用持久连接。可见,这两个协议具有一些共同的特征,不过它们之间的差别也是显著的。首先,HTTP基本上是一个内拉式协议(pull protocol)——有人把信息上传到web服务器中,用户则在方便的时候使用HTTP把这些信息从服务器上拉过来。更确切地说,HTTP连接是由想要接收文件的主机发起的。SMTP则基本上是一个外推式协议(push Protocol)——发送端邮件服务器把文件推送给接收端邮件服务器。更确切地说,SMTP连接是由想要发送文件的主机发起的。
SMTP和HTTP的第二个重要差别是,SMTP要求包括信体部分在内的每个邮件消息都是7位ASCII文本格式。