1.电子邮件系统的组成部分
1.用户代理(user agent)
2.邮件服务器(mail server)
3.简单邮件传输协议(simple mail transfer protocol,SMTP)
邮件服务器形成了电子邮件系统的核心。
邮箱(mailbox)是邮件服务器为用户单独开辟的一个空间。
邮件发送过程可以描述为:
报文从发送方的用户代理开始,传输到到发送方的邮件服务器。再由发送方的邮件服务器传输到接受方的邮件服务器。最后由接受方的邮件服务器分发到接受方的邮箱(mailbox)中。
报文队列:如果接受方的邮件服务器故障,那么发送方的邮件服务器会将要发送的报文存储在一个报文队列(massage queue)中,并在以后尝试发送。通常每30分钟左右就进行一次尝试。如果几天后仍然不能成功,服务器就删除该报文并以电子邮件的形式通知发送方。
smtp:在一个邮件服务器上同时运行着smtp的客户端和smtp的服务端。发送邮件时,smtp客户端起作用,接受邮件时smtp起作用。
2.SMTP
1.smtp的一个小的历史缺憾:
smtp限制所有邮件报文的体部分(不只是其首部)只能采用简单的7比特ASCII表示。在20世纪80年代早期,这种限制是明智的,因为当时传输能力不足,没有人会通过电子邮件发送大的附件或是大的图片、声音或者视频文件。然而,在今天的多媒体时代,7位ASCII的限制的确有点痛苦,即在用SMTP传送邮件之前,需要将二进制多媒体数据编码为ASCII码,并且在使用SMTP传输后要求将相应的ASCII码邮件解码还原为多媒体数据。
使用HTTP传送就不需要将多媒体数据编码为ASCII码。
2.邮件发送(ASCII报文)
假设Alice想给Bob发送一封简单的ASCII报文:
- Alice调用她的邮件代理程序并提供Bob的邮件地址(例如[email protected]),撰写报文,然后指示用户代理发送该报文。
- Alice的用户代理把报文发给她的邮件服务器,在那里该报文被放在报文队列中。
- 运行在Alice的邮件服务器上的SMTP客户端发现了报文队列中的这个报文,它就创建一个到运行在Bob的邮件服务器上的SMTP服务器的TCP连接。
- 在经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送Alice的报文。
- 在Bob的邮件服务器上,SMTP的服务器端接收该报文。Bob的邮件服务器然后将该报文放入Bob的邮箱中。
- 在Bob方便的时候,他调用用户代理阅读该报文。
SMTP一般不使用中间邮件服务器发送邮件。即发送方邮件服务器和接收方邮件服务器是直接连接的(TCP 25端口)。
- 在经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送Alice的报文。
- 在Bob的邮件服务器上,SMTP的服务器端接收该报文。Bob的邮件服务器然后将该报文放入Bob的邮箱中。
- 在Bob方便的时候,他调用用户代理阅读该报文。
一旦创建了TCP连接,就开始了如下过程:
s:220 hamburger.edu //表示连接邮件服务器成功
C:HELO crepes.fr //验证服务器 向服务器问好
C:MAIL FROM:<[email protected]> //验证发件人邮箱地址
C:RCPT TO:<[email protected]> //验证接收人地址
C:DATA //开始写邮件了
C:Do you like ketchup? //邮件内容
C: How about pickles? //邮件内容
C:. //CRLF.CRLF 表示报文结束 。CR和LF分别表示回车和换行。第一个CRLF是上一行末尾的回车和换行。
C: QUIT //断开连接
3.SMTP与HTTP对比
相同:
1.两个协议都是用于一台主机箱另一台主机传送文件。http是在web服务器向web客户(通常是一个浏览器)传送文件,smtp是在两个邮件服务器之间传送文件。
2.smtp和持续的http都是持续连接(长连接)。
区别:
1.http是一个拉协议(pull protocol),即用户使用http从服务器拉去这些信息。smtp是一个推协议(push protocol),即发送邮件服务器将文件推向接收邮件服务器。特别是,这个TCP连接是由要发送该文件的机器发起的。
2.smtp要求每个报文(包括他们的体)使用7比特ASCII码格式。如某报文包含了非7比特ASCII字符或二进制数据(如图形文件),则该报文必须按照7比特ASCII码进行编码。而http数据则不受这种限制。
3.对于如何处理既包含文本图形的文档。http把每个对象(多个文件对象)封装到它自己的http响应报文中,而smtp则把所有报文对象(多个报文)放在一个报文之中。
4.邮件报文格式和MIME
MIME协议( Multipurpose Internet Mail Extensions ),通用因特网邮件扩充协议 ,作为SMTP的一种辅助协议,其引入是为了克服SMTP的如下不足:
1.SMTP只能发送使用NVT( 虚拟网络终端 ) 7位ASCII码格式的报文,它不能使用NVT 7位ASCII码不支持的语言(如汉语,日语,德语等)。
2.SMTP不能传送可执行文件或其他二进制对象(如图像文件,这里的不能传送应该指的是接受方并不能确定接受数据的准确性和完整性)。
3.SMTP不支持音频或视频文件。
4.SMTP发送的邮件的长度受到限制。
为了克服以上的不足,便引入了MIME协议,MIME协议是一种扩展协议性的辅助协议,“扩充”指的是只是对原来协议的扩展,而不是取代。它允许非ASCII码数据能够通过电子邮件传送。MIME在发送方把非ASCII码数据转换为NVT ASCII数据,之后的工作再交给SMTP完成,在接收方再将NVT ASCII数据还原成原来的数据。MIME的体系结构如下:
- MIME定义了5种首部,用来加在原始的电子邮件部分以定义参数的转换,这五种首部分别是: MIME-Version(MIME版本 )、 Constent-Type ( 内容类型 )、 Content-Transfer-Encoding ( 内容-传送-编码 )、 Content-Id ( 内容-标识 )和 Content-Description ( 内容描述 )。
MIME版本 :定义了MIME使用的版本。
内容-类型 :定义报文主体使用的数据类型和子类型,用<数据类型/子类型>表示。
内容-传送-编码 :定义了邮件的主体在传送时是如何编码的。
内容-标识 :在多报文的环境中唯一地标识报文。
内容描述 :定义了主体是否为图像、音频或视频。
- 一个简单的MIME格式报文如下(应该就是smtp命令DATA后面的内容了):
1Date: Thu, 18 Apr 2002 09:32:45 +0800 //首部行
2From: <[email protected]> //首部
3 To:<[email protected]> //首部
4Subject: Test //首部
5 Mime-Version: 1.0 //首部
6 Content-Type: text/plain;charset="iso-8859-1" //首部
7 //空行
8 Thisis a simple mail. //报文体
- pop3
pop3是一个极为简单的邮件访问协议(pull protocol),由RFC1939进行定义。用户代理(客户)打开一个到邮件服务器端口110上的tcp连接。
pop3按照三个阶段:
特许(authorization)-->用户代理以明文形式发送用户名和密码以鉴别用户。
client: telnet mailserver 110 //与邮件服务器110端口建立tcp连接
server: +OK server ready //邮件服务器响应
client: user bob //用户名 bob
server: +OK
client: pass password //密码
server:+OK user successfully logged on
事务处理:
此阶段,用户代理从邮件服务器取回邮件报文(此阶段用户代理还能对邮件报文做删除标记和取消删除标记,以及获取邮件的统计信息)
c:list
s: 1 498 //报文1长度
s:2 912 //报文2长度
c:retr 1
s: (bla bla bla..............) //报文1
c: dele 2 //对报文2进行删除标记
c:quit
s:+OK POP3 server singing off //退出后,邮件服务器会删除邮件报文2
结束:
quit命令后,结束该pop3会话。
- IMAP
pop3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法。这会给那些移动用户带来不方便。
IMAP解决了此问题。IMAP服务器把每个报文与一个文件夹联系起来;报文第一次到达服务器时,它与收件人的inbox文件夹相关联。
IMAP的另一个重要特性时它具有允许用户代理获取报文组件的命令。例如,一个用户代理可以只读取一个报文的报文首部,或者只是一个多部分报文的一部分。当使用低宽带连接时,用户可能并不想取回他邮箱中的所有邮件,尤其要避免可能包含如音频或视频片段的大邮件。
- 基于Web的电子邮件
今天越来越多的用户使用web浏览器收发电子邮件。用户代理(不管时发送方还是接受方)与邮件服务器之间都是通过http进行通信,但是邮件服务器之间发送和收发邮件时仍然使用的时SMTP。
原文地址:https://www.cnblogs.com/chen-jack/p/10236691.html