網(wǎng)絡(luò)編程之POP3協(xié)議郵箱收信
POP3例子編程軟件:VS2015 語言:C/C++ 這里主要講解POP3郵箱收信
POP3協(xié)議的概述:
一、簡述:
1、功能:用于郵件的接收.
2、采用客戶端與服務(wù)器對話工作模式,命令由ASCII碼表示.(所謂的應(yīng)用層協(xié)議)
3、TCP監(jiān)聽端口號:110.
4、POP3為常用的POP協(xié)議第三版,簡稱為POP3.
二、POP3協(xié)議的三種狀態(tài):
1、確認狀態(tài):需要進行身份驗證,就是登陸郵箱賬號,登陸后轉(zhuǎn)為操作狀態(tài).
2、操作狀態(tài):查看郵件,郵件大小,數(shù)量.
3、更新狀態(tài):QUIT命令執(zhí)行后,將郵箱更新(刪除標記為刪除的郵件),然后立即重返確認狀態(tài)(需要重新身份驗證).
身份認證方式:
一、常用的是郵箱賬號密鑰身份認證.(這個不說了,就是登陸)
二、APOP命令認證方式:
1、為了避免發(fā)送[明文賬號密鑰]的問題,一些POP服務(wù)器采用APOP命令認證方式.
2、使用APOP命令會在傳輸之前被加密.
3、只有少數(shù)郵箱軟件使用APOP命令(如qpopper).
認證過程:初次與POP服務(wù)器連接時,服務(wù)器發(fā)送一個ASCII碼問候(一串字符串,唯一的,與當前時間有關(guān)),客戶端程序把純文本口令添加到ASCII碼問候字符串之后,然后計算出該字符串的MD5單出函數(shù)消息摘要,再將賬號與MD5消息摘要作為APOP命令的參數(shù)一起發(fā)送給服務(wù)器.
POP命令與服務(wù)器響應(yīng):
一、需要注意:
1、發(fā)送一個POP命令,服務(wù)器都會發(fā)送回來一個回應(yīng),表示成功與失敗.
2、郵件編碼:如郵件總數(shù)為5封,那么郵件編碼就是1~5.
3、下面的全部為字符串.
二、常用命令:
USERUSER 郵箱賬號rn登錄認證PASSPASS 郵箱密鑰rn登錄認證,登錄成功后,返回郵件總數(shù)和總字節(jié)數(shù)APOPAPOP 用戶名,MD5消息摘要rnAPOP方式登錄認證STATSTATrn郵件總數(shù)和總字節(jié)數(shù)UIDLUIDL 郵件編號rn
UIDLrn方式一:獲取指定郵件唯一標識符(每一個郵件都有一個唯一標識符)
方式二:獲取所有郵件的唯一標識符(每一個編碼,對應(yīng)它的ID)LISTLIST 郵件編號rn
LISTrn方式一:獲取指定郵件的字節(jié)大小(注意:不包括".rn"的長度)
方式二:獲取所有郵件的字節(jié)大小(每一個編碼,對應(yīng)它的大小)RETRRETR 郵件編號rn下載指定郵件,服務(wù)器會發(fā)送兩個封包,先發(fā)送長度(注意:不包括".rn"的長度)
再發(fā)送整個郵件DELEDELE 郵件編號rn將指定郵件標記為刪除,當退出連接或QUIT命令時刪除指定的郵件
被標識刪除的郵件,不能再使用其他命令對其進行訪問RSETRSETrn撤銷所有DELE命令TOPTOP 郵件編號 前n行rn下載郵件的前n行內(nèi)容,服務(wù)器會發(fā)送兩個封包,先發(fā)送長度
(注意:是總長度,而且不包括".rn"的長度)
再發(fā)送包括信頭的前n行郵件內(nèi)容NOOPNOOPrn讓服務(wù)器返回一個無意義的響應(yīng),僅能在操作狀態(tài)中使用QUITQUITrn返回到確認狀態(tài)(需重新身份驗證),并將標記為刪除的郵件都刪除
三、服務(wù)器響應(yīng):
+OK :命令執(zhí)行成功 ?
-ERR :錯誤
編寫郵件接收程序: ?(163郵箱為例)
一、注意:
1、每個郵件使用的字符集編碼可能是不同(UTF-8/GB2312),而且可能被Base64編碼加密.需要解析成明文.
二、客戶端步驟:
1、連接POP服務(wù)器,監(jiān)聽端口為110
2、發(fā)送USER和PASS進行明文身份驗證,PASS用的密鑰一般不是密碼了,是開啟POP服務(wù)時,提供給你的密鑰.
3、PASS發(fā)送后,會返回郵件總個數(shù)和總字節(jié)數(shù).
4、身份認證成功后,即可使用那幾條指令.(如:RETR命令查看指定的郵件).
5、QUIT退出并刪除標記為刪除的郵件.
6、由于代碼過多,不好再這里直接貼出來,我為使用POP3協(xié)議寫了一個C++類,可以很簡單的使用登錄郵箱,查看郵件,郵件大小,郵件ID,顯示郵件內(nèi)容等,有意學習登錄過程,解析郵件封包不同編碼的處理,可以下載學習一下:
POP3郵箱收信例子源碼下載地址:http://download.csdn.net/download/aaron133/10048490
實驗效果: