新手入门:了解邮件服务与相关协议<二>
我们简单地比较一下SMTP和HTTP。这两个协议都是用于从一台主机向另一台主机传送文件;HTTP用于从web服务器向Web用户代理(即浏览器)传送文件(或对象),SMTP用于从一个邮件服务器向另一个邮件服务器传送文件(也就是电子邮件消息)。在传送文件时,SMTP和持久HTTP都使用持久连接。可见,这两个协议具有一些共同的特征,不过它们之间的差别也是显著的。首先,HTTP基本上是一个内拉式协议(pull protocol)——有人把信息上传到web服务器中,用户则在方便的时候使用HTTP把这些信息从服务器上拉过来。更确切地说,TCP连接是由想要接收文件的主机发起的。SMIP则基本上是一个外推式协议(pushProtoco1)——发送端邮件服务器把文件推送给接收端邮件服务器。更确切地说,TCP连接是由想要发送文件的主机发起的。
SMTP和HTTP的第二个重要差别是,SMTP要求包括信体部分在内的每个邮件消息都是7位ASCII文本格式。另外,SMTP RFC还要求每个邮件消息的信体以仅由单个点号构成的一行结束,改用ASCII字符名称来说就是每个邮件消息的信体必须以“CRLF.CRLF“结尾,其中CR和LF分别代表回车符和换行符。这种方式下,当从同一个SMTP客户接收一系列邮件消息时,SMTP服务器可以通过在字节流中搜索“CRLF.CRLF”来分割每个消息。要是信体不是ASCII文本,而是二进制数据(譬如说一幅JPEG图像),那么这些二进制数据字节流中偶尔出现“CRLF.CRLF”这一模式是有可能的。这将导致SMTP服务器不正确地认定当前邮件消息已结束。为避免这样的问题,二进制数据应以一定的方式先编码成ASCII文本,保证其中不使用特定的ASCH字符(包括点号)。HTTP无论是持久的还是非持久的都不需要预先把二进制数据转换成ASCII本。对于持久的HTTP,每个TCP连接只传送一个对象:服务器关闭连接后,客户就知道己接收到一个完整的响应消息。对于非持久的HTTP,每个响应消息中包含一个Content-length:头部,使得客户能够确定每个响应消息的边界。
SMTP和HTTP的第三个重要差别涉及如何处理包含文本和图像或其他媒体类型的文档。HTTP是把每个对象封装在各自的HTTP响应消息中。SMTP(正如接下去要详细讨论的那样)是把同一个邮件内的各个对象置于同一个邮件消息中。
邮件消息格式和MIME
当Alice给Bob发一封普通的邮政信件时,她把这封信装入一个信封里,在信封上写明Bob的地址和自己的回信地址,然后投入邮箱;邮政业务在递送这封信的过程中,也会把表明时间和地点的邮戳盖在信封上。类似地,当电子邮件消息从一个人传送到另——个人时,在信体之前会有一个含有这些外围信息的信头。这些信息实际上由一系列在RFC 822中定义的邮件消息头部及其值构成。邮件消息中构成信头的各个头部和信体之间以一个空行(也就是CRLF)分割。RFC 822详细说明了各个邮件消息头部的格式和含义。与HTTP一样,邮件消息的每个头部都是直观可读的文本,由一个后跟冒号的关键字和相应的值构成。邮件消息的头部有些是必须的,有些则是司选的。每个信头必须有一个From:头部和一个To:头部.还可以有一个Subject:头部和其他头部。需注意的是,这些头部和先前讨论的SMTP命令不是一回事:SMTP命令是SMTP握手协议的一部分,邮件消息头部则属于邮件消息的一部分。
下面是一个典型的电子邮件信头:
From:alice@crepes.fr
To:bob@hamburger.edu
Subject:this is a test
信头之后空一行就是信体。整个消息以只含有一个点号的单独行结束。