1、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的不同工作組處理,允許這些協議的模塊化開發,對其他協議有最少的依賴。
2)會話狀態:POP會話有三種狀態,每個狀態代表會話生命期中的特定階段。
一個會話以authorization(驗證)狀態開始。在這個階段,除了驗證命令和quit外,其他命令都是非法的。
一旦客戶機驗證通過,服務器鎖定信箱。這個鎖是為了防止多個POP連接、IMAP連接或MUA從POP服務器更改信箱,但此時新的信件可以加入信箱(當前POP連接訪問不到新信件)。信箱上鎖后,服務器發出成功應答,會話改變成transaction(事務)狀態。
會話保持在transaction狀態,直到發出quit命令或會話異常終止。如果發出quit命令,狀態改變成update(更新),服務器刪除標記為刪除的所有信件;如果會話異常終止(如客戶端/服務器進程異常終止或自動注銷定時器到時),服務器就不進入update狀態,即使有等待的刪除郵件。因為用戶沒有主動結束會話,所以沒有辦法確定是否重設(rset)了會話並取消任何等待的刪除。不管會話是否正確終止,信箱上的鎖都將被釋放。
3)標准命令
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協議開發指南》
不斷學習中。。。