程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C和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 }


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved