计算机网络课程设计邮件客户端
作者:互联网
一、 题目
邮件客户端
二、 环境
Win10 codeblocks
三、 代码实现
要使用电脑的邮件服务需要做几步准备。
一是电脑要开启talnet服务。具体请百度或者谷歌,比较容易。
二是发送邮件使用stmp协议,我发送邮件是qq邮箱,所以要到qq邮箱设置中的账号,开启stmp服务,以及生成的授权码记好,授权码是第三方登录时的密码。这里的用户名和授权码都要base64编码,网址在下面。
三是接收邮件使用pop3协议,我接收邮件是163邮箱。而此处的邮箱号和授权码都不要base64编码。
代码中需要用到你的用户名和授权码的地方我已标明了。
除此外,还需要知道发送邮件和接收邮件的格式和命令。
这可以通过使用Windows命令行来练习这些命令的使用,具体请百度或者谷歌。
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <unistd.h>
#include <string>
using namespace std;
#pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/
int main() {
char buff[50000]; //收到recv函数返回的结果
string message;
string info;
string subject;
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 1);
int err = WSAStartup(wVersionRequested, &wsaData);
SOCKADDR_IN addrServer;
HOSTENT *pHostent;
SOCKET sockClient;
cout << "你想查看邮件还是发邮件?\n\t1.查看邮箱\n\t2.发送邮件\n";
int call;
cin >> call;
if (call == 2) {
sockClient = socket(AF_INET, SOCK_STREAM, 0);
pHostent = gethostbyname("smtp.qq.com");
addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]);
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(25);
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);
message = "此处填写你的qq邮箱用户名(无后缀)的base64加密后的码\r\n";//qq邮箱用户名的base64加密后内容
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
message = "此处填写你的qq邮箱授权码的base64加密后的码\r\n";//qq邮箱授权码的base64加密后内容
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
string mail;
cout << "请输入收件人邮箱:";
cin >> mail;
message = "MAIL FROM:<此处填写你发邮件的邮箱号(有后缀)> \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';
message = "DATA\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
message = "From: 此处填写你发邮件的邮箱号(有后缀)\r\nTo: " + mail + "\r\nsubject:";
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");
}
if (call == 1) {
sockClient = socket(AF_INET, SOCK_STREAM, 0);
const char *host_id = "pop3.126.com";
pHostent = gethostbyname("pop.163.com");
int port = 110;
addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]);
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(port);
err = connect(sockClient, (SOCKADDR *) &addrServer, sizeof(SOCKADDR));
buff[recv(sockClient, buff, 500, 0)] = '\0';
message = "user 你的163邮箱号(有后缀,不用base64编码)\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
cout << "Client : send name \nServer:"
<< buff << endl;
message = "pass 163邮箱的授权码(不用base64编码)\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
cout << "Client : send pass \nServer:"
<< buff << endl;
message = "stat\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
Sleep(1);
cout << "Client : send stat \nServer : "
<< buff << endl;
message = "list\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 50000, 0)] = '\0';
Sleep(1);
cout << "Client : send list \nServer :"
<< buff << endl;
int n;
cout << "你先想查看那一封邮件?输入序号"
<< endl;
cin >> n;
message = "retr " + to_string(n) + "\r\n";
send(sockClient, message.c_str(), message.length(), 0);
Sleep(1);
cout << "Client : send retr "<<n<<"\n";
buff[recv(sockClient, buff, 50000, 0)] = '\0';
cout << "Server :" << buff << endl;
message = "QUIT\r\n";
send(sockClient,message.c_str(),strlen(buff),0);
Sleep(1);
buff[recv(sockClient, buff, 50000, 0)] = '\0';
cout << "Quit Receive: " << buff << endl;
closesocket(sockClient);
WSACleanup();
}
}
四、 实验结果
发送邮件:
邮箱查看:
五、 小结及收获
开始我是使用qq邮箱来发送邮件的,但是怎么改都不能发送成功,即使窗口显示发送成功。后来我改为163邮箱发送邮件,嗯,成功了,没有失败一次。后来又用qq邮箱发送邮件,嗯,还是失败。我寻思要么是电脑的啥服务没开,要么就是qq邮箱对第三方发送邮件比163更严格(这是我猜测的,没有验证)。后来,就第一个要么,我百度之后打开了可能跟发送邮件有关的server服务,然后试了下就可以发送了。。。
在使用Windows命令行联系发送邮件(使用qq邮箱发送)时,服务器总是莫名地断开连接,或者是用户名密码正确后登录服务器连接立马断开,嗯,这个也不知道是咋回事。但是使用163邮箱发送时,并没有出现这个情况。这个现象结合我之前使用qq和163的情况,感觉163使用起来更舒服,出现问题的情况较少。
有问题,欢迎留言交流!
标签:qq,课程设计,sockClient,计算机网络,邮箱,message,客户端,邮件,buff 来源: https://blog.csdn.net/weixin_43752257/article/details/112958210