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