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

王朝学院·作者佚名  2016-05-20
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航