本文的主要內(nèi)容是通過兩種方式實(shí)現(xiàn)簡單郵件的接收,一種方式是通過C語言實(shí)現(xiàn),另一種是通過C#實(shí)現(xiàn)的,
兩種方式在實(shí)現(xiàn)上有許多的不同之處,但是本質(zhì)上都是一樣的.
一,C語言實(shí)現(xiàn)方式
C語言接收郵件的步驟:
1.創(chuàng)建TCP連接 端口:默認(rèn)110
2.連接到Pop3服務(wù)器 服務(wù)器名稱:例如"pop3.163.com"
3.認(rèn)證登錄 用戶賬號,密碼
4.發(fā)送請求,接收服務(wù)端信息 send(...) 返回"+OK"
a.獲取郵箱中郵件的數(shù)量 "STAT/r/n" 返回"+OK 10 ..."
b.獲取每個(gè)郵件的大小 "LIST/r/n"
c.獲取指定郵件的前n行數(shù)據(jù) "TOP [nMsg] [nLine]"
nMsg:第nMsg封
nLine:前nLine行
d.獲取指定郵件信息內(nèi)容 "RETR [nMsg]/r/n"
實(shí)現(xiàn)代碼如下:
//創(chuàng)建TCP連接
1 if ((connection = socket(AF_INET, SOCK_STREAM, ipPROTO_TCP)) == INVALID_SOCKET)2 {3 return INVALID_SOCKET;4 }
//連接到Pop3服務(wù)器
1 void ConnectToServer() 2 { 3 //設(shè)置SockAddr_In地址結(jié)構(gòu) 4 SOCKADDR_IN serAddr; 5 serAddr.sin_family = AF_INET; 6 serAddr.sin_port = htons(POP3_PORT);/*POP3_PORT=110*/ 7 //serverName="POP3.163.com"; 8 serAddr.sin_addr.s_addr = inet_addr(serverName); 9 if (serAddr.sin_addr.s_addr == INADDR_NONE)10 {11 LPHOSTENT lphost;12 lphost = gethostbyname(serverName);13 if (lphost != NULL)14 {15 serAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->S_un.S_addr;16 }17 else18 {19 WSASetLastError(WSAEINVAL);20 return;21 }22 //連接23 connect(connection, (SOCKADDR *)&serAddr, sizeof(serAddr)) 24 return; 25 26 }//接收數(shù)據(jù)
//獲取郵箱中郵件的數(shù)量
1 //獲取郵件的數(shù)量 2 int GetNumEmail(SOCKET connection) 3 { 4 char sStat[10]={"STAT/r/n"}; 5 char response_buf[RESPONSE_BUFFER_SIZE]={0}; 6 7 send(connection,sStat,strlen(sStat),0); 8 if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,0)==SOCKET_ERROR ) 9 return -1;10 11 char szResponse[20]={0};12 strncpy(szResponse,response_buf,3);13 if( strcmp(szResponse,"+OK")==0 ) //返回正確的消息內(nèi)容 "+OK 10..."14 return GetNumFromBuf(response_buf); 15 return 0;16 }//獲取每個(gè)郵件的大小
1 //獲取每個(gè)郵件的大小 2 BOOL GetList(SOCKET connection) 3 { 4 char szList[100]={0}; 5 sprintf(szList,"LIST/r/n"); 6 7 char response_buf[RESPONSE_BUFFER_SIZE]={0}; 8 send(connection,szList,strlen(szList),0); 9 if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,0)==SOCKET_ERROR )10 return FALSE;11 12 printf("receive data:%s",response_buf); //返回的數(shù)據(jù)13 return TRUE;14 }//獲取指定郵件的前n行數(shù)據(jù)
1 //獲取指定郵件的前n行數(shù)據(jù) 2 BOOL GetTop(SOCKET connection,int nMsg,int nLine) 3 { 4 char szTop[100]={0}; 5 sprintf(szTop,"TOP %d %d/r/n",nMsg,nLine); 6 7 char response_buf[RESPONSE_BUFFER_SIZE]={0}; 8 send(connection,szTop,strlen(szTop),0); 9 Sleep(nLine*20); // 延遲,等待數(shù)據(jù)完全接收完畢10 if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,0)==SOCKET_ERROR)11 return FALSE;12 13 printf("Receive Data:%s/n",response_buf);14 return TRUE;15 }//獲取指定郵件的內(nèi)容
1 //獲取指定郵件的內(nèi)容 2 BOOL GetEmail(SOCKET connection,int nMsg,char *msg) 3 { 4 char sRetr[100]={0}; 5 sprintf(sRetr,"RETR %d/r/n",nMsg); 6 7 char response_buf[RESPONSE_BUFFER_SIZE*10]={0}; 8 send(connection,sRetr,strlen(sRetr),0); 9 Sleep(1000); //必須添加延遲,以便能夠完整的接收數(shù)據(jù)10 if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE*10,0) ==SOCKET_ERROR )11 return FALSE;12 13 printf("Receive Data:%s/n",response_buf);14 return TRUE;15 }一,C#實(shí)現(xiàn)方式
C#接收郵件的步驟:
1.需要引入第三方的類庫(OpenPop.dll 官網(wǎng)下載地址:http://sourceforge.net/projects/hpop/) ,并且在項(xiàng)目中添加OpenPop的引用.
2.使用OpenPop.dll類庫中的Pop3Client類創(chuàng)建一個(gè)Pop3服務(wù)端的對象,
連接服務(wù)器,并進(jìn)行認(rèn)證登錄. host:pop3.163.com port:默認(rèn)110
3.通過Pop3Client對象中的方法收取郵件信息.
a.GetMessageCount() //獲取郵件的數(shù)量
b.GetMessage(int messageNumber) //獲取編號為messageNumber的郵件的內(nèi)容
c.GetMessageSize(int messageNumber) //獲取編號為messageNumber的郵件的大小
d.DeleteMessage(int messageNumber) //刪除編號為messageNumber的郵件(僅僅是標(biāo)記,只有QUIT之后才真正刪除)
//...
4.關(guān)閉連接,釋放資源.
部分代碼如下:
//創(chuàng)建PopClient對象,連接認(rèn)證
1 using( Pop3Client client=new Pop3Client() )2 {3 Client.Connect(host, Pop3_Port, false);4 5 //賬號,密碼,認(rèn)證方式6 Client.Authenticate(userAddr, passWord, AuthenticationMethod.Auto); //登錄認(rèn)證7 //...8 } //獲取郵箱中郵件的相關(guān)信息
1 //...2 int count=client.GetMessageCount(); //獲取郵箱總數(shù)3 int size=client.GetMessageSize(1); //獲取編號為1的郵件的大小4 OpenPop.Mime.Message msg=client.GetMessage(1); //獲取編號為1的郵件的內(nèi)容5 client.DeleteMessage(1); //標(biāo)記編號為1的郵件為"刪除" 6 7 //...
//獲取郵件的頭部以及附件信息
1 //... 2 OpenPop.Mime.Message msg=client.GetMessage(1); 3 4 //從msg中的Headers成員中獲取信息 5 string from=msg.Headers.From.Address; 6 string SendDate=msg.Headers.DateSent.ToLocalTime().ToString(); 7 string Subject=msg.Headers.Subject; 8 string Body=msg.FindFirstPlainTextVersion().GetBodyText(); 9 10 //獲取附件信息11 List<MessagePart> attachments=msg.FindAllAttachments();12 int attachCount=attachments.Count;13 if( attachCount>0 )14 {15 string fileName=attachments[0].FileName; //附件名稱16 17 //保存附件內(nèi)容18 using( FileStream fs=new FileStream(@"C:/01.txt",FileMode.OpenOrCreate) )19 {20 attachments[0].Save(fs);21 }22 }23 //...新聞熱點(diǎn)
疑難解答
圖片精選