计算机网络——实现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;elsestd::cout << response << std::endl;curl_easy_cleanup(curl);}
}

运行示例

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

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

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

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

相关代码

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之大话西游

8年前深究设计模式&#xff0c;现如今再次回锅&#xff5e; 还是大话设计模式 这本书还是可以的 大话西游经典的台词&#xff1a;“曾经有一份真挚的爱情摆在我面前,我没有珍惜,等我失去的时候,我才后悔莫及,人世间最痛苦的事莫过于此。如果上天能够给我一个再来一次的机会,我会…

C++ 类和对象(二)

目录 1.前言 2.类的六个默认成员函数 3.构造函数 3.1概念 3.2特性 3.2.1 函数名与类名相同 3.2.2 无返回值 3.2.3对象实例化时自动调用 3.2.4 构造函数可以重载 3.2.5 默认构造函数的自动生成 3.2.6 默认构造函数对内置类型成员的初始化 3.2.7 默认构造函数的定义 4…

Docker安装(一)

一、安装Docker 服务器系统&#xff1a;centos 7 1.本地有docker的首先卸载本机docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \dock…

3_4.mysql数据库的基本管理

### 一.数据库的介绍 ### 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracle mongodb db2 sqlite sqlserver ....... 3.Mysql (SUN -----> Oracle) 4.mariadb ##数据库中的常用名词## ①字段 &#xff1a;表格中的表头 ②表 &#xff1a;表格 ③库 &…

lua基本语法

Lua语法入门 初识lua vi hello.lua print("hello,lua") lua hello.lua 变量和循环 变量 循环 条件控制、函数 条件控制

视觉SLAM学习打卡【11】-尾述

到目前为止&#xff0c;视觉SLAM14讲已经到了终章&#xff0c;历时一个半月&#xff0c;时间有限&#xff0c;有些地方挖掘的不够深入&#xff0c;只能在后续的学习中更进一步。接下来&#xff0c;会着手ORB-SLAM2的开源框架&#xff0c;同步学习C。 视觉SLAM学习打卡【11】-尾…

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页&#xff0c;包括以下内容&#xff1a; 头部信息&#xff1a;指定了网页的基本设置和元数据&#xff0c;例如字符编码、视口大小等。CSS文件&#xff1a;引入了多个CSS文件&#xff0c;用于设置网页…

前端开发攻略---实现与ChatGPT同款光标闪烁打字效果。

1、演示 2、实现代码 <!DOCTYPE html> <html lang"ch-ZN"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widt…

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…

秋叶Stable diffusion的创世工具安装-带安装包链接

来自B站up秋葉aaaki&#xff0c;近期发布了Stable Diffusion整合包v4.7版本&#xff0c;一键在本地部署Stable Diffusion&#xff01;&#xff01; 适用于零基础想要使用AI绘画的小伙伴~本整合包支持SDXL&#xff0c;预装多种必须模型。无需安装git、python、cuda等任何内容&am…

Python文件操作大全

1 文件操作 1.1 文件打开与关闭 1.1.1 打开文件 在Python中&#xff0c;你可以使用 open() 函数来打开文件。以下是一个简单的例子&#xff1a; # 打开文件&#xff08;默认为只读模式&#xff09; file_path example.txt with open(file_path, r) as file:# 执行文件操作…

数组索引哈希表(Array Indexed Hash Table)

数组索引哈希表&#xff08;Array Indexed Hash Table&#xff09; 哈希表&#xff1a;散列表&#xff0c;通过建立key与value之间的映射关系&#xff0c;实现高效的元素查询。 哈希表,数组&#xff0c;链表的查询效率 数组&#xff1a; 查询效率&#xff1a;对于已知索引的位…

HackMyVM-suidy

目录 信息收集 arp nmap WEB web信息收集 gobuster 目录批量查看 hydra ssh连接 提权 系统信息收集 提权 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.115 St…

Spring Boot统一功能处理(一)

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求&#xff08;doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口&#xff0c;通常会安排几个…

一夜爆红的4款国产软件,却一度被大众误以为是外国人开发

在现今高度信息化的时代&#xff0c;计算机已经深深地渗透到了我们生活的每一个角落。 从日常的办公学习到娱乐休闲&#xff0c;几乎都离不开计算机技术的支持。而在这背后&#xff0c;软件作为计算机的灵魂&#xff0c;其发展历史可谓波澜壮阔。 中国软件产业经过多年的积累和…

Linux 安装KVM虚拟机

什么是KVM虚拟机&#xff1f; KVM 是 Kernel-based Virtual Machine 的缩写&#xff0c;是一种用于虚拟化的开源硬件虚拟化技术。它使用 Linux 内核的虚拟化模块&#xff0c;将物理服务器划分为多个虚拟机。KVM 允许虚拟机直接访问物理硬件资源,从而提供出色的性能和稳定性,同…

基于二级片内硬件堆栈的后向CFI 验证方法研究,第5章 测试及实验结果

5.1 SoC系统功能仿真 按照上一章的设计方案&#xff0c;采用verilog HDL语言&#xff0c;在玄铁E906处理器平台中分别采用延迟验证和批处理验证方法完成了二级硬件堆栈的RTL级硬件描述。为了验证二级硬件堆栈的正确性&#xff0c;采用斐波那契数列进行验证&#xff0c;设置RAB…

【R语言】组合图:散点图+箱线图+平滑曲线图+柱状图

用算数运算符轻松组合不同的ggplot图&#xff0c;如图&#xff1a; 具体代码如下&#xff1a; install.packages("devtools")#安装devtools包 devtools::install_github("thomasp85/patchwork")#安装patchwork包 library(ggplot2) library(patchwork) #p1是…

AMPLE: 基于图简化和增强图表征学习的漏洞检测

GNN已被证实能有效学习源代码的图表示&#xff0c;然而GNN难以处理代码结构图中长距离节点之间连接的局限性&#xff0c;导致无法捕获代码图的全局信息&#xff08;即远距离节点间的依赖关系&#xff09;。针对上述问题&#xff0c;提出漏洞检测框架AMPLE&#xff0c;它包括图简…

机器学习引领金融革命:重塑金融服务领域新格局,开启智能化新篇章

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…