一、POP(Post Office Protocol):郵局協議。使用TCP的110端口。目前主要使用POP3。安全
1)簡介服務器
下圖是POP的接口模型。在最高層,POP做爲客戶機和服務器之間的通訊協議實現。它把郵件從一個地方移至另外一個地方,使用基於文本的命令/應答對話機制(命令不區分大小寫),並使用CRLF做爲行的結束。缺省時,命令/應答序列是同步的,但POP提供了一個流水線擴展,放鬆了一次發送一個命令的要求。網絡
信件經過SMTP最終投遞到POP服務器,在客戶機取出信件前,它們一直存儲在遠程信箱(通常是POP服務器上的一個標準郵件夾)中。POP客戶機能夠鏈接到服務器,取出信件,並刪除它們。這就避免了使用PC做爲服務器(由於PC可能不老是鏈接到網絡),並且不須要在服務器上有一個MUA閱讀電子郵件。模塊化
POP接口模型不提供發送郵件的方法(大多數PC沒有全功能MTA,這要求它們的MUA把信件轉交給有全功能MTA的機器。大多數MUA只是簡單地包括足以把信件轉交給一個SMTP中繼服務器的代碼)。緣由不少(和IMAP同樣),如:各個電子郵件協議由IETF的不一樣工做組處理,容許這些協議的模塊化開發,對其餘協議有最少的依賴。oop
2)會話狀態:POP會話有三種狀態,每一個狀態表明會話生命期中的特定階段。性能
一個會話以authorization(驗證)狀態開始。在這個階段,除了驗證命令和quit外,其餘命令都是非法的。學習
一旦客戶機驗證經過,服務器鎖定信箱。這個鎖是爲了防止多個POP鏈接、IMAP鏈接或MUA從POP服務器更改信箱,但此時新的信件能夠加入信箱(當前POP鏈接訪問不到新信件)。信箱上鎖後,服務器發出成功應答,會話改變成transaction(事務)狀態。測試
會話保持在transaction狀態,直到發出quit命令或會話異常終止。若是發出quit命令,狀態改變成update(更新),服務器刪除標記爲刪除的全部信件;若是會話異常終止(如客戶端/服務器進程異常終止或自動註銷定時器到時),服務器就不進入update狀態,即便有等待的刪除郵件。由於用戶沒有主動結束會話,因此沒有辦法肯定是否重設(rset)了會話並取消任何等待的刪除。無論會話是否正確終止,信箱上的鎖都將被釋放。優化
3)標準命令ui
POP應答的成功和失敗分別使用「+OK」和「-ERR」指示。
可以使用telnet與POP服務器交互,如telnet 0 110鏈接到本機的POP服務器(安裝:apt-get install mailutils)。服務器收到到達的鏈接時,發出一行鏈接問候,指示服務器已經準備好會話。
## 服務器的鏈接問候。<>中依次是POP服務器進程的ID、服務器的當前時間戳以及主機名 +OK POP3 Ready <23360.1439647607@hanerfan>
(1)user命令:指定想要訪問的信箱。信箱名能夠是用戶名(如安裝mailutils後,本機上的用戶名和相應的密碼就能夠分別用做user和pass的參數),或是與特定用戶無關的特殊信箱。
注意,這裏無論指定的信箱是否存在,服務器都會返回「+OK」,由於拒毫不合法信箱名的服務器會爲可能的攻擊者提供一個方便的方法以嘗試合法的名字。只有在以後輸入pass命令後,服務器纔給出驗證的結果。
(2)pass命令:用於爲user命令指定的信箱提供密碼以做驗證。在分開命令和參數的初始空格後的任何空格被解釋爲密碼的一部分。
服務器若是不能得到對信箱的獨佔訪問鎖,它將應答一個錯誤,且會話保持在authorization狀態。
由下圖可知,pass提供的密碼在網絡上以明文傳輸。
(3)apop命令:user和pass命令的一個替換。用法:apop mailbox md5-digest-string。略。
(4)quit命令:終止會話,並從服務器斷開客戶機。
(5)noop命令:空操做。防止一個自動註銷定時器到時,或測試客戶機是否仍鏈接到服務器。僅在transaction狀態中是合法的。
(6)stat命令:請求信箱的大小信息(不包括標記爲刪除的信件)。僅在transaction狀態中合法。
服務器的應答含有信箱中信件的數目和信箱的大小(字節數)。
一些服務器之內部格式存儲信件,以實現性能的優化和所需存儲空間的減小。並且,它們報告的大小也多是基於內部存儲格式的。
(7)list命令:請求信箱中某個特定信件或全部信件(不包括標記爲刪除的信件)的大小信息。僅在transaction狀態中合法。
服務器的應答中含有message-number(1, 2, 3...)和對應信件的大小(字節數)。
(8)retr命令:取出某個信件(不能是標記爲刪除的信件)。僅在transaction狀態中合法。
服務器的應答以只有一個句點的行做爲結束。另外,正文中以"."開頭的行都會額外添加一個"."(防止單個句點引發客戶機提早結束信件的讀取)。
(9)top命令:取出某個信件(不能是標記爲刪除的信件)的信頭和指定的行數。僅在transaction狀態中合法。
行數指定爲0時,即只取出信頭和空行分隔行。
(10)dele命令:標記指定的信件爲刪除信件。這些信件只有在發出quit命令後才被刪除。僅在transaction狀態中合法。
(11)rset命令:復位POP會話。被標記爲刪除的信件將取消標記,quit時不刪除它們。不影響會話的狀態。僅在transaction狀態中合法。
(12)uidl命令:輸出指定信件或全部信件(不包括標記爲刪除的信件)的惟一標識符。僅在transaction狀態中合法。
在不一樣的POP會話之間,同一個信件的標識符是相同的。
4)示例。在命令行上使用POP訪問163郵箱:
dig -t A pop.163.com。如下是部分輸出:
;; QUESTION SECTION: ;pop.163.com. IN A ;; ANSWER SECTION: pop.163.com. 85859 IN CNAME pop3.163.idns.yeah.net. pop3.163.idns.yeah.net. 672 IN A 220.181.12.101
獲取到IP後,再使用命令telnet 220.181.12.101 110鏈接到POP服務器。能夠看到其後臺使用的是coremail的系統:
Trying 220.181.12.101... Connected to 220.181.12.101. Escape character is '^]'. +OK Welcome to coremail Mail Pop3 Server (163coms[726cd87d72d896a1ac393507346040fas])
固然,這裏只是做爲一個測試的例子,由於使用user和pass驗證是不安全的,而apop須要事先和服務器約定一個共享密鑰,也不太現實。
參考資料:
《Internet Email協議開發指南》
不斷學習中。。。