其他分享
首页 > 其他分享> > 计算机网络课程设计邮件客户端

计算机网络课程设计邮件客户端

作者:互联网

一、 题目
邮件客户端

二、 环境
Win10    codeblocks

三、 代码实现
要使用电脑的邮件服务需要做几步准备。

一是电脑要开启talnet服务。具体请百度或者谷歌,比较容易。
二是发送邮件使用stmp协议,我发送邮件是qq邮箱,所以要到qq邮箱设置中的账号,开启stmp服务,以及生成的授权码记好,授权码是第三方登录时的密码。这里的用户名和授权码都要base64编码,网址在下面。
三是接收邮件使用pop3协议,我接收邮件是163邮箱。而此处的邮箱号和授权码都不要base64编码。

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