zoukankan      html  css  js  c++  java
  • C和C#两种方式实现邮件的简单接收

      本文的主要内容是通过两种方式实现简单邮件的接收,一种方式是通过C语言实现,另一种是通过C#实现的,

    两种方式在实现上有许多的不同之处,但是本质上都是一样的.

    一,C语言实现方式

    C语言接收邮件的步骤:

    1.创建TCP连接   端口:默认110

    2.连接到Pop3服务器 服务器名称:例如"pop3.163.com"   

    3.认证登录      用户账号,密码

    4.发送请求,接收服务端信息   send(...)  返回"+OK"  

       a.获取邮箱中邮件的数量    "STAT " 返回"+OK 10 ..."  

       b.获取每个邮件的大小      "LIST " 

       c.获取指定邮件的前n行数据 "TOP [nMsg] [nLine]"        

                       nMsg:第nMsg封        

                       nLine:前nLine行

          d.获取指定邮件信息内容    "RETR [nMsg] "  

    实现代码如下:

    //创建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
    "};
     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
    ");
     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
    ",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
    ",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
    ",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
    ",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:1.txt",FileMode.OpenOrCreate) )
    19    {
    20       attachments[0].Save(fs);
    21    }
    22 }
    23 //...
  • 相关阅读:
    参考 ZTree 加载大数据量。加载慢问题解析
    script标签中type为<script type="text/x-template">是个啥
    最全的常用正则表达式大全
    利用split
    Lucene4.4.0 开发之排序
    scrollWidth,clientWidth,offsetWidth的区别
    JavaScript SetInterval与setTimeout使用方法详解
    JS实现悬浮移动窗口(悬浮广告)的特效
    $.ajax()方法详解
    DB2导入导出编目配置
  • 原文地址:https://www.cnblogs.com/miaosha5s/p/4188194.html
Copyright © 2011-2022 走看看