服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现发送邮件功能

C语言实现发送邮件功能

2022-12-25 15:42Paul0415 C/C++

这篇文章主要为大家详细介绍了C语言实现发送邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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

延伸 · 阅读

精彩推荐
  • C/C++C++的静态成员变量和静态成员函数你了解多少

    C++的静态成员变量和静态成员函数你了解多少

    这篇文章主要为大家详细介绍了C++的静态成员变量和静态成员函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    EJoft3812022-09-26
  • C/C++C++ vector容器 find erase的使用操作:查找并删除指定元素

    C++ vector容器 find erase的使用操作:查找并删除指定元素

    这篇文章主要介绍了C++ vector容器 find erase的使用操作:查找并删除指定元素,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    寒泉Hq11692021-11-04
  • C/C++C++实现线程池的简单方法示例

    C++实现线程池的简单方法示例

    这篇文章主要给大家介绍了关于C++实现线程池的简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋...

    十面埋伏但莫慌8642021-09-03
  • C/C++基于c++强制类型转换的(总结)详解

    基于c++强制类型转换的(总结)详解

    本篇文章对C++中的强制类型转换进行了详细的分析介绍。需要的朋友参考下...

    C++教程网3822020-11-24
  • C/C++Qt实现网易云音乐进度条效果

    Qt实现网易云音乐进度条效果

    这篇文章主要为大家详细介绍了Qt实现网易云音乐进度条效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    番茄炒蛋不要蛋7532021-09-24
  • C/C++C++ socket实现miniFTP

    C++ socket实现miniFTP

    这篇文章主要为大家详细介绍了C++ socket实现miniFTP的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    ZJU_fish19969502021-04-19
  • C/C++C++实现图书管理系统

    C++实现图书管理系统

    这篇文章主要为大家详细介绍了C++实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    素心暮年6632021-08-09
  • C/C++C语言编程数据在内存中的存储详解

    C语言编程数据在内存中的存储详解

    本篇文章是C语言编程篇,主要为大家介绍C语言编程中数据在内存中存储解析,有需要的朋友可以借鉴参考下,希望可以有所帮助...

    Booksort10192022-01-07