POP3協議學習筆記

來源:互聯網
上載者:User

今日得閑,於是將POP3的學習筆記也整理出來!

互連網上的TCP/IP,POP3/SMTP等資料多如牛毛,這裡只是自己一點點心得,另外對於各位網路方面的大牛請安靜的路過,我可不喜歡在關公面前耍大刀...

(還是那句,我比較喜歡用實踐來證明一切,這樣才會加深自己的理解!)

 一、準備工作:

1、本機環境:Windows XP SP3、公司ADSL 10M光纖

2、開發工具:WildPackets OmniPeek V5.1.4

                    Visual C++ 6.0

                    Outlook Express6.0

                    FlexEdit V2.3.1871

 二、SMTP命令:
1、USER username
2、PASS password
3、STAT 請求伺服器發回關於郵箱的統計資料,如郵件總數和總位元組數
4、LIST 返回郵件數量和每個郵件的大小
5、RETR [Msg#] 返回由參數標識的郵件的全部文本
6、DELE [Msg#] 伺服器將由參數標識的郵件標記為刪除,由quit命令執行
7、RSET 伺服器將重設所有標記為刪除的郵件,用於撤消DELE命令
8、NOOP 伺服器返回一個肯定的響應
9、QUIT 更新

三、分析資料包:

1、開啟Outlook Express6.0,選擇POP協議,內容如下:

 

2、開始捕獲後點擊“內送郵件”,內容如下:

 

3、前面的資料包資訊、乙太網路資訊、IP頭、TCP頭就不用介紹了吧!

 

     資料包中包含到的命令都打圈標記了,下面是LIST返回的資料包:

 

4、下面是UIDL返回的資料包,郵件唯一的標示:

 

5、其他小技巧

     <CR> <LF>即對應C/C++中的"/r /n"

四、相關代碼:

1、以下代碼通過socket與POP3伺服器建立串連並讀取郵件清單、原文等。

 

     開啟Visual C++,建立一個控制台工程、並添加一個CPP檔案:

/************************************************************************/<br />/* main.cpp POP3協議學習筆記 - 串連POP3、讀取郵件清單、讀取郵件原文<br />/* by Koma 2009.9.10 14:10<br />/* http://blog.csdn.net/wangningyu<br />/************************************************************************/<br />#include "stdio.h"<br />#include "winsock2.h"<br />#pragmacomment(lib,"ws2_32.lib") </p><p>int main(int argc, char* argv[])<br />{<br />SOCKADDR_INsaServer;<br />LPHOSTENTlphostent;<br />WSADATAwsadata;<br />SOCKEThsocket;</p><p>intnRet;<br />char* host_name="pop.tom.com";<br />char* req=<br />// 兩行是登入使用者與密碼(以明文的方式發送)<br />"USER ningyusky@tom.com/r/n"<br />"PASS w*****/r/n"<br />"STAT/r/n"// 擷取信箱狀態<br />"LIST/r/n"// 擷取所以郵件清單資訊<br />"UIDL 1/r/n"// 擷取郵件1的唯一識別碼<br />"RETR 3/r/n"// 從伺服器讀取出郵件3原文<br />"QUIT/r/n";// 退出串連</p><p>// 初始化通訊端<br />if(WSAStartup(MAKEWORD(2,2),&wsadata))<br />printf("初始化SOCKET出錯!");</p><p>// SMTP連接埠預設是110<br />lphostent=gethostbyname(host_name);<br />if(lphostent==NULL)<br />printf("lphostent為空白!");<br />hsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);<br />saServer.sin_family = AF_INET;<br />saServer.sin_port = htons(110);<br />saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);</p><p>// 利用SOCKET串連<br />nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));<br />if(nRet == SOCKET_ERROR)<br />{<br />printf("建立串連時出錯!/n");<br />closesocket(hsocket);<br />return 0;<br />}</p><p>// 利用SOCKET發送<br />nRet = send(hsocket,req,strlen(req),0);<br />if(nRet==SOCKET_ERROR)<br />{<br />printf("發送資料包時出錯!");<br />closesocket(hsocket);<br />}</p><p>char Dest[20000];<br />memset(Dest,0,20000);<br />nRet=1;<br />while(nRet>0)<br />{<br />// 接收返回資料包<br />nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);<br />if(nRet>0)<br />Dest[nRet]=0;<br />else<br />Dest[0]=0;<br />// 顯示返回資料包的大小、內容<br />printf("/n返回資料包大小:%d/n",nRet);<br />printf("返回資料包內容:/n%s",Dest);<br />}<br />return 0;<br />} 

 

2、程式運行效果:

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.