计算机网络——实现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)

相关推荐
米修米修ne1 分钟前
Home Assistant连接米家MIoT和苹果HomeKit折腾笔记
服务器·智能家居
行者-全栈开发39 分钟前
【Linux内核】CVE-2026-46242:Bad Epoll Linux 内核 epoll UAF 漏洞修复指南(99%可靠root的云安全噩梦)
linux·运维·服务器·cve-2026-46242·linux内核漏洞·use-after-free·云多租户安全
平安的平安40 分钟前
人在外地,怎样访问办公室里的电脑和内部资源?
运维·服务器·电脑
智体工坊1 小时前
从零搭建 AI 模型中转网关:部署、渠道、定价、装修全记录
运维·服务器·人工智能·搜索引擎·自动化
我命由我123451 小时前
Kotlin 面向对象 - Kotlin 类变量与类方法
java·服务器·后端·java-ee·kotlin·android jetpack·android runtime
木由里予1 小时前
TEE(Trusted Execution Environment)技术详解
java·linux·开发语言·网络·嵌入式硬件·android-studio
Sagittarius_A*1 小时前
Burst Lab|PHP 审计 10:PHP 网络请求与 SSRF 漏洞审计思路
网络·安全·web安全·php·代码审计
lemon_sjdk1 小时前
Spring 容器与 Bean 深度解析:从概念到实践
java·网络·spring·webflux
小比特-combat1 小时前
FreeRTOS任务通知
java·服务器·前端
开开心心_Every2 小时前
电脑文件搜索软件支持内容和拼音搜索
linux·服务器·人工智能·r语言·pdf·音视频·symfony