计算机网络——实现smtp和pop3邮件客户端

实验目的

运用各种编程语言实现基于 smtp 协议的 Email 客户端软件。

实验内容

  1. 选择合适的编程语言编程实现基于 smtp 协议的 Email 客户端软件。

  2. 安装 Email 服务器或选择已有的 Email 服务器,验证自己的 Email 客户端软件是否能进行正常的 Email 收发功能。

实验过程

使用学校地的SMTP服务器做发送,这里操作比较简单,无需授权码,直接使用账号密码登录即可

编写基于smtp的邮件发送客户端,这里调用了Curl库来实现,这个库支持多种通信协议

编写基于pop3的邮件接收客户端(在查询相关资料后,pop3相较于smtp更常用于邮件接收,此处选择pop3来实现更贴近实际情况)

关键代码讲解

smtp邮件发送客户端,主要邮件发送函数,使用了 libcurl 库。首先初始化一个 CURL 句柄,然后设置 SMTP 服务器的地址、发送者的电子邮件地址和密码。接着,函数设置邮件的接收者,构造邮件的内容。函数调用 curl_easy_perform 函数来发送邮件,如果发送失败,会打印出错误信息。最后,函数清理并释放所有使用过的资源。

cpp 复制代码
void sendEmail(  
    const std::string& smtpServer,   
    const std::string& from,   
    const std::vector<std::string>& to,   
    const std::string& password,   
    const std::string& subject,   
    const std::string& body  
) {  
    CURL *curl;  
    CURLcode res = CURLE_OK;  
    struct curl_slist *recipients = NULL;  
  
    curl = curl_easy_init();  
    if(curl) {  
        curl_easy_setopt(curl, CURLOPT_USERNAME, from.c_str());  
        curl_easy_setopt(curl, CURLOPT_PASSWORD, password.c_str());  
        curl_easy_setopt(curl, CURLOPT_URL, smtpServer.c_str());  
        curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from.c_str());  
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);  
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);  
  
        for(const auto& recipient : to) {  
            recipients = curl_slist_append(recipients, recipient.c_str());  
        }  
        curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);  
  
        std::string email = "To: " + to[0] + "\r\n" +  
                            "From: " + from + "\r\n" +  
                            "Subject: " + subject + "\r\n\r\n" +  
                            body;  
  
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);  
        curl_easy_setopt(curl, CURLOPT_READDATA, &email);  
  
        res = curl_easy_perform(curl);  
        if(res != CURLE_OK)  
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;  
  
        curl_slist_free_all(recipients);  
        curl_easy_cleanup(curl);  
    }  
}  

pop3邮件接收客户端,也是使用libcurl的库进行连接,接收用户名和密码通过pop3方式登录,返回邮件列表

cpp 复制代码
void receiveEmail(const std::string& pop3Server, const std::string& username, const std::string& password) {
    CURL *curl;
    CURLcode res = CURLE_OK;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(curl, CURLOPT_USERNAME, username.c_str());
        curl_easy_setopt(curl, CURLOPT_PASSWORD, password.c_str());
        curl_easy_setopt(curl, CURLOPT_URL, pop3Server.c_str());
        curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);

        std::string response;
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        else
            std::cout << response << std::endl;

        curl_easy_cleanup(curl);
    }
}

运行示例

编译运行smtp邮件客户端发送邮件

用户输入信息:发送方邮箱地址/发送方邮箱授权码/接收方邮箱地址/邮件主题/邮件内容,显示发送过程中的日志信息

  • 邮件接受效果(此处示例为群发两封邮件)

POP3客户端接收邮件用户输入信息登录,然后列出所有的邮件

相关代码

BJTU_CS_Learning/computernetwork at main · JJLi0427/BJTU_CS_Learning (github.com)

相关推荐
七夜zippoe1 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥1 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
会员源码网2 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊1213 小时前
已有安全措施确认(上)
大数据·网络
Fcy6483 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满3 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
主机哥哥3 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
ManThink Technology4 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
珠海西格电力科技4 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
QT.qtqtqtqtqt4 小时前
未授权访问漏洞
网络·安全·web安全