先上代码 !
#pragma once
#ifndef _OperateEmil_
#define _OperateEmil_
#include<stdio.h>
#include<WinSock2.h>
#include<string>
#include<random>
#include<ctime>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void SEND_emil(string Recipient);//发送emil
void SEND_emil(string Recipient)//形参收件人邮箱
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(25);
local.sin_addr.S_un.S_addr = inet_addr("183.47.101.192");//win+R cmd ping smtp.qq.com
connect(sock, (struct sockaddr*)&local, sizeof(struct sockaddr));
char buff[1024] = { 0 };
recv(sock, buff, 1024, 0);
string SendMsg = "HELO MSG\r\n";
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
SendMsg = "AUTH LOGIN\r\n";
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
string Username = "BASE64在线编码 邮箱账号\r\n";//BASE64编码账号
send(sock, Username.c_str(), Username.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
string Userpassword = "BASE64在线编码 授权码\r\n";//BASE64编码授权码
send(sock, Userpassword.c_str(), Userpassword.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
SendMsg = "MAIL FROM:<xxxxxxxxx@qq.com>\r\n";//发件人自己的邮箱账号
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
SendMsg = "RCPT TO:<";
SendMsg += Recipient;//收件人的邮箱
SendMsg += ">\r\n";
//"RCPT TO:<xxxxxxxxx@qq.com>\r\n";
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
SendMsg = "DATA\r\n";
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
default_random_engine e;//创建一个随机验证码
uniform_int_distribution<int> u(10000, 99999); // 左闭右闭区间
e.seed(time(0));
string code = to_string(u(e));
SendMsg = "From:<xxxxxxxxx@qq.com> \r\nSubject:验证码\r\n\r\n 【Mysterious】验证码 ";//发件人邮箱
SendMsg += code;
SendMsg += " 用于Mysterious身份验证,请勿泄露和转发。如非本人操作,请忽略此邮件。\r\n\r\n\r\n.\r\n";
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
SendMsg = "QUIT\r\n";
send(sock, SendMsg.c_str(), SendMsg.length(), 0);
memset(buff, 0, 1024);
recv(sock, buff, 1024, 0);
}
#endif
注意修改代码中的 XXXXXXXXXXX ,邮箱和授权码都需要BASE64编码,
正文内容可自行修改,\r\n必须保留
BASE64在线编码网站:Base64编码、解码 - 站长工具 (chinaz.com)
如何获取授权码: 帮助系统 (qq.com)
需要判断步骤是否成功,可以输出每步的buff.下面就是成功发送邮件并输出每一步的buff
这样就成功了!
具体的步骤如下:
1.初始化 WinSock2 库。
2.创建一个套接字(socket)。
3.设置邮件服务器的地址和端口,并与服务器建立连接。
4.接收服务器的响应信息。
5.发送 HELO 命令,握手确认。
6.接收服务器的响应信息。
7.发送 AUTH LOGIN 命令,进行身份验证。
8.接收服务器的响应信息。
9.发送经过 BASE64 编码的邮箱账号和授权码,进行身份验证。
10.接收服务器的响应信息。
11.发送发件人的邮箱账号。
12.接收服务器的响应信息。
13.发送收件人的邮箱地址。
14.接收服务器的响应信息。
15.发送 DATA 命令,开始传输邮件内容。
16.接收服务器的响应信息。
17.生成一个随机验证码。
18.构造邮件内容,包括发件人、主题和验证码。
19.发送邮件内容给服务器。
20.接收服务器的响应信息。
21.发送 QUIT 命令,断开与服务器的连接。
22.接收服务器的响应信息。
注:侵权删!!