zoukankan      html  css  js  c++  java
  • c语言发送邮件

    c语言发送邮件
    Linux下使用c语言发送邮件

    领导交代一个任务,需要将服务器上的df -hl的执行结果定时发给他。

    尝试使用sendmail来发邮件,但是后来放弃了,并不是所有的服务器上都安装了sendmail。

    于是,就用c写一个吧,还能够指定邮件服务器地址和端口,会更灵活些。

    目标是创建程序qmail,然后通过命令qmail my@163.com your.txt将your.txt的内容发送给my@163.com。

    在网上找了半天,没有一个例子能够完全跑起来,有些是提问题的,最总问题解决了却不告诉别人,这人真可恨。

    虽然这些代码都是复制粘贴来的,但是本着公益的宗旨,就不追究版权了。


      1 
      2 #include <stdio.h>
      3 #include <sys/socket.h>
      4 #include <sys/types.h>
      5 #include <netinet/in.h>
      6 #include <stdlib.h>
      7 #include <string.h>
      8 
      9 int main(int argc,char *argv[])
     10 {
     11     int sockfd = -1;
     12     int iconn = -2;
     13     ssize_t retConnect = -2;
     14     struct sockaddr_in servaddr;
     15     char ip[20= "192.168.0.251";//设置SMTP地址
     16     char sentmsg[2048= "";
     17     char buf[255= "";
     18     char fileContent[1024= "";
     19     FILE* file;
     20     char cin[255= "";
     21 
     22     int len = 0;
     23     while(!(argv[len]==NULL))
     24     {
     25         len++;
     26     }
     27 
     28     if(len!=3)
     29     {
     30         printf("Usage:qmail yourname@163.com df.log\n");
     31         exit(0);
     32     }
     33     memset(fileContent,'\0',sizeof(fileContent));
     34     if((file = fopen(argv[2], "r")) == NULL)
     35         printf("Not find file");
     36     else
     37     {
     38         while(fgets(cin, sizeof(cin), file) != NULL)
     39         {
     40             strcat(fileContent,cin);
     41             memset(cin,'\0',sizeof(cin));
     42         }
     43     } 
     44     fclose(file);
     45     printf("%s",fileContent);
     46     setvbuf(stdout,NULL,_IONBF,0);
     47     sockfd = socket(AF_INET,SOCK_STREAM,0);//以scoket方式和邮件服务器通讯
     48     if(sockfd>0)
     49     {
     50         printf("socket is open");
     51         bzero(&servaddr,sizeof(servaddr));
     52         servaddr.sin_family=AF_INET;
     53         servaddr.sin_port=htons(25);
     54         inet_pton(AF_INET,ip,&servaddr.sin_addr);
     55         iconn = connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));    
     56         if(iconn==0)
     57         {
     58             printf("connect to 192.168.0.251 25 success!");
     59             retConnect = recv(sockfd,buf,sizeof(buf),0);
     60             if(retConnect==-1)
     61             {
     62                 printf("Failed to receive msg from smtp port");
     63             }
     64             else
     65                 printf("\nServer:%s\n",buf);
     66             memset(sentmsg,'\0',sizeof(sentmsg));
     67             strcpy(sentmsg,"HELO SERVER\r\n");
     68             retConnect = send(sockfd,sentmsg,strlen(sentmsg),0);
     69             if(retConnect==-1)
     70             {
     71                 printf("\nFailed to send meg to smtp port in step 2.\n");
     72                 exit(1);
     73             }
     74             else
     75             {
     76                 printf("%s",sentmsg);
     77             }
     78             memset(buf,'\0',sizeof(buf));
     79             retConnect=recv(sockfd,buf,sizeof(buf),0);
     80             if(retConnect == -1)
     81             {
     82                 printf("\nFailed to recive meg from smtp port in step 3.\n");
     83                 exit(1);
     84             }
     85             else
     86             {
     87                 printf("%s\n",buf);
     88             }
     89             
     90                         memset(sentmsg,'\0',sizeof(sentmsg));
     91                         strcpy(sentmsg,"MAIL FROM: qdcm@163.com\r\n");               
     92                         strcat(sentmsg,"RCPT TO: ");
     93                         strcat(sentmsg,argv[1]);
     94                         strcat(sentmsg,"\r\n");
     95                         retConnect = send(sockfd,sentmsg,strlen(sentmsg),0);
     96                         if(retConnect>0)
     97                             printf("%s",sentmsg);
     98                         memset(buf,'\0',sizeof(buf));
     99                         retConnect=recv(sockfd,buf,sizeof(buf),0);
    100                         if(retConnect>0)
    101                             printf("%s\n",buf);
    102                             
    103                         memset(sentmsg,'\0',sizeof(sentmsg));
    104                         strcpy(sentmsg,"DATA\r\n");
    105                         retConnect = send(sockfd,sentmsg,strlen(sentmsg),0);
    106                         if(retConnect>0)
    107                             printf("%s",sentmsg);
    108                         memset(buf,'\0',sizeof(buf));
    109                         retConnect=recv(sockfd,buf,sizeof(buf),0);
    110                         if(retConnect>0)
    111                             printf("%s\n",buf);
    112             
    113                         memset(sentmsg,'\0',sizeof(sentmsg));
    114                         strcpy(sentmsg,"From:qdcm@163.com\r\n");
    115                         strcat(sentmsg,"To:");
    116                         strcat(sentmsg,argv[1]);
    117                         strcat(sentmsg,"\r\n");
    118                         strcat(sentmsg,"Subject:QDCM Host Check Data\r\n\r\n");
    119                         strcat(sentmsg,fileContent);
    120                         strcat(sentmsg,"\r\n");            
    121                         strcat(sentmsg,"\r\n.\r\n");
    122                         retConnect = send(sockfd,sentmsg,strlen(sentmsg),0);
    123                         memset(sentmsg,'\0',sizeof(sentmsg));
    124                         
    125                         strcpy(sentmsg,"QUIT\r\n");
    126                         retConnect = send(sockfd,sentmsg,strlen(sentmsg),0);
    127                         if(retConnect>0)
    128                             printf("%s",sentmsg);
    129                         memset(buf,'\0',sizeof(buf));
    130                         retConnect=recv(sockfd,buf,sizeof(buf),0);
    131                         if(retConnect>0)
    132                             printf("%s\n",buf);
    133 
    134         }
    135         else
    136         {
    137             printf("connect 192.168.0.251 25 failed!");
    138             sleep(1);
    139         }
    140         close(sockfd);
    141     }
    142     else
    143     {
    144         printf("open socket failed!");
    145     }
    146     return 0;
    147 }
    148 

    使用gcc编译

    如果你是在高版本的linux下编译的,在低版本上的linux使用时会报错

    此时需要在编译时追加参数:

    gcc -Wl,--hash-style=sysv qmail.c -o qmail

  • 相关阅读:
    centos 6.5 下安装RabbitMQ-3.7.28 二进制版本
    Centos 6.5 Rabbitmq 安装和集群,镜像部署
    Vim 自动添加脚本头部信息
    vim 手动添加脚本头部信息
    Pandas系列教程(11)Pandas的索引index
    Pandas系列教程(10)Pandas的axis参数
    Pandas系列教程(9)Pandas字符串处理
    Pandas系列教程(8)pandas数据排序
    Pandas系列教程(7)Pandas的SettingWithCopyWarning
    Pandas系列教程(6)Pandas缺失值处理
  • 原文地址:https://www.cnblogs.com/liuzhengdao/p/1923131.html
Copyright © 2011-2022 走看看