一、电子邮件系统架构
电子邮件是一个典型的异步通信系统,发送方从UA,也就是邮件客户端,通过应用层SMTP协议,传输层tcp协议,发送给发送方的邮件服务器,比如使用的是163邮箱,163提供的SMTP服务器就是smtp.163.com发送方给这个地方发送。
之后,这个163 smtp服务器又会作为smtp客户端,再次通过应用层SMTP,传输层TCP给接收方的邮件服务器发邮件。
最后收件人会通过POP或IMAP协议,从他的POP3或IMAP服务器把他的邮件pop出来,还是走TCP连接。
注意这里都是客户端和服务器通信,走的都是典型的Client-Server架构。
例如,发送方邮件服务器,在接收发件人发来的邮件的时候,是作为服务器,然后他在给接收方邮件服务器送信的时候,是作为客户端。
这里我们把发送方邮件服务器——接收方邮件服务器这一大块,叫做电子邮件系统,这里面一定是走SMTP的。这之外,比如现在很多邮箱提供网页端,那么从发送方到发送方服务器这个过程就有可能走HTTP了,接收方服务器到接收方这里也是同理,可以走HTTP。
二、SMTP(Simple Mail Transfer Protocol)
整个过程的大部分应用层协议走的都是SMTP,先看看SMTP。
它主要规定了这个客户端和服务器通信的过程,不含加密和认证,而且SMTP只能传7bit-ASCII码,这是上古时代的ASCII码,只包含了前128个字符。看下面这个通信的过程。
客户端和服务器通过简单的helo来建立连接,然后说这是从谁来的,给谁发的。
之后是信息的头和body,最后在把连接断掉。
这是一个原来的简单的邮件的格式,包括这些很基础的内容。
后来发现我们要传一些别的,视频、音频、文件、甚至二进制代码,为了遵循开闭原则,不对原先的系统修改,只添加功能,那就需要一种方式把这些东西映射成7bit-ASCII码,再走SMTP。
三、MIME(Multipurpose Internet Mail Extension)
就有了这个MIME扩展,
它通过规定了很多的Content Type,来支持不同样式的信息。
来看这样一个例子,最上面的是MIME的头,接着就是Content,type是mutipart-alternative,里面就是各种格式的信息,他还定义了一个boundary,来分隔不同的信息。
例如下面第一个content-type是text/html,然后用那个boundary分隔,然后是mesage/external-body,最后是一个音频文件。
四、POP3和IMAP
就是很简单的从邮件服务器pop出来消息到本地。
看这里都是些很简单的消息,把邮件都list出来,把某个邮件retrieve出来,然后删除某个邮件,最后退出。
这里就是POP3的局限,只能把整个邮件POP出来才能看。
IMAP可以把邮件的一部分POP出来。