C和C#两种方式实现邮件的简单接收_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C和C#两种方式实现邮件的简单接收

C和C#两种方式实现邮件的简单接收

 2014/12/27 12:42:55  秒杀5S  程序员俱乐部  我要评论(0)
  • 摘要:本文的主要内容是通过两种方式实现简单邮件的接收,一种方式是通过C语言实现,另一种是通过C#实现的,两种方式在实现上有许多的不同之处,但是本质上都是一样的.一,C语言实现方式C语言接收邮件的步骤:1.创建TCP连接端口:默认1102.连接到Pop3服务器服务器名称:例如"pop3.163.com"3.认证登录用户账号,密码4.发送请求,接收服务端信息send(...)返回"+OK"a.获取邮箱中邮件的数量"STAT\r\n"返回"+OK10..."b.获取每个邮件的大小"LIST\r\n"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#基础-变量与常量(3) 下一篇: 没有下一篇了!
发表评论
用户名: 匿名