C和C#兩種方式完成郵件的復雜接納。本站提示廣大學習愛好者:(C和C#兩種方式完成郵件的復雜接納)文章只能為提供參考,不一定能成為您想要的結果。以下是C和C#兩種方式完成郵件的復雜接納正文
本文的次要內容是經過兩種方式完成復雜郵件的接納,一種方式是經過C言語完成,另一種是經過C#完成的,
兩種方式在完成上有許多的不同之處,但是實質上都是一樣的.
一,C言語完成方式
C言語接納郵件的步驟:
1.創立TCP銜接 端口:默許110
2.銜接到Pop3服務器 服務器稱號:例如"pop3.163.com"
3.認證登錄 用戶賬號,密碼
4.發送懇求,接納服務端信息 send(...) 前往"+OK"
a.獲取郵箱中郵件的數量 "STAT\r\n" 前往"+OK 10 ..."
b.獲取每個郵件的大小 "LIST\r\n"
c.獲取指定郵件的前n行數據 "TOP [nMsg] [nLine]"
nMsg:第nMsg封
nLine:前nLine行
d.獲取指定郵件信息內容 "RETR [nMsg]\r\n"
完成代碼如下:
//創立TCP銜接
1 if ((connection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) 2 { 3 return INVALID_SOCKET; 4 }
//銜接到Pop3服務器
1 void ConnectToServer() 2 { 3 //設置SockAddr_In地址構造 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 else 18 { 19 WSASetLastError(WSAEINVAL); 20 return; 21 } 22 //銜接 23 connect(connection, (SOCKADDR *)&serAddr, sizeof(serAddr)) 24 return; 25 26 }
//接納數據
//獲取郵箱中郵件的數量
1 //獲取郵件的數量 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 ) //前往正確的音訊內容 "+OK 10..." 14 return GetNumFromBuf(response_buf); 15 return 0; 16 }
//獲取每個郵件的大小
1 //獲取每個郵件的大小 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); //前往的數據 13 return TRUE; 14 }
//獲取指定郵件的前n行數據
1 //獲取指定郵件的前n行數據 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); // 延遲,等候數據完全接納終了 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 }
//獲取指定郵件的內容
1 //獲取指定郵件的內容 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); //必需添加延遲,以便可以完好的接納數據 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#完成方式
C#接納郵件的步驟:
1.需求引入第三方的類庫(OpenPop.dll 官網下載地址:http://sourceforge.net/projects/hpop/) ,並且在項目中添加OpenPop的援用.
2.運用OpenPop.dll類庫中的Pop3Client類創立一個Pop3服務端的對象,
銜接服務器,並停止認證登錄. host:pop3.163.com port:默許110
3.經過Pop3Client對象中的辦法收取郵件信息.
a.GetMessageCount() //獲取郵件的數量
b.GetMessage(int messageNumber) //獲取編號為messageNumber的郵件的內容
c.GetMessageSize(int messageNumber) //獲取編號為messageNumber的郵件的大小
d.DeleteMessage(int messageNumber) //刪除編號為messageNumber的郵件(僅僅是標志,只要QUIT之後才真正刪除)
//...
4.封閉銜接,釋放資源.
局部代碼如下:
//創立PopClient對象,銜接認證
1 using( Pop3Client client=new Pop3Client() ) 2 { 3 Client.Connect(host, Pop3_Port, false); 4 5 //賬號,密碼,認證方式 6 Client.Authenticate(userAddr, password, AuthenticationMethod.Auto); //登錄認證 7 //... 8 }
//獲取郵箱中郵件的相關信息
1 //... 2 int count=client.GetMessageCount(); //獲取郵箱總數 3 int size=client.GetMessageSize(1); //獲取編號為1的郵件的大小 4 OpenPop.Mime.Message msg=client.GetMessage(1); //獲取編號為1的郵件的內容 5 client.DeleteMessage(1); //標志編號為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 //保管附件內容 18 using( FileStream fs=new FileStream(@"C:\01.txt",FileMode.OpenOrCreate) ) 19 { 20 attachments[0].Save(fs); 21 } 22 } 23 //...
參考頁面:
http://www.yuanjiaocheng.net/CSharp/Csharp-if-else.html
http://www.yuanjiaocheng.net/CSharp/Csharp-ternary-operator.html
http://www.yuanjiaocheng.net/CSharp/Cshartp-switch.html
http://www.yuanjiaocheng.net/CSharp/Csharp-for-loop.html
http://www.yuanjiaocheng.net/CSharp/Csharp-while-loop.html
it學習材料