POP3郵件服務器通過偵聽TCP端口110提供POP3服務。客戶端軟件讀取郵件之前,需要事先與服務器建立TCP連接。連接成功后,POP3服務器會向該客戶端發送確認消息。然后客戶端根據服務器回送的信息決定下一步的操作。
客戶端每次向POP3服務器發送命令后,都要等待服務器響應,並處理接收的信息,然后再接着發送下一個命令,如此往復多次,一直持續到連接終止。這個過程經歷了三個狀態:授權(AUTHORIZATION)狀態、操作(TRANSACTION)狀態和更新(UPDATE)狀態。
POP3服務器回送的響應信息由一個狀態碼和一個可能跟有附加信息的命令組成。所有響應也以回車換行結束(發送命令也是)。狀態碼有兩種:“確定”(“+OK”)和“失敗”(“-ERR”)。對於客戶端發送的每一條命令,服務器都會回送狀態碼。因此在客戶端程序中,可以通過服務器回送的狀態碼對應的字符,即判斷第一個字符是“+”號還是“-”號來確定服務器是否正確響應客戶端發送的命令。
1. 授權狀態
客戶端首先與POP3服務器建立TCP連接,服務器接收后發送一個單行的確認信息。例如“+OK POP3 server ready”,此時POP3會話就進入了授權狀態。在授權狀態,客戶需要向服務器發送用戶名和密碼進行確認。
假設用C表示客戶端(Client),S表示服務器端(Server),下面是客戶端接收郵件前需要與服務器傳輸的信息。
1) 發送用戶名。
語法形式:USER <用戶名>
功能:將客戶的用戶名發送到服務器。
服務器返回:+OK正確的用戶名;-ERR錯誤的用戶名。
示例:C:USER myname@126.com
S:+OK welcome on this server.
上述兩行代碼的含義為:客戶端發送“USER myname@126.com”,服務器端回送信息“+OK welcome on this server.”。
2) 用戶名確認成功后,需要輸入密碼。
語法形式:PASS <密碼>
功能:將客戶的密碼發送給服務器。
服務器返回:+OK正確的用戶名;-OK錯誤的用戶名。
示例:C:PASS *****
S:+OK myname logged in at 19:04
授權成功后,進入操作狀態。
2. 操作狀態
客戶端向服務器成功確認了自己的身份后,POP3會話將進入操作狀態,客戶就可以執行POP3命令進行相應的操作。對於每個命令,服務器都會返回應答信息。下面是在操作狀態中使用的命令。
(1) STAT命令
語法形式:STAT
功能:從服務器中獲取郵件總數和總字節數。
服務器返回:郵件總數和總字節數。
示例:C:STAT
S:+OK 2 320
(2) LIST命令
語法形式:LIST
功能:從服務中獲得郵件列表和大小。
服務器返回:列出郵件列表和大小。
示例:C:LIST(
LIST命令針對pop3郵箱會首先返回+ok 郵件總數 郵件總大小,但對於pop郵箱則只返回+ok狀態字符,因此最好還是通過STAT來判斷郵件總數)
S:+OK 2 messages (320 octets)
S:1 120
S:2 200
S: .
(3) RETR命令
語法形式:RETR <郵件的序號>
功能:從服務器中獲得一個郵件。
服務器返回:+OK成功;-ERR錯誤。
示例:C: RETR 1
S:+OK 120 octets
S:<服務器發送信件1內容>
S: .
注意,這里的“.”是單獨發送的。
(4) DELE命令
語法形式:DELE <郵件的序號>
功能:服務器將郵件標記為刪除,當執行QUIT命令時才真正刪除。(
可以通過R
S
ET 命令進行撤消刪除 )
服務器返回:+OK成功;-ERR錯誤。
示例:C:DELE 1
S:+OK 1 Deleted
當客戶發送QUIT命令時,會話進入更新狀態。
3. 更新狀態
當客戶在操作狀態下發送QUIT命令后,會話進入更新狀態。
QUIT命令
語法形式:QUIT
功能:關閉與服務器的連接。
服務器返回:+OK;-ERR。
示例:C:QUIT
S:+OK
然后服務器自動斷開與該客戶端的TCP連接。
郵件的未讀和已讀
uidl命令 格式:uidl [n] 參數n可選,n為郵件編號uidl命令,與list同,不過顯示郵件的信息比list更詳細,更具體
通過此命令來返回對應郵件的唯一號,然后在本地判斷是否已讀或未讀。
針對上面的命令,寫了一個沒有進行pop3解碼的接收郵件的客戶端,源代碼如下:/Files/fujinliang/ReceiveMailExample.rar
接下來將會對pop3解碼相關東西進行深入學習