一、電子郵件系統架構
電子郵件是一個典型的異步通信系統,發送方從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出來。