本文实例为大家分享了C语言实现发送邮件的具体代码,供大家参考,具体内容如下
首先需要知道发送邮件的服务器IP地址和端口,我这里使用的是网易的126邮箱,如果是其他邮箱需要替换成其他的邮箱域名,域名和端口一般可以在邮箱网页的帮助项里面找到。用域名比较方便维护以免后续更换ip之后还要修改代码。
发送邮件一共需要8个步骤,具体见代码main函数里面的注释
代码中的用户名密码以及收件人发件人等信息需要修改为你自己的。而且用户名和密码需要进行base64编码后才能发送,具体base64算法没有贴了,百度上到处都是。
完整代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
|
#include <stdio.h> #include <stdlib.h> #include "winsock2.h" extern int Base64Encod( char * data, char *output, int len, int *oputlen); #define EMAIL_SERVER "smtp.126.com" //按需修改 int CreateSocketAndConnect() { struct sockaddr_in server_addr; struct hostent *Addr; int ret; int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0){ printf ( "sock create failed\n" ); return -1; } Addr = gethostbyname(EMAIL_SERVER); //用域名获取对应IP if (Addr == NULL){ printf ( "get ip error\n" ); return -1; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(25); server_addr.sin_addr.S_un.S_addr = (*( struct in_addr*)Addr->h_addr_list[0]).S_un.S_addr; ret = connect(sock, ( struct sockaddr *)&server_addr, sizeof (server_addr)); if (ret < 0){ printf ( "connect server failed\n" ); return -1; } return sock; } int server_send_recv_display( int sock, char *buff) { int ret = 0; char recvbuff[320] = {0}; send(sock, buff, strlen (buff), 0); ret = recv(sock, recvbuff, 320, 0); printf ( "服务器返回消息:len = %d \n recv:[%s] \n" ,ret,recvbuff); return ret; } /*HELO*/ int email_send_helo_fun( int sock) { char buff[320] = {0}; int ret; sprintf (buff, "HELO 126.com\r\n" ); ret = server_send_recv_display(sock, buff); if (ret <= 0) { return -1; } return 0; } /*AUTH LOGIN 身份认证*/ int email_send_authlogin_fun( int sock) { char buff[320] = {0}; int ret; sprintf (buff, "%s" , "AUTH LOGIN\r\n" ); ret = server_send_recv_display(sock, buff); if (ret <= 0) { return -1; } return 0; } //发送用户名 int email_send_username_fun( int sock) { char buff[320] = {0}; char encbuff[120] = {0}; int ret, len = 0; sprintf (buff, "xxxxxxxxxx@126.com" ); //需要改成自己的用户名 Base64Encod(buff, encbuff, strlen (buff), &len); memset (buff, 0x00, sizeof (buff)); sprintf (buff, "%s\r\n" ,encbuff); ret = server_send_recv_display(sock, buff); if (ret <= 0) { return -1; } return 0; } //发送密码 int email_send_password_fun( int sock) { char buff[320] = {0}; char encbuff[120] = {0}; int ret, len = 0; sprintf (buff, "123456789" ); //需要改成自己的密码,有的邮箱是需要填授权码不是登录用的密码 Base64Encod(buff, encbuff, strlen (buff), &len); memset (buff, 0x00, sizeof (buff)); sprintf (buff, "%s\r\n" , encbuff); ret = server_send_recv_display(sock, buff); if (ret < 0){ return -1; } return 0; } //发送发件人 int email_send_from_fun( int sock) { char buff[320] = {0}; int ret; sprintf (buff, "MAIL FROM: <xxxxxxxxxx@126.com>\r\n" ); ret = server_send_recv_display(sock, buff); if (ret < 0){ return -1; } return 0; } //发送收件人 int email_send_to_fun( int sock) { char buff[320] = {0}; int ret; sprintf (buff, "RCPT TO: <xxxxxx@163.com>\r\n" ); ret = server_send_recv_display(sock, buff); if (ret < 0){ return -1; } return 0; } //通知服务器准备发送邮件 int email_send_ready_fun( int sock) { char buff[320] = {0}; int ret; sprintf (buff, "DATA\r\n" ); ret = server_send_recv_display(sock, buff); if (ret < 0){ return -1; } return 0; } //发送邮件 int email_send_maintext_fun( int sock) { char buff[320] = {0}; int ret; sprintf (buff, "From: \"pc\"<xxxxxxxxxx@126.com>\r\n" //发件人 "To: \"con\"<xxxxxx@163.com>\r\n" //收件人 "Subject: email test\r\n\r\n" //主题 "test:\r\n" //正文, 以 \r\n.\r\n 结束 " line1\r\n" " line2\r\n.\r\n" ); ret = server_send_recv_display(sock, buff); if (ret < 0){ return -1; } return 0; } #define MAX_BUFF_SIZE 512 int main() { int sock; char buff[MAX_BUFF_SIZE]; WSADATA wsa; int ret; if (WSAStartup(MAKEWORD(1,1), &wsa) != 0){ printf ( "WSA startup failed\n" ); return 1; } sock = CreateSocketAndConnect(); if (sock < 0){ return -1; } printf ( "connect to server success\n" ); memset (buff, 0x00, sizeof (buff)); while (1){ ret = recv(sock, buff, MAX_BUFF_SIZE, 0); if (ret < 0){ printf ( "recv error\n" ); continue ; } printf ( "%s" , buff); break ; } //1.send helo if (email_send_helo_fun(sock) < 0){ return 1; } //2.send auth login if (email_send_authlogin_fun(sock) < 0){ return 1; } //3.send username if (email_send_username_fun(sock) < 0){ return 1; } //4.send password if (email_send_password_fun(sock) < 0){ return 1; } //5.send from if (email_send_from_fun(sock) < 0){ return 1; } //6.send to if (email_send_to_fun(sock) < 0){ return 1; } //7.send notice ready if (email_send_ready_fun(sock) < 0){ return 1; } //8.send email if (email_send_maintext_fun(sock) < 0){ return 1; } closesocket(sock); return 0; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/LIZHI1994/article/details/119328035