コンピュータネットワークコースデザインメールクライアント

1.件名の
電子メールクライアント

2.環境
Win10コードブロック

3、コードの実装

SMTPおよびPOP3プロセス図

1

コンピュータのメールサービスを使用する準備をするためのいくつかの手順があります。

1つは、コンピューターがトールネットサービスを開く必要があることです。詳細については、BaiduまたはGoogleを参照してください。
2つ目は、stmpプロトコルを使用してメールを送信することです。qqメールボックスを使用してメールを送信するため、qqメールボックス設定のアカウントに移動し、stmpサービスを開いて、生成された認証コードを書き留める必要があります。認証コードはサードパーティのログイン用のパスワード。ユーザー名と認証コードの両方がbase64でエンコードされている必要があり、URLは以下のとおりです。
3つ目は、pop3プロトコルを使用してメールを受信することです。私は、163のメールボックスを使用してメールを受信します。ここでのメールボックス番号と認証コードは、base64でエンコードする必要はありません。

base64暗号化URL

コード内でユーザー名と認証コードが必要な場所にマークを付けました。

さらに、メールを送受信するための形式とコマンドも知っておく必要があります。
これは、Windowsコマンドラインを使用してこれらのコマンドの使用を練習することで練習できます。具体的には、BaiduまたはGoogleにお願いします。


#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();

    }
}


4.実験結果

メールを送る:
ここに画像の説明を挿入


メールビュー:

ここに画像の説明を挿入

ここに画像の説明を挿入


V.まとめと
利点最初はqqメールボックスを使用して電子メールを送信しましたが、どのように変更しても、ウィンドウに送信が成功したことが表示されても、正常に送信できませんでした。その後、メールを送信するために163メールボックスに変更しましたが、間違いなく成功しました。後で、qqメールボックスを使用してメールを送信しましたが、それでも失敗しました。コンピューターのサービスが開いていないのか、それともqqメールボックスがサードパーティの電子メールの163よりも厳しいのか疑問に思います(これは私の推測であり、検証はありません)。後で、それが最初のものでした。Baiduの後、私は電子メールの送信に関連する可能性のあるサーバーサービスを開き、それを送信しようとしました。
Windowsコマンドラインを使用して電子メールに接続して送信する場合(qqメールボックスを使用して送信する)、サーバーは常に不可解に切断されるか、ユーザー名とパスワードが正しいとすぐにログインサーバー接続が切断されます。起こりました。しかし、163メールボックスを使用して送信する場合、この状況は発生しませんでした。この現象を以前のQQと163の使用と組み合わせると、163の方が使いやすく、問題が少ないと感じています。

ご不明な点がございましたら、メッセージを残して交換してください!

おすすめ

転載: blog.csdn.net/weixin_43752257/article/details/112958210