当前位置:首页 > 技术问答集
firefox

一段SMTP发信的代码~~~

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

#ifdef   _debug  
  #include   <stdio.h>  
  #endif  
  #include   "gqpsvr.h"  
  #include   <winsock2.h>  
  #include   <windows.h>  
  //---------------------------------------------------------------------  
  void   base64(unsigned   char   chasc[3],unsigned   char   chuue[4]);  
  int   talk(socket   sockid,   const   char   *okcode,   char   *psend);  
  //---------------------------------------------------------------------  
  int   sendmail(const   smtpinfo   *psmtpinfo)  
  {  
          //准备网络连接  
          wsadata   wsadata;  
          if   (wsastartup(makeword(2,2),&wsadata)   !=   0){  
                  #ifdef   _debug  
                          printf("wsastartup()   error   :   %d\n",   getlasterror());  
                  #endif  
                  return   1;  
          }  
          //创建套接字  
          socket   sockid;  
          if   ((sockid   =   socket(af_inet,sock_stream,0))   ==   invalid_socket){  
                  #ifdef   _debug  
                          printf("socket()   error   :   %d\n",   getlasterror());  
                  #endif  
                  wsacleanup();  
                  return   1;  
          }  
          //得到smtp服务器ip  
          struct   hostent   *phostent   =   gethostbyname(psmtpinfo->smtpsrvname);  
          struct   sockaddr_in   addr;  
          copymemory(&addr.sin_addr.s_un.s_addr,  
                          phostent->h_addr_list[0],  
                          sizeof(addr.sin_addr.s_un.s_addr));  
          #ifdef   _debug  
                  struct   in_addr   srvaddr;  
                  copymemory(&srvaddr,   &addr.sin_addr.s_un.s_addr,   sizeof(struct   in_addr));  
                  printf("smtp   server   name   is   %s\n",   psmtpinfo->smtpsrvname);  
                  printf("smtp   server   ip   is   %s\n",   inet_ntoa(srvaddr));  
          #endif  
          addr.sin_family   =   af_inet;  
          addr.sin_port   =   htons(atoi(psmtpinfo->port));  
          zeromemory(&addr.sin_zero,   8);  
          //连接服务器  
          if   (connect(sockid,   (struct   sockaddr   *)&addr,   sizeof(struct   sockaddr_in))   ==   socket_error){  
                  #ifdef   _debug  
                          printf("connect()   error   :   %d\n",   getlasterror());  
                  #endif  
                  goto   stop;  
          }  
          if   (talk(sockid,   "220",   "ehlo   sjdf")){  
                  goto   stop;  
          }  
          if   (talk(sockid,   "250",   "auth   login")){  
                  goto   stop;  
          }  
          //将用户名和密码转换为base64编码  
          const   int   buflen   =   256;  
          char   buf[buflen];  
          int   i,userlen,passlen;  
          zeromemory(buf,   buflen);  
          userlen   =   lstrlen(psmtpinfo->username);  
          passlen   =   lstrlen(psmtpinfo->password);  
          for(i   =   0;   i   <   (userlen%3?userlen/3+1:userlen/3);   i++){  
                  base64(psmtpinfo->username   +   i   *   3,   buf   +   i   *   4);  
          }  
          if   (talk(sockid,   "334",   buf)){  
                  goto   stop;  
          }  
          zeromemory(buf,   buflen);  
          for(i   =   0;   i   <   (passlen%3?passlen/3+1:passlen/3);   i++){  
                  base64(psmtpinfo->password   +   i   *   3,   buf   +   i   *   4);  
          }  
          if   (talk(sockid,   "334",   buf)){  
                  goto   stop;  
          }  
          zeromemory(buf,   buflen);  
          wsprintf(buf,   "mail   from:<%s>",   psmtpinfo->from);  
          if   (talk(sockid,   "235",   buf)){  
                  goto   stop;  
          }  
          zeromemory(buf,   buflen);  
          wsprintf(buf,   "rcpt   to:<%s>",   psmtpinfo->to);  
          if   (talk(sockid,   "250",   buf)){  
                  goto   stop;  
          }  
          if   (talk(sockid,   "250",   "data")){  
                  goto   stop;  
          }  
          zeromemory(buf,   buflen);  
          wsprintf(buf,   "to:   %s\r\nfrom:   %s\r\nsubject:   %s\r\n%s\r\n\r\n.",  
                                          psmtpinfo->to,psmtpinfo->from,psmtpinfo->subject,psmtpinfo->msg);  
          if   (talk(sockid,   "354",   buf)){  
                  goto   stop;  
          }  
          if   (talk(sockid,   "250",   "quit")){  
                  goto   stop;  
          }  
          if   (talk(sockid,   "221",   "")){  
                  goto   stop;  
          }  
          else{  
                  closesocket(sockid);  
                  wsacleanup();  
                  return   0;  
          }  
  stop:  
          closesocket(sockid);  
          wsacleanup();  
          return   1;  
  }  
   
   
  //---------------------------------------------------------------------  
  int   talk(socket   sockid,   const   char   *okcode,   char   *psend)  
  {  
          const   int   buflen   =   256;  
          char   buf[buflen];  
          zeromemory(buf,   buflen);  
          //接收返回信息  
          if   (recv(sockid,   buf,   buflen,   0)   ==   socket_error){  
                  #ifdef   _debug  
                          printf("recv()   error   :   %d\n",   getlasterror());  
                  #endif  
                  return   1;  
          }  
          #ifdef   _debug  
                  printf("%s\n",   buf);  
          #endif  
          if   (strstr(buf,   okcode)   ==   null){  
                  #ifdef   _debug  
                          printf("error:   recv   code   !=   %s\n",   okcode);  
                  #endif  
                  return   1;  
          }  
          //发送命令  
          if   (lstrlen(psend)){  
                  zeromemory(buf,   buflen);  
                  wsprintf(buf,   "%s\r\n",   psend);  
                  #ifdef   _debug  
                          printf("%s\n",   buf);  
                  #endif  
                  if   (send(sockid,   buf,   lstrlen(buf),   0)   ==   socket_error){  
                          #ifdef   _debug  
                                  printf("send()   error   :   %d\n",   getlasterror());  
                          #endif  
                          return   1;  
                  }  
          }  
          return   0;  
  }  
  //---------------------------------------------------------------------  
  //base64编码,chasc:未编码的二进制代码,chuue:编码过的base64代码  
  void   base64(unsigned   char   chasc[3],unsigned   char   chuue[4])  
  {  
          int   i,k=2;  
          unsigned   char   t   =   0;  
          for(i=0;i<3;i++){  
                  *(chuue+i)=*(chasc+i)>>k;  
                  *(chuue+i)|=t;  
                  t=*(chasc+i)<<(8-k);  
                  t>>=2;  
                  k+=2;  
          }  
          *(chuue+3)=*(chasc+2)&63;  
          for(i=0;i<4;i++)  
                  if((*(chuue+i)>=0)&&(*(chuue+i)<=25))   *(chuue+i)+=65;  
                  else   if((*(chuue+i)>=26)&&(*(chuue+i)<=51))   *(chuue+i)+=71;  
                  else   if((*(chuue+i)>=52)&&(*(chuue+i)<=61))   *(chuue+i)-=4;  
                  else   if(*(chuue+i)==62)   *(chuue+i)=43;  
                  else   if(*(chuue+i)==63)   *(chuue+i)=47;  
  }    
   
  编译的时候总是提示base64(psmtpinfo->username   +   i   *   3,   buf   +   i   *   4)传入的参数不对,请问应该如何修改~

.

· 网友精彩回答:

© 2006-2008 All Rights Reserved