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

使用gcc编译

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

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

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

C语言发送邮件的更多相关文章

  1. go语言发送邮件

    package main import ( "fmt" "net/smtp" "strings" ) //发送邮件的逻辑函数 func Se ...

  2. phpmailer使用gmail SMTP的方法

    终于能够通过phpmailer使用gmail账号发送邮件了phpmailer(现在的版本是1.73)是一个很好用的工具,可以很方便的使用php语言发送邮件,支持smtp及验证,我们一直都用它. 但是, ...

  3. golang:send mail using smtp package

    go语言发送邮件,可以使用smtp包,两个关键函数: func PlainAuth(identity, username, password, host string) Auth func SendM ...

  4. C和C#两种方式实现邮件的简单发送

    内容为通过两种方式发送邮件--1.C语言发送邮件   2.C#发送邮件 一,C语言进行邮件的发送 C语言发送邮件的步骤的简单解析: 1.创建TCP连接    socket() 2.连接到邮箱服务器  ...

  5. Python自动化--语言基础7--操作日志、加密、发送邮件、线程、生产者消费者

    1.操作日志 logging.basicConfig:日志的统一处理器,对日志的输出格式和方式做配置日志级别等级CRITICAL > ERROR > WARNING > INFO & ...

  6. C语言利用SMTP协议发送邮件

    #ifdef WIN32 #include <windows.h> #include <stdio.h> #else #include <stdio.h> #inc ...

  7. C语言检查本机公网IP并发送邮件

    这是一个用来获取本机公网IP地址,并检查是否是配置里保存的IP地址,假设不是,就向指定的邮箱发送一个邮件,报告这个IP地址的一段小代码.放到开机启动中,电脑不设password的时候万一丢了,还能有个 ...

  8. Go语言实战 - 使用SendCloud群发邮件

    山坡网需要能够每周给注册用户发送一封名为"本周最热书籍"的邮件,而之前一直使用的腾讯企业邮箱罢工了,提示说发送请求太多太密集. 一番寻找之后发现了大家口碑不错的搜狐SendClou ...

  9. R语言绘制空间热力图

    先上图 R语言的REmap包拥有非常强大的空间热力图以及空间迁移图功能,里面内置了国内外诸多城市坐标数据,使用起来方便快捷. 开始 首先安装相关包 install_packages("dev ...

随机推荐

  1. uinex 常用命令

    删除文件夹实例:rm -rf /var/log/httpd/access将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 删除文件使用实例:rm -f /var/log/ ...

  2. spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable

    import org.elasticsearch.cluster.routing.Murmur3HashFunction; import org.elasticsearch.common.math.M ...

  3. 微信公众号平台开发(二)信息的分类.md

    在上一篇博客中,我们只是简单地与微信服务器建立了连接,接下来就是从微信服务器中接收信息了.在SecurityController中,我定义了两个方法(get和post).Get方法是我们用来与微信服务 ...

  4. spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid

    SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...

  5. jsonp 跨域2

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. vuex 简单理解

    废话不多说,直接上图!                 不懂的 参考 API

  7. 玩转X-CTR100 l STM32F4 l CAN通信

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器STM32F4处理器内置CAN ...

  8. windowns 下备份mysql数据库

    @echo off & setlocal ENABLEEXTENSIONS :: ---------- 配置项 ---------- :: 备份放置的路径,加 \ set BACKUP_PAT ...

  9. 利用 gulp 来合并seajs 的项目

    gulp-seajs-transport 和 gulp-seajs-concat这两个gulp插件 gulp-seajs-transpor 这个插件这样是给每个js模块 标示 模块名称 gulp-se ...

  10. Windows Security Login

    /********************************************************************************* * Windows Securit ...