本文的主要內容是通過兩種方式實現簡單郵件的接收,一種方式是通過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 }