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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值