免费注册 查看新帖 |

Chinaunix

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

有人做过Linux下的邮件客户端吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-04 00:43 |只看该作者 |倒序浏览
我想通过SMTP和POP3协议完成数据同步的功能,所以希望能裁减一个邮件客户端的代码并加入我自己的代码来实现这个功能,有谁做过Linux下的用C语言写的邮件客户端啊?或者推荐一个可供裁减的Linux C邮件客户端,只要这个客户端实现了SMTP和POP3协议就行了,不需要其他功能,而且越简单越好,各位大大帮帮忙啊。

[ 本帖最后由 cugb_cat 于 2007-2-4 00:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-03-05 16:24 |只看该作者

  1. /***************************************************
  2. *                   mail sender (1.0)
  3. *               Author:wangdeju   2005-11
  4. ****************************************************/
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include <string.h>
  9. #include <netdb.h>
  10. #include <sys/types.h>
  11. #include <netinet/in.h>
  12. #include <sys/socket.h>

  13. #define SMTPSERVPORT 25
  14. #define MAXDATASIZE 1024
  15. #define MAXMAILSIZE 4096000
  16. char *blank="\r\n";
  17. char *blank2=">\r\n";
  18. char *blank3="\r\n\r\n";
  19. char *blank4=".\r\n";
  20. char *blank5=">\r\n\r\n";
  21. int sockfd;

  22. /*base64 encoding*/
  23. int base64(char *s,char *d)
  24. {
  25. char CharSet[64]={
  26. 'A','B','C','D','E','F','G','H',
  27. 'I','J','K','L','M','N','O','P',
  28. 'Q','R','S','T','U','V','W','X',
  29. 'Y','Z','a','b','c','d','e','f',
  30. 'g','h','i','j','k','l','m','n',
  31. 'o','p','q','r','s','t','u','v',
  32. 'w','x','y','z','0','1','2','3',
  33. '4','5','6','7','8','9','+','/'};
  34. unsigned char In[3];
  35. unsigned char Out[4];
  36. int cnt=0;

  37. if(!s||!d) return 0;

  38. for(;*s!=0;)
  39. {
  40. if(cnt+4>76)
  41. {
  42. *d++='\n';
  43. cnt=0;
  44. }
  45. if(strlen(s)>=3)
  46. {
  47. In[0]=*s;
  48. In[1]=*(s+1);
  49. In[2]=*(s+2);
  50. Out[0]=In[0]>>2;
  51. Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
  52. Out[2]=(In[1]&0x0f)<<2|(In[2]&0xc0)>>6;
  53. Out[3]=In[2]&0x3f;
  54. *d=CharSet[Out[0]];
  55. *(d+1)=CharSet[Out[1]];
  56. *(d+2)=CharSet[Out[2]];
  57. *(d+3)=CharSet[Out[3]];
  58. s+=3;
  59. d+=4;
  60. }
  61. else if(strlen(s)==1)
  62. {
  63. In[0]=*s;
  64. Out[0]=In[0]>>2;
  65. Out[1]=(In[0]&0x03)<<4|0;
  66. *d=CharSet[Out[0]];
  67. *(d+1)=CharSet[Out[1]];
  68. *(d+2)='=';
  69. *(d+3)='=';
  70. s+=1;
  71. d+=4;
  72. }
  73. else if(strlen(s)==2)
  74. {
  75. In[0]=*s;
  76. In[1]=*(s+1);
  77. Out[0]=In[0]>>2;
  78. Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
  79. Out[2]=(In[1]&0x0f)<<2|0;
  80. *d=CharSet[Out[0]];
  81. *(d+1)=CharSet[Out[1]];
  82. *(d+2)=CharSet[Out[2]];
  83. *(d+3)='=';
  84. s+=2;
  85. d+=4;
  86. }
  87. cnt+=4;
  88. }
  89. *d='\0';
  90. return 1;
  91. }


  92. /*print the usage*/
  93. int usage(char *proName)
  94. {
  95. printf("usage:%s smtpserver user passwd mailfrom rcptto subject sendfile flag[0/1]\n",proName);
  96. printf("      sendfile is the file contant the mail body\n");
  97. printf("      flag 1:MIME Support 0:Not\n");
  98. printf("      author wangdeju mail:wanderjeep@sohu.com \n");
  99. return 1;
  100. }

  101. /*  chech The Status through the Message receive from Smtp Server */
  102. int chechSendEchoStatus(char *echoStatus)
  103. {
  104. char c;
  105. int i;
  106. c=*echoStatus;
  107. i=(int)c;
  108. switch (i)
  109. { case 50:
  110.         return 1;
  111.          break;
  112.    case 51:
  113.         return 1;
  114.           break;
  115.    case 53:
  116.         return 0;
  117.           break;
  118.    default:
  119.         return 0;
  120. }
  121. }

  122. /*send mail procotol */
  123. int sendMail(int d_sockfd,char *d_uid,char *d_pass,char *d_from,char *d_recp,char *d_data)
  124. {
  125.   int iLength;
  126.   char *buf;
  127.   char *myd_pass,*myd_uid;
  128.   char *mailFrom,*recpTo;


  129.   buf=(char *)malloc(MAXDATASIZE);
  130.   if(buf==NULL)
  131.       return 1000;

  132.   mailFrom=(char *)malloc(strlen(d_from)+strlen("MAIL FROM:<")+strlen(blank2));
  133.    if(mailFrom==NULL)
  134.       return 1000;

  135.   recpTo=(char *)malloc(strlen(d_recp)+strlen("RCPT TO:<")+strlen(blank2));
  136.    if(recpTo==NULL)
  137.       return 1000;


  138.   strcpy(mailFrom,"MAIL FROM:<");
  139.   strcpy(mailFrom+strlen("MAIL FROM:<"),d_from);  
  140.   strcpy(mailFrom+strlen("MAIL FROM:<")+strlen(d_from),blank2);
  141.   recpTo=strcpy(recpTo,"RCPT TO:<");
  142.   strcpy(recpTo+strlen("RCPT TO:<"),d_recp);  
  143.   strcpy(recpTo+strlen("RCPT TO:<")+strlen(d_recp),blank2);
  144.   
  145.   myd_uid=(char *)malloc(strlen(d_uid)+strlen(blank));
  146.   if(myd_uid==NULL)
  147.       return 1000;

  148.   myd_pass=(char *)malloc(strlen(d_pass)+strlen(blank));
  149.   if(myd_pass==NULL)
  150.       return 1000;

  151.   strcpy(myd_uid,d_uid);
  152.   strcpy(myd_uid+strlen(d_uid),blank);
  153.   strcpy(myd_pass,d_pass);
  154.   strcpy(myd_pass+strlen(d_pass),blank);

  155.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  156.   printf("------------LOGIN------------------\n");
  157.   printf("received: %s \n",buf);
  158.    

  159.   send(d_sockfd,"HELO SMTP\r\n",strlen("HELO SMTP\r\n"),0);
  160.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  161.   printf("------------HELO  SENT------------------\n");
  162.   printf("received: %s \n",buf);
  163.   if(chechSendEchoStatus(buf)!=1)
  164.        return 1200;
  165.    

  166.   send(d_sockfd,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0);
  167.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  168.   printf("-------------AUTH LOGIN SENT--------------------------\n");
  169.   printf("received: %s\n",buf);
  170.   if(chechSendEchoStatus(buf)!=1)
  171.        return 1201;
  172.   
  173.   send(d_sockfd,myd_uid,strlen(myd_uid),0);
  174.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  175.   printf("--------------------BASE64 UID SENT--------\n");
  176.   printf("received: %s\n",buf);
  177.   if(chechSendEchoStatus(buf)!=1)
  178.        return 1202;

  179.   send(d_sockfd,myd_pass,strlen(myd_pass),0);
  180.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  181.   printf("-------------------BASE64 PASS SENT----------------------\n");
  182.   printf("received: %s\n",buf);
  183.   if(chechSendEchoStatus(buf)!=1)
  184.        return 1203;

  185.   send(d_sockfd,mailFrom,strlen(mailFrom),0);
  186.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  187.   printf("------------------MAIL FROM SENT----------------------\n");
  188.   printf("received: %s\n",buf);
  189.   if(chechSendEchoStatus(buf)!=1)
  190.        return 1204;

  191.   send(d_sockfd,recpTo,strlen(recpTo),0);
  192.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  193.   printf("--------------------RCPT TO SENT----------------------\n");
  194.   printf("received: %s\n",buf);
  195.   if(chechSendEchoStatus(buf)!=1)
  196.        return 1205;

  197.   send(d_sockfd,"DATA\r\n",strlen("DATA\r\n"),0);
  198.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  199.   printf("--------------------DATA SENT--------------\n");
  200.   printf("received: %s\n",buf);
  201.   if(chechSendEchoStatus(buf)!=1)
  202.        return 1206;


  203.   
  204.   send(d_sockfd,d_data,strlen(d_data),0);
  205.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  206.   printf("------------------DATA BODY SENT--------------\n");
  207.   printf("received: %s\n",buf);
  208.   if(chechSendEchoStatus(buf)!=1)
  209.        return 1207;
  210.   

  211.   send(d_sockfd,"QUIT\r\n",strlen("QUIT\r\n"),0);
  212.   iLength=recv(d_sockfd,buf,MAXDATASIZE,0);
  213.   printf("---------------QUIT------------\n");
  214.   printf("received: %s\n",buf);
  215.   if(chechSendEchoStatus(buf)!=1)
  216.        return 1208;

  217.   free(buf);
  218.   free(myd_uid);
  219.   free(myd_pass);
  220.   free(mailFrom);
  221.   free(recpTo);
  222.   return 1;
  223. }

  224. /*create mail head and body and support for MIME*/
  225. int createMailInfo(char *fileName,char *mailDataInfo,char *subject,char *mailFrom,char *to,int flag)
  226. {
  227.   FILE *fp;
  228.   char c;
  229.   int readcount;
  230.   
  231.   readcount=0;
  232.   
  233.         fp=fopen(fileName,"r");
  234.         if(fp==NULL)
  235.          return 1001;
  236. /*check if memory overflow ;think the other protocol char size  is 1024*/       
  237. if(strlen(subject)+strlen(mailFrom)+strlen(to)+1024>MAXMAILSIZE)
  238.          return 1300;

  239. /*MAIL HEAD  */
  240.   strcpy(mailDataInfo,"Subject:");
  241.   readcount=readcount+strlen("Subject:");
  242.   strcpy(mailDataInfo+readcount,subject);
  243.   readcount=readcount+strlen(subject);
  244.   strcpy(mailDataInfo+readcount,blank);
  245.   readcount=readcount+strlen(blank);
  246. /* MIME SUPPORT */
  247. if(flag==1) {
  248.   strcpy(mailDataInfo+readcount,"MIME-Version: 1.0\r\nContent-Type: text/html\r\n");
  249.   readcount=readcount+strlen("MIME-Version: 1.0\r\nContent-Type: text/html\r\n");
  250. }
  251.   strcpy(mailDataInfo+readcount,"From:<");
  252.   readcount=readcount+strlen("From:<");
  253.   strcpy(mailDataInfo+readcount,mailFrom);
  254.   readcount=readcount+strlen(mailFrom);
  255.   strcpy(mailDataInfo+readcount,blank2);
  256.   readcount=readcount+strlen(blank2);
  257.   strcpy(mailDataInfo+readcount,"To:<");
  258.   readcount=readcount+strlen("To:<");
  259.   strcpy(mailDataInfo+readcount,to);
  260.   readcount=readcount+strlen(to);
  261.   strcpy(mailDataInfo+readcount,blank5);
  262.   readcount=readcount+strlen(blank5);

  263.   /*MAIL BODY and avoid the memory overflow*/
  264.   while((c=fgetc(fp))!=EOF && readcount<MAXMAILSIZE-6) {
  265.     strcpy(mailDataInfo+readcount,&c);
  266.     readcount++;
  267. }

  268.   strcpy(mailDataInfo+readcount,blank4);
  269.   readcount=readcount+strlen(blank4);
  270.   strcpy(mailDataInfo+readcount,"\0");
  271.   fclose(fp);
  272.        
  273.         return 1;
  274. }


  275. /*connetct to smtp server*/
  276. int connectToServer(char *hostName)
  277. {
  278. struct hostent *host;
  279. struct sockaddr_in serv_addr;

  280. if((host=gethostbyname(hostName))==NULL)
  281.    return 1011;

  282.   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  283.     return 1012;
  284.    
  285.    serv_addr.sin_family=AF_INET;
  286.    serv_addr.sin_port=htons(SMTPSERVPORT);
  287.    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
  288.    bzero(&(serv_addr.sin_zero),8);
  289.   if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
  290.      return 1013;
  291.    
  292.    return 1;
  293. }


  294. /*translate the error num to message and print it*/
  295. void showErrorMsg(int i)
  296. {
  297.   switch(i) {
  298.     case 1000:
  299.       printf("Can not alloc memory\n");
  300.       break;
  301.     case 1001:
  302.       printf("Can not Open file\n");
  303.        break;
  304.     case 1011:
  305.       printf("Get host by name error\n");
  306.        break;
  307.     case 1012:
  308.       printf("Create socket error\n");
  309.        break;
  310.     case 1013:
  311.       printf("Connect to smtp server error\n");
  312.        break;
  313.     case 1021:
  314.       printf("Read conf file smtp.conf\n");
  315.        break;  
  316.     case 1200:
  317.        printf("Send HELO Error\n");
  318.        break;
  319.     case 1201:
  320.        printf("Send AUTH LOGIN Error\n");
  321.        break;
  322.     case 1202:
  323.        printf("Send UID Error\n");
  324.        break;
  325.     case 1203:
  326.        printf("Send PASS Error\n");
  327.        break;
  328.     case 1204:
  329.        printf("Send MAIL FROM  Error\n");
  330.        break;
  331.     case 1205:
  332.        printf("Send RCPT TO Error\n");
  333.        break;
  334.     case 1206:
  335.        printf("Send DATA Error\n");
  336.        break;
  337.     case 1207:
  338.        printf("Send DATA BODY Error\n");
  339.        break;
  340.     case 1208:
  341.        printf("Send QUIT\n");
  342.        break;
  343.     case 1300:
  344.        printf("To avoid memory overflow ,program exit\n");
  345.        break;
  346.     default:
  347.       printf("Error create!\n");
  348.   }
  349. }



  350. /* main program */
  351. int main(int argc, char *argv[])
  352. {
  353. char *s_uid,*d_uid,*s_pass,*d_pass;
  354. char *mailData;
  355. int funResult;

  356. if(argc<9) {
  357. usage(argv[0]);
  358. return 0;
  359. }

  360. mailData=(char *)malloc(MAXMAILSIZE);
  361. if(mailData==NULL) {
  362.   showErrorMsg(1000);
  363.   return 0;
  364. }

  365. s_uid=(char *)malloc(strlen(argv[2]));
  366.   if(s_uid==NULL) {
  367.       showErrorMsg(1000);
  368.       return 0;
  369.   }

  370. d_uid=(char *)malloc(strlen(argv[2])*2);
  371. if(d_uid==NULL) {
  372.       showErrorMsg(1000);
  373.       return 0;
  374.   }
  375. strcpy(s_uid,argv[2]);
  376. base64(s_uid,d_uid);

  377. s_pass=(char *)malloc(strlen(argv[3]));
  378. if(s_pass==NULL) {
  379.       showErrorMsg(1000);
  380.       return 0;
  381.   }

  382. d_pass=(char *)malloc(strlen(argv[3])*2);
  383. if(d_pass==NULL) {
  384.       showErrorMsg(1000);
  385.       return 0;
  386.   }

  387. strcpy(s_pass,argv[3]);
  388. base64(s_pass,d_pass);


  389. funResult=connectToServer(argv[1]);
  390. if(funResult!=1) {
  391.   showErrorMsg(funResult);
  392.   return 0;       
  393. }

  394. funResult=createMailInfo(argv[7],mailData,argv[6],argv[4],argv[5],atoi(argv[8]));
  395.   if(funResult!=1) {
  396.   showErrorMsg(funResult);
  397.   return 0;       
  398. }
  399. // printf("%s\n",mailData);
  400. // printf("uid is:%sand pass is:%s\n",d_uid,d_pass);
  401.   funResult=sendMail(sockfd,d_uid,d_pass,argv[4],argv[5],mailData);
  402.   if(funResult!=1) {
  403.     showErrorMsg(funResult);
  404.     return 0;       
  405.   }

  406.   close(sockfd);
  407.   free(s_uid);
  408.   free(d_uid);
  409.   free(s_pass);
  410.   free(d_pass);
  411.   free(mailData);
  412. }
复制代码

[ 本帖最后由 mq110 于 2007-3-5 16:48 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP