ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-21 16:00:30  阅读:216  来源: 互联网

标签:qq 课程设计 sockClient 计算机网络 邮箱 message 客户端 邮件 buff


一、 题目
邮件客户端

二、 环境
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有