c语言发送邮件
Linux下使用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
9int 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
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
9int 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 q