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. Idea改项目名

    1.点开.idea文件夹,找到 modules.xml,更改里面的项目名 2.根目录下对应的.iml文件 3.右击 pom.xml 文件,选择最下面的 “ Add as maven build fil ...

  2. 我的Java学习笔记-Java面向对象

    今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...

  3. Mac下找不到gl.pc和glu.pc

    在用pkg-config可以用来自动查找对应库的include和lib文件,方便编译.它主要通过PKG_CONFIG_PATH和/usr/lib/pkgconfig目录下的.pc文件进行自动配置.在c ...

  4. linux进程原语之fork()

    一.用法解析: fork()这个函数,可以说是名如其人了,众所周知fork这个单词本意为叉子,老外取学术名字的时候总会有一些象形的想法,于是就有了下图~ fork()函数是计算机程序设计中的分叉函数. ...

  5. Oracle性能诊断艺术-读书笔记

    create table test0605 as select * from dba_objects; select t1.owner,t1.object_name,t1.object_id from ...

  6. VAE demo

    先看tflearn 官方的: from __future__ import division, print_function, absolute_import import numpy as np i ...

  7. Centos中彻底删除Mysql(rpm、yum安装的情况)

    [root@data lib]# rpm -qa¦grep mysqlmysql-5.5.25-1.el6.remi.i686mysql-libs-5.5.25-1.el6.remi.i686comp ...

  8. learning uboot how to enable watchdog in qca4531 cpu

    find cpu datasheet , watchdog relate registers: 0x18060008 watchdong timer control 0x1806000c watchd ...

  9. 跟我一起学习ASP.NET 4.5 MVC4.0(六)

    这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系统,VS2012和SQLServer 2012,顺便抽空继续一篇.随着VS2012 RC版本的放出,ASP.NET M ...

  10. 三个安装,手机看VIP电影。写给亲爱的学习

    三个安装,看VIP电影. 市场安装firefox 安装Tempermonkey 打开firefox,点击右上角的三个点,点击附加组件 继续点击浏览全部firefox附加组件 在上面的搜索框输入 tam ...