计算机网络——实现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.hqwc.cn/news/619191.html

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

相关文章

【web网页制作】html+css旅游家乡山西主题网页制作(3页面)【附源码】

山西旅游网页目录 涉及知识写在前面一、网页主题二、网页效果Page1、景点介绍Page2、酒店精选|出行攻略Page3、景色欣赏 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 山西旅游主题网页制作&am…

JVM虚拟机(五)强引用、软引用、弱引用、虚引用

目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文&#xff1a; 在 Java 中一共存在 4 种引用&#xff1a;强、软、弱、虚。它们主要指的是&#xff0c;在进行垃圾回收的时候&#xff0c;对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题6

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

我要成为嵌入式高手之4月11日51ARM第六天&#xff01;&#xff01; ———————————————————————————— b指令 标签&#xff1a;表示这条指令的名称&#xff0c;可跳转至标签 b指令&#xff1a;相当于goto&#xff0c;可随意跳转 如&#xff1a;fini…

代理模式(结构型模式)

目录 1、概述 2、结构 2.1、角色分类 2.2、类图 3、静态代理 3.1、案例类图 3.2、案例代码 4、JDK 动态代理 4.1、案例代码 4.2、底层原理 4.3、执行流程说明 5、CGLib 动态代理 5.1、案例代码 6、三种代理的对比 6.1、JDK代理和CGLib代理 6.2、动态代理和静态…

系统架构最佳实践 -- 统一身份认证系统

目录 1.系统架构设计&#xff1a; 2.用户认证与授权&#xff1a; 3.用户身份管理&#xff1a; 4.安全性保障&#xff1a; 5.日志记录与审计&#xff1a; 6.高可用性与容错性&#xff1a; 7.用户体验优化&#xff1a; 随着互联网的快速发展和应用的普及&#xff0c;人们在…

SpringCloud实用篇(四)——Nacos

Nacos nacos官方网站&#xff1a;https://nacos.io/ nacos是阿里巴巴的产品&#xff0c;现在是springcloud的一个组件&#xff0c;相比于eureka的功能更加丰富&#xff0c;在国内备受欢迎 nacos的安装 下载地址&#xff1a;https://github.com/alibaba/nacos/releases/ 启动…

Hadoop 3.1.3

第1章 Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展历史&#xff08;了解&#xff09; 1.3 Hadoop三大发行版本&#xff08;了解&#xff09; Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#x…

IOS 短信拦截插件

在使⽤iOS设备的时候, 我们经常会收到1069、1065开头的垃圾短信, 如果开了iMessage会更严重, 各种乱七⼋糟的垃圾信息会时不时地收到。 从iOS11开始, ⼿机可以⽀持恶短信拦截插件了. 我们可以通过该插件添加⼀些规则通过滤这些不需要的信息. ⼀. 使⽤xcode新建⼀个项⽬ 【1】…

终端工具命令行颜色配置(解决终端工具连上服务器之后,无颜色问题)

本期主题&#xff1a; 讲解使用mobaxterm等终端工具连上服务器&#xff0c;但是命令行没有颜色的问题 目录 1. 问题描述2. 原因解释3.测试 1. 问题描述 使用终端工具&#xff08;Mobaxterm等&#xff09;连上服务器之后&#xff0c;发现终端工具没有颜色&#xff0c;如下图&am…

中国移动传关停8元保号套餐?或是5G成本带来的压力所致

日前有网友发现希望使用中国移动的保号套餐&#xff0c;却发现已无法办理&#xff0c;媒体对此多有报道&#xff0c;这意味着中国移动的套餐业务发生了重大变动&#xff0c;如此做或许在于5G成本上涨带来的压力促使它不得不提高套餐的门槛。 中国移动已建成最多的5G基站&#x…

HiveQL练习(hive3.x)

零、准备工作 1. Hive环境安装 参见搭建Hive 3.x环境&#xff08;CentOS 9 Hadoop3.x&#xff09; 2. 准备数据 在虚拟机HOME目录创建如下文件内容&#xff1a; cd /root vi emp.csv内容如下&#xff1a; 7369,SMITH,CLERK,7902,1980/12/17,800,,20 7499,ALLEN,SALESMAN…