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 //...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM