メールクライアントプログラミング(popとsmtp)

17488 ワード

環境:xpシステム、vc 6.0、c言語
ここではコードの下書きですが、もともと設計された構造は今の構造とは大きく違います.
実装された部分:
  • smtpプロトコルは、最も簡単なメールフォーマットの送信を完了することができ、受信者は正常に
  • を受信することができる.
  • base 64符号化は、任意の長さの文字列に対するbase 64符号化
  • を完了することができる.
  • base 64の復号は、単一バイトの復号
  • が完了しただけである.
  • popプロトコルは、基本的なサーバインタラクション命令を完了するだけであり、data部分の受信に対して
  • は実現する.
    私の考えは模索段階のコードは必ずc++を使用しないで、統合の最適化を行う時c++パッケージを使用することを考慮します
    また見ているとコードが乱れているような気がするかもしれませんが、よろしければアドバイスしてください
     
    #include <Winsock2.h>
    #include <stdio.h>
    #include <windows.h>
    #pragma comment(lib,"ws2_32.lib")
    #define PORTPOP 110
    #define PORTSMTP 25
    #define BUFF_BASE64 1024*1024*4  //  4M base64      ,2M     ,2M     
    char *buff_begin;//        
    unsigned long num_now;//        
    char *point_now;//            
    struct base64{
     char result;//base64      
     char residue;//        
     int  number;//     
    };
    char base64_char[64]={'A','B','C','D','E','F','G','H',
          'I','J','K','L','M','N','O','P',
          'Q','R','S','T','U','V','W','X',
          'Y','Z','a','b','c','d','e','f',
          'g','h','i','j','k','l','m','n',
          'o','p','q','r','s','t','u','v',
          'w','x','y','z','0','1','2','3',
          '4','5','6','7','8','9','+','/',};
    int chartonumber(base64 *data);   //  :         
    int transformtobase64(base64 *data); //  :      
    int transformstring(char *strings);  //  :      
    //         
    int condition_pop3=0; 
    int tcp_pop(SOCKET pop,sockaddr_in saddr,char *r_buffer,char *s_buffer);
    int tcp_smtp(char *r_buffer,char *s_buffer);
     char *name="servertss"; //   
     char *pasw="12345zxcvb";//  
     char *capa="CAPA";
     char *user="USER";//   
     char *pass="PASS";//  
     char *apop="APOP";//     MD5   
     char *stat="STAT";//           
     char *uidl="UIDL";//          
     char *list="LIST";//              
     char *retr="RETR";//               
     char *dele="DELE";//                 
     char *rset="RSET";//                ,    DELE  
     char *top="TOP";//               n   ,n      
     char *noop="NOOP";//            
     char *quit="QUIT";//    
     char *ok="+OK";//       
     char crlf[2]={'\r','
    '};//
     char *ehlo="EHLO";//  SMTP  
     char *auth="AUTH";
     char *login="LOGIN";
     char *mail="MAIL";//    
     char *from="FROM";//     
     char *rcpt="RCPT";//     
     char *data="DATA";//      
     char *vrfy="VRFY";//         /      
     char *expn="EXPN";//             ,      ,    
     char *help="HELP";//           
    int senddata(char *begin);
    int main()
    {
     WORD wVersionRequested;
     WSADATA wsaData;
     
     wVersionRequested=MAKEWORD(2,2);
     int err=WSAStartup(wVersionRequested,&wsaData);
     if(err!=0)
     {
      printf("WSAStartup      
    ");   return 0;  }
     buff_begin=(char *)malloc(BUFF_BASE64);
     if(!buff_begin)
      return 0;
     num_now=0;
     point_now=buff_begin;
     char request[512];//       
     char respond[512];//       
     //memset(request,'\0',512);
     //memset(respond,'\0',512);
     sockaddr_in saddr_pop;
     saddr_pop.sin_family=AF_INET;
     saddr_pop.sin_port=htons(PORTPOP);
     saddr_pop.sin_addr.s_addr= inet_addr("123.125.50.29");
     SOCKET client_pop;
     client_pop=socket(AF_INET,SOCK_STREAM,0);
     
    /*
     char *s="        ";
     transformstring(s);
     for(int i=0;i<num_now;i++)
     {
      printf("%c",*(buff_begin+i));
     }
     printf("
    "); */  int n=10;  while(n)  {   tcp_smtp(request,respond);   Sleep(30000);   n--;  } /*  int ii=senddata(buff_begin);  printf("%d",ii);  for(int i=0;i<ii;i++)  {   printf("%c",*(buff_begin+i));  } */  /*  tcp_pop(client_pop,saddr_pop,request,respond);
     bool brk=1;
     while(brk)//                 
     {
      Sleep(5000);
     }
    */
     WSACleanup();
     return 1;
    }
    //POP  
    int tcp_pop(SOCKET pop,sockaddr_in saddr,char *r_buffer,char *s_buffer)
    {
     int con=connect(pop,(struct sockaddr *)&saddr,sizeof(saddr));
     if(con==0)
      printf("TCP    
    ");  else   return 0;    //TCP  memset(r_buffer,'\0',512);  int rec=recv(pop,r_buffer,512,0);  printf("%s
    ",r_buffer);
     //CAPA  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,capa,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,6,0);
     //CAPA           
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     //USER  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,user,4);
     *(s_buffer+4)=' ';
     memcpy(s_buffer+5,name,9);
     memcpy(s_buffer+14,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,16,0);
     //USER           
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     //PASS  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,pass,4);
     *(s_buffer+4)=' ';
     memcpy(s_buffer+5,pasw,10);
     memcpy(s_buffer+15,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,17,0);
     //PASS    ,           
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     //STAT  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,stat,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,6,0);
     //STAT           ,           
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     //UIDL  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,uidl,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,6,0);
     //UIDL           ,          
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     //LIST  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,list,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,6,0);
     //LIST           ,              
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     //QUIT  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,quit,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s
    ",s_buffer);  send(pop,s_buffer,6,0);
     //QUIT           ,              
     memset(r_buffer,'\0',512);
     rec=recv(pop,r_buffer,512,0);
     printf("%s",r_buffer);
     
     return 1;
    }
    //SMTP  
    int tcp_smtp(char *r_buffer,char *s_buffer)
    {
     sockaddr_in saddr_smtp;
     saddr_smtp.sin_family=AF_INET;
     saddr_smtp.sin_port=htons(PORTSMTP);
     saddr_smtp.sin_addr.s_addr= inet_addr("123.125.50.134");
     SOCKET smtp;
     smtp=socket(AF_INET,SOCK_STREAM,0);
     int con=connect(smtp,(struct sockaddr *)&saddr_smtp,sizeof(saddr_smtp));
     if(con==0)
      printf("TCP    
    ");  else  {   return 0;  }
     //TCP                 
     memset(r_buffer,'\0',512);
     int rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //EHLO  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,ehlo,4);
     memcpy(s_buffer+5,name,9);
     memcpy(s_buffer+14,crlf,2);
     printf("%s",s_buffer);
     send(smtp,s_buffer,16,0);
     //EHLO           
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //AUTH  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,auth,4);
     *(s_buffer+4)=' ';
     memcpy(s_buffer+5,login,5);
     memcpy(s_buffer+10,crlf,2);
     printf("%s",s_buffer);
     send(smtp,s_buffer,12,0);
     //AUTH           
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //USER
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,"c2VydmVydHNz",12);
     memcpy(s_buffer+12,crlf,2);
     printf("%s",s_buffer);
     send(smtp,s_buffer,14,0);
     //USER         
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //PASS
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,"MTIzNDV6eGN2Yg==",16);
     memcpy(s_buffer+16,crlf,2);
     printf("%s",s_buffer);
     send(smtp,s_buffer,18,0);
     //PASS  
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //MAIL  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,mail,4);
     *(s_buffer+4)=' ';
     memcpy(s_buffer+5,"FROM: <);
     memcpy(s_buffer+30,crlf,2);
     printf("%s
    ",s_buffer);  send(smtp,s_buffer,32,0);
     //MAIL    
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //RCPT  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,rcpt,4);
     *(s_buffer+4)=' ';
     memcpy(s_buffer+5,"TO: <);
     memcpy(s_buffer+28,crlf,2);
     printf("%s",s_buffer);
     send(smtp,s_buffer,30,0);
     //RCPT    
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //DATA  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,data,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s",s_buffer);
     send(smtp,s_buffer,6,0);
     //DATA    
     int ii=senddata(buff_begin);
     send(smtp,buff_begin,ii,0);
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     //QUIT  
     memset(s_buffer,'\0',512);
     memcpy(s_buffer,quit,4);
     memcpy(s_buffer+4,crlf,2);
     printf("%s
    ",s_buffer);  send(smtp,s_buffer,6,0);
     //QUIT           ,              
     memset(r_buffer,'\0',512);
     rec=recv(smtp,r_buffer,512,0);
     printf("%s",r_buffer);
     closesocket(smtp);
     return 1;
    }
    // 2M            
    int senddata(char *begin)
    {
     int num=0;
     memcpy(begin,"Date: Sat,8 Mar 2014 22:36:04 +0800 (CST)",41);
     memcpy(begin+41,crlf,2);
     num+=43;
     memcpy(begin+num,"From: \"" <);
     memcpy(begin+num+45,crlf,2);
     num+=45+2;
     memcpy(begin+num,"To: servertss <);
     memcpy(begin+num+33,crlf,2);
     num+=33+2;
     memcpy(begin+num,"Subject: =?GB2312?B?YysrtcTEx7G+yunE47fF1NrExMDvwcs=?=",54);
     memcpy(begin+num+54,crlf,2);
     num+=54+2;
     memcpy(begin+num,"Mime-Version: 1.0",17);
     memcpy(begin+num+17,crlf,2);
     num+=17+2;
     memcpy(begin+num,"Message-ID: <);
     memcpy(begin+num+43,crlf,2);
     num+=43+2;
     memcpy(begin+num,"Content-Type: multipart/alternative;",36);
     *(begin+num+36)='
    ';  *(begin+num+37)='\t';  memcpy(begin+num+36+2,"boundary=\"----=_001_NextPart674370231387_=----\"",48);  memcpy(begin+num+36+2+48,crlf,2);  num+=36+2+48+2;
     memcpy(begin+num,crlf,2);
     num+=2;
     memcpy(begin+num,"------=_001_NextPart674370231387_=----",38);
     memcpy(begin+num+38,crlf,2);
     num+=38+2;
     memcpy(begin+num,"Content-Type: text/plain;",25);
     *(begin+num+25)='
    ';  *(begin+num+26)='\t';  memcpy(begin+num+25+2,"charset=\"GB2312\"",16);  memcpy(begin+num+25+2+16,crlf,2);  num+=25+2+16+2;
     memcpy(begin+num,"Content-Transfer-Encoding: base64",33);
     memcpy(begin+num+33,crlf,2);
     *(begin+num+33+2)='
    ';  num+=33+2+1;
     memcpy(begin+num,"CgoKYysrtcTEx7G+yunE47fF1NrExMDvwcsKy9m2yLjmy9/O0goK",52);
     num+=52;
     memcpy(begin+num,crlf,2);
     num+=2;
     memcpy(begin+num,"------=_001_NextPart674370231387_=----",38);
     memcpy(begin+num+38,crlf,2);
     num+=38+2;
     memcpy(begin+num,crlf,2);
     *(begin+num+2)='.';
     memcpy(begin+num+2+1,crlf,2);
     num+=2+1+2;
     return num;
    }
    //         ,         “+OK”       ,        
    /*
    int check_id(char *buff)
    {
     char id[4];
     char characters[500];
     memset(id,'\0',4);
     memset(characters,'\0',500);
     int i=0;
     for(i=0;i<4;i++)
     {
      id[i]=*(buff+i);
      i++;
     }
     
     switch(id)
     {
     case "+OK":
      break;
     }
     return 1;
    }
    */
    //      base64  
    int transformstring(char *strings)
    {
     int num=0;  //      
     int buf=0; //       
     base64 buf_transfer; //base64     
     memset(&buf_transfer,'\0',sizeof(buf_transfer));
     buf_transfer.result=*strings;
     buf_transfer.number=0;
     while(buf_transfer.result!='\0')//     ,     
     {
      if((0<=buf)&&(buf<6))
      {
       buf=transformtobase64(&buf_transfer);
       memcpy(point_now,&(buf_transfer.result),1);
       num++;
       buf_transfer.result=*(strings+num);
      }
      else
      {
       if(buf==6)
       {
        *point_now=base64_char[(unsigned int)buf_transfer.residue];
        buf_transfer.number=0;
        buf_transfer.residue='\0';
        buf=0;
       }
       else
        return buf;
      }
      point_now=point_now+1;
      num_now++;
     }
     if(buf_transfer.residue)
     {
      *point_now=base64_char[(unsigned int)(buf_transfer.residue<<(6-buf_transfer.number))];
      point_now++;
      num_now++;
     }
     buf=num%3;
     switch(buf)
     {
     case 0:
      break;
     case 1:
      memset(point_now,'=',2);
      point_now=point_now+2;
      num_now=num_now+2;
      break;
     case 2:
      *point_now='=';
      point_now++;
      num_now++;
      break;
     }
     return num;
    }
    int transformtobase64(base64 *data)//        base64  
    {
     if(data->number<0)
      return -1;
     if(data->number>6)
      return 8;
     char buf='\0',back='\0';
     buf=data->residue<<(6-data->number);
     back=data->result>>(2+data->number);
     buf=back^buf;
     buf&=63;
     back='\0';
     back=data->result<<(6-data->number);
     data->residue=back>>(6-data->number);
     data->result=base64_char[(unsigned int)buf];
     data->residue&=63;
     data->number=2+data->number;
     return data->number;
    }
    //      base64  
    int transformbase64(char *strings)
    {
     return 1;
    }
    int base64totransform(base64 *data)//        base64  
    {
     if(data->number<0)
      return -1;
     if(data->number>6)
      return 8;
     if(!chartonumber(data))//   6 
      return 0;
     char buf='0',back='0';
     buf=data->residue<<(8-data->number);
     if(data->number<3)
     {
      back=data->result;
      data->number+=6;
     }
     else{
      if(data->number<9)
      {
       back=data->result>>(data->number-2);
       data->result=data->result<<(10-data->number);
       data->residue=data->result>>(10-data->number);
       data->number=data->number-2;
       data->result=buf^back;
      }
     }
     data->residue=back^buf;
     if(data->number>7)
     {
      data->result=data->residue;
      data->residue='0';
      data->number=0;
     }
     return data->number;
    }
    int chartonumber(base64 *data)
    {
     //65-90:A-Z
     //97-122:a-z
     //48-57:0-9
     //43,47:+,/
     int cod=0;
     if(64<(int)(data->result)&&91>(int)(data->result))
     {
      cod=1;
      data->result=char((int)(data->result)-65);
     }
     if(96<(int)(data->result)&&123>(int)(data->result))
     {
      cod=1;
      data->result=char((int)(data->result)-97+26);
     }
     if(47<(int)(data->result)&&58>(int)(data->result))
     {
      cod=1;
      data->result=char((int)(data->result)-48+52);
     }
     if(43==(int)(data->result))
     {
      cod=1;
      data->result=0x2B;
     }
     if(47==(int)(data->result))
     {
      cod=1;
      data->result=0x2F;
     }
     if(cod)
      return 1;
     else
      return 0;
    }