计算机网络——实现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 函数来发送邮件,如果发送失败,会打印出错误信息。最后,函数清理并释放所有使用过的资源。

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方式登录,返回邮件列表

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/550801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OWASP发布10大开源软件风险清单

3月20日&#xff0c;xz-utils 项目被爆植入后门震惊了整个开源社区&#xff0c;2021 年 Apache Log4j 漏洞事件依旧历历在目。倘若该后门未被及时发现&#xff0c;那么将很有可能成为影响最大的软件供应链漏洞之一。近几年爆发的一系列供应链漏洞和风险&#xff0c;使得“加强开…

材料物理 笔记-6

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 文…

维护表和索引分区

1. ALTER FRAGMENT 语句 如果想更改分片策略&#xff0c;可以使用ALTER FRAGMENT语句。 初始化新的片段模式 ALTER FRAGMENT …INIT 增加额外片段 ALTER FRAGMENT …ADD 删除一个片段 ALTER FRAGMENT …DROP 修改片段表达式或 dbspace ALTER FRAGMENT …MODIFY 将表合并至一张…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口&#xff0c;走的是PDM信号&#xff0c;PDM信号就是两个线&#xff0c;一根数据线一根时钟线&#xff08;如顺芯ES7201/7202把MIC信号转换成PDM&#xff09;。 二、DMIC…

Chrome将网页保存为PDF的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

半导体行业芯片加工机台数据采集,如何同时保证效率和准确性?

半导体行业的重要性不言而喻&#xff0c;随着互联网时代技术的不断更新和演进&#xff0c;芯片的应用更加广泛&#xff0c;新能源、信息通讯设备、4C产业、智能电网等领域均需要芯片的支撑。而芯片的制造涉及多个关键步骤&#xff0c;包括晶圆制备、氧化、光刻、刻蚀、薄膜沉积…

Vue3(四):组件通信详解(九种方法)

主要有九种方法&#xff0c;以下是详细解释及使用方法&#xff1a; 1.props props实现父子间的通信&#xff0c;是使用频率最高的。 &#xff08;1&#xff09;父传子&#xff1a;属性值是非函数。 以Father.vue和Child.vue 为例。 父组件中&#xff0c;引入子组件并给子组…

【Leetcode每日一题】 递归 - 二叉树的所有路径(难度⭐)(59)

1. 题目解析 题目链接&#xff1a;257. 二叉树的所有路径 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 针对二叉树路径的求解问题&#xff0c;我们可以采用深度优先遍历&#xff08;DFS&#xff09;的策略来寻找所…

4.16 java项目小结1

java项目登录界面实现了服务端与客户端的连接&#xff0c;实现了客户端传递输入的账号和密码&#xff0c;服务端从数据库查询&#xff0c;并反馈给客户端。 学习了正则表达式 正则表达式的作用 作用一:校验字符串是否满足规则 作用二:在一段文本中查找满足要求的内容 目前我…

Python 包围盒裁剪卫星场景

下载 Landsat 场景 我们首先下载陆地卫星场景。您可以使用EarthExplorer门户来执行此操作。 数据下载后,您应该有一个下图所示的文件夹。这些是Landsat 2 级科学产品的所有可用文件。我们将处理突出显示的文件。这些是 3 个可见光波段和SR_stac文件。 加载图像和 stac 文件 …

PHP一句话木马

一句话木马 PHP 的一句话木马是一种用于 Web 应用程序漏洞利用的代码片段。它通常是一小段 PHP 代码&#xff0c;能够在目标服务器上执行任意命令。一句话木马的工作原理是利用 Web 应用程序中的安全漏洞&#xff0c;将恶意代码注入到服务器端的 PHP 脚本中。一旦执行&#xf…

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

Linux 磁盘管理和文件系统

硬盘的物理结构&#xff1a; 盘片硬盘有多个盘片&#xff0c;每盘片2面磁头每面一个磁头 硬盘的数据结构&#xff1a; 扇区盘片被分为多个扇形区域&#xff0c;扇区:每个扇区存放512字节的数据&#xff0c;硬盘的最小存储单位磁道同一盘片不同半径的同心圆&#xff0c;是由磁…

postgresql|数据库|实时数据库监控利器 pg_activity 的部署和初步使用

前言&#xff1a; postgresql的调优是比较重要的&#xff0c;那么&#xff0c;如何调优呢&#xff1f;自然是在某一个时间段内&#xff0c;通常是业务高峰期或者压测时间内实时观察数据库的运行情况&#xff0c;然后通过观察到的信息判断数据库的瓶颈&#xff0c;比如&#xf…

Windows 安装 A UDP/TCP Assistant 网络调试助手

Windows 安装 A UDP/TCP Assistant 网络调试助手 0. 引言1. 下载地址2. 安装和使用 0. 引言 需要调试一个实时在线聊天程序&#xff0c;安装一个UDP/TCP Assistant 网络调试助手&#xff0c;方便调试。 1. 下载地址 https://github.com/busyluo/NetAssistant/releases 2. 安…

【Android AMS】startActivity流程分析

文章目录 AMSActivityStackstartActivity流程startActivityMayWaitstartActivityUncheckedLocked startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume, boolean keepCurTransition)resumeTopActivityLocked 参考 AMS是个用于管理Activity和其它组件运行…

华为云CodeArts IDE For Python 快速使用指南

CodeArts IDE 带有 Python 扩展&#xff0c;为 Python 语言提供了广泛的支持。Python 扩展可以利用 CodeArts IDE 的代码补全、验证、调试和单元测试等特性&#xff0c;与多种 Python 解释器协同工作&#xff0c;轻松切换包括虚拟环境和 conda 环境的 Python 环境。本文简要概述…

chrome浏览器取消右上方的更新红点提示

在桌面找到chrome浏览器的快捷方式&#xff0c;右键打开属性 在目标 引号后添加 --disable-background-netwroking

git上传代码

git上传代码 先写好本地代码&#xff0c;按照下面步骤操作

初识--Linux的虚拟地址空间

重新了解地址空间 在学习c/c语言的时候,大家一定见过以下这张图 说的是程序会加载在如图的结构上,实际上,我们真的对他很了解吗,而在Linux进程控制这,就会有一个奇怪的现象 前提提要:简要介绍一下fork函数 进程内核数据结构(PCB)自己的代码以及数据 在Linux中,fork可以从当…