免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1029 | 回复: 0
打印 上一主题 下一主题

linux socket发送电子邮件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-19 18:39 |只看该作者 |倒序浏览

                网上搜了一搜,只有php版,java版,c#版,就是没有c/c++版,这是我拿php版翻译过来的代码:
  1. ///////////////////////
  2. //base64.h
  3. //base64编码与解码
  4. #include
  5. #include
  6. static char basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  7. #define CHAR64(c)  (((c)  127) ? -1 : index_64[(c)])
  8.      
  9. static signed char index_64[128] = {     
  10.         -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,     
  11.         -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,     
  12.         -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,     
  13.         52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,     
  14.         -1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,     
  15.         15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,     
  16.         -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,     
  17.         41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1     
  18. } ;
  19.      
  20. char *base64_encode(const char *value, int vlen) {
  21.     unsigned char oval = 0 ;      
  22.         char *result = (char *)malloc((vlen * 4) / 3 + 5) ;     
  23.         char *out = result;     
  24.     while (vlen >= 3) {     
  25.             *out++ = basis_64[value[0] >> 2];     
  26.             *out++ = basis_64[((value[0] > 4)];     
  27.             *out++ = basis_64[((value[1] > 6)];     
  28.             *out++ = basis_64[value[2] & 0x3F];     
  29.             value += 3;     
  30.                vlen -= 3;     
  31.         }
  32.     if (vlen > 0) {     
  33.             *out++ = basis_64[value[0] >> 2];     
  34.             oval = (value[0]  1) oval |= value[1] >> 4;     
  35.             *out++ = basis_64[oval];     
  36.             *out++ = (vlen > 4);     
  37.                  *rlen += 1;     
  38.                  if (c3 != '=') {     
  39.                      *out++ = ((CHAR64(c2) > 2);     
  40.                     *rlen += 1;     
  41.                     if (c4 != '=') {     
  42.                         *out++ = ((CHAR64(c3)
  43. #include
  44. #include
  45. #include
  46. #include
  47. #include
  48. #include
  49. #include
  50. /* 判断str开始的字符串是不是start*/
  51. int mail::start_str(char *str,const char *start)
  52. {
  53.     if(strstr(str,start)==str)
  54.         return true;
  55.     else
  56.         return false;
  57. }
  58. mail::mail(char    *smtp,char *welcome)
  59. {
  60.     if(strlen(smtp)smtp,smtp);
  61.     if(strlen(welcome)welcome,"localhost");
  62.     }
  63.     else
  64.         strcpy(this->welcome,welcome);
  65.     strcpy(this->lastmessage,"");
  66.     strcpy(this->lastact,"");
  67.     this->port=25;
  68. }
  69. /*将命令command发送到SMTP服务器,如果收到响应号为code,则返回true */
  70. int    mail::do_command(char *command,const char *code)
  71. {
  72.     strcpy(this->lastact,command);
  73.    
  74.     if(write(this->fp,this->lastact,strlen(this->lastact))fp,this->lastmessage ,512 )lastmessage,code))
  75.         return true;
  76.     else
  77.         return false;
  78. }
  79. int    mail::send(char *to,char *from,char *subject,char *message)
  80. {
  81.     char head[255];
  82.     sockaddr_in sa;
  83.     struct hostent *he;
  84.     sa.sin_family=AF_INET;
  85.     sa.sin_port=htons(25);
  86.   
  87.     if((he=gethostbyname(this->smtp))!=NULL)
  88.         bcopy(he->h_addr,&sa.sin_addr,he->h_length);
  89.     else
  90.     {
  91.         perror("gethostbyname");
  92.         exit(1);
  93.     }     
  94.    
  95.     strcpy(this->lastact,"connect");
  96.     this->fp=socket(AF_INET,SOCK_STREAM,0);
  97.     if ( this->fp )
  98.     {
  99.         if(connect(fp,(sockaddr*)&sa,sizeof(sockaddr))fp,this->lastmessage,512);
  100.         if ( !start_str(this->lastmessage,"220"))
  101.         {
  102.             return false;
  103.         }
  104.         else
  105.         {
  106.             strcpy(this->lastact,"HELO ");
  107.             strcat(this->lastact,this->welcome);
  108.             strcat(this->lastact,"\r\n");
  109.             fflush(stdout);
  110.             if(!this->do_command(this->lastact, "250"))
  111.             {
  112.                 printf("HELO\n");
  113.                 close(this->fp);
  114.                 return false;
  115.             }
  116.             strcpy(this->lastact,"AUTH LOGIN\r\n");
  117.             if(!this->do_command(this->lastact, "334"))
  118.             {
  119.                 printf("AUTH LOGIN\n");
  120.                 close(this->fp);
  121.                 return false;
  122.             }
  123.             char *code64=NULL;
  124.             char s1[] = "username";
  125.             code64=base64_encode(s1,strlen(s1));
  126.             strcpy(this->lastact,code64);
  127.             strcat(this->lastact,"\r\n");
  128.             if(!this->do_command(this->lastact, "334"))
  129.             {
  130.                 printf("user name\n");
  131.                 close(this->fp);
  132.                 return false;
  133.             }
  134.             
  135.             code64=NULL;
  136.             char s2[]="password";
  137.             code64=base64_encode(s2,strlen(s2));
  138.             strcpy(this->lastact,code64);
  139.             strcat(this->lastact,"\r\n");
  140.             if(!this->do_command(this->lastact, "235"))
  141.             {
  142.                 printf("passwd\n");
  143.                 close(this->fp);
  144.                 return false;
  145.             }
  146.                         
  147.             strcpy(this->lastact,"MAIL FROM: ");
  148.             strcat(this->lastact,from);
  149.             strcat(this->lastact,"\r\n");
  150.             
  151.             if(!this->do_command(this->lastact, "250"))
  152.             {
  153.                 printf("MAIL FROM");
  154.                 close(this->fp);
  155.                 return false;
  156.             }
  157.             strcpy(this->lastact,"RCPT TO: ");
  158.             strcat(this->lastact,to);
  159.             strcat(this->lastact,"\r\n");
  160.             if(!this->do_command(this->lastact, "250"))
  161.             {
  162.                 close(this->fp);
  163.                 return false;
  164.             }
  165.             strcpy(this->lastact,"DATA\r\n");
  166.             if(!this->do_command(this->lastact, "354"))
  167.             {
  168.                 close(this->fp);
  169.                 return false;
  170.             }
  171.             strcpy(head,"Subject: ");
  172.             strcat(head,subject);
  173.             strcat(head,"\r\n");
  174.             if(strlen(subject)>0)
  175.             {
  176.                 write(this->fp,head,strlen(head));
  177.             }
  178.             strcpy(head,"From: ");
  179.             strcat(head,from);
  180.             strcat(head,"\r\n");            
  181.             if(strlen(from)>0)
  182.             {
  183.                 write(this->fp,head,strlen(head));
  184.              }
  185.             strcpy(head,"To: ");
  186.             strcat(head,to);
  187.             strcat(head,"\r\n");            
  188.             if(strlen(to)>0)
  189.             {
  190.                 write(this->fp,head,strlen(head));
  191.             }
  192.             strcpy(head,"Content-Type: text/plain; charset=gbk\r\n");
  193.             if(strlen(head)>0)
  194.             {
  195.                 write(this->fp,head,strlen(head));
  196.             }
  197.             strcpy(head,"Content-Transfer-Encoding: base64\r\n");
  198.             if(strlen(head)>0)
  199.             {
  200.                 write(this->fp,head,strlen(head));
  201.             }
  202.             code64=NULL;
  203.             strcat(head,message);
  204.             strcat(head,"\r\n");
  205.             code64=base64_encode(head,strlen(head));
  206.             strcpy(message,code64);
  207.          
  208.             write(this->fp,message,strlen(message));
  209.             
  210.             strcpy(message,"\r\n.\r\n");
  211.             
  212.             write(this->fp, message,strlen(message));
  213.             strcpy(this->lastact,"QUIT\r\n");
  214.             if(!this->do_command(this->lastact, "250"))
  215.             {
  216.                 close(this->fp);
  217.                 return false;
  218.             }
  219.         }
  220.         return true;
  221.     }
  222.     else
  223.     {
  224.         printf("Connect failed!");
  225.         return false;
  226.     }
  227. }
  228. int main()
  229. {
  230.     char email[255]="Hello, this is a test letter!";
  231.     class mail *sendmail=new mail("smtp.163.com", "xyzxy");
  232.     if(sendmail->send("", "", "test", email))
  233.     {
  234.         printf("发送成功!\n");
  235.     }
  236.     else
  237.     {
  238.         printf("发送失败!\n");
  239.     }
  240.     return 0;
  241. }
复制代码
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104100/showart_2056012.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP