参考博客:https://www.cnblogs.com/cttcarrotsgarden/p/10154139.html
1.Telnet配置
参考 百度经验 telnet配置和telnet用法
选中Telnet服务器 ,Telnet客户端
2.设置QQ邮箱
1.在设置->账号中启动POP3/SMTP服务和IMAP/SMTP服务
2.获取授权码,用于在第三方客户端登录邮箱(在这里第三方客户端即等会的c程序)
3.程序实现
//参考
//https://www.cnblogs.com/cttcarrotsgarden/p/10154139.html
#include <iostream>
#include <string>
#include <WinSock2.h>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/
int main()
{
char buff[500]; //收到recv函数返回的结果
string message;
string info;
string subject;
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 1);
//WSAStarup,即WSA(Windows SocKNDs Asynchronous,Windows套接字异步)的启动命令
int err = WSAStartup(wVersionRequested, &wsaData);
SOCKET sockClient; //客户端的套接字
sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket对象
HOSTENT* pHostent;//hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表
pHostent = gethostbyname("smtp.qq.com"); //得到有关于域名的信息,链接到qq邮箱服务器
SOCKADDR_IN addrServer; //服务端地址
addrServer.sin_addr.S_un.S_addr = *((DWORD *)pHostent->h_addr_list[0]); //得到smtp服务器的网络字节序的ip地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(25); //连接端口25
//int connect (SOCKET s , const struct sockaddr FAR *name , int namelen ); //函数原型
err = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //向服务器发送请求
buff[recv(sockClient, buff, 500, 0)] = '\0';
/*
登录邮件服务器
*/
message = "ehlo qq.com\r\n";
send(sockClient, message.c_str(), message.length(), 0); //发送ehlo命令
buff[recv(sockClient, buff, 500, 0)] = '\0'; //接收返回值
message = "auth login \r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
/*
发送base64加密的用户名、密码
*/
message = "base64 编码的的qq号码\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
message = "base64 编码的授权码\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
/*
使用 MAIL 命令指定发送者
使用 RCPT 命令指定接收者,可以重复使用RCPT指定多个接收者
*/
string mail;
cout << "请输入收件人邮箱:";
cin >> mail;
message = "MAIL FROM:<填充自己的qq号码@qq.com> \r\nRCPT TO:<";
message.append(mail);
message.append("> \r\n");
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
buff[recv(sockClient, buff, 500, 0)] = '\0';
/*
使用 DATA 命令告诉服务器要发送邮件内容
*/
message = "DATA\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
message = "From: 填充自己的qq号码@qq.com\r\n\To: XXX@163.com"+mail+"\r\n\subject:";
cout<<"主题:";
cin>>subject;
message.append(subject);
message.append("\r\n\r\n");
cout<<"内容:";
cin>>info;
message.append(info);
message.append("\r\n.\r\n");
send(sockClient, message.c_str(), message.length(), 0);
message = "QUIT\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
cout << "发送成功!"<<endl;
system("pause");
}
只需修改其中的以下代码即可
message = “base64 编码的的qq号码\r\n”;
message = “base64 编码的授权码\r\n”;
以及后面两处需要填充自己的qq号码
4.输出效果
关于问题的统一回复:
不少同学遇到一些问题…统一回复下,遇到问题请先找找自己的步骤和文中步骤的不同,先用自己的小脑袋瓜和搜索引擎找找解决方案。
遇到问题请检查以下事项:
- telnet服务端和客户端是否都开启了
- 邮箱需要开启的服务是否已经开启了
- 代码中需要base64加密的地方是否加密了
关于telnet服务端,win7设置项有服务端和客户端,win10只能设置项客户端,那咋办?百度和谷歌都是好东西
win10安装telnet服务(附服务端下载链接)
我当时是学校机房电脑win7做的课设。
还不行,那我也没辙了。