C#实现邮箱验证码

开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core Web API,163邮箱

1、在163邮箱的设置中开通IMAP/SMTP的服务,授权成功后会弹出一个窗体(如下图所示),上面显示了授权密码,这个授权密码替代了邮箱的登录密码,后面配置时会用到。

2、建立一个验证码控制器

新建两个方法Create和Check,Create用于创建验证码,发送邮件,Check用于验证它是否有效。

声明一个静态类变量存放列表,列表中存放包含邮箱和验证码的对象。

        /// <summary>/// 返回邮件发送状态./// </summary>/// <param name="emailAddress">邮件地址.</param>/// <returns></returns>[HttpGet]public string Create(string emailAddress){try{VCodeEmailModel model = new VCodeEmailModel();model.emailAddress = emailAddress;var vcode = Utils.GetVCode();    // 生成验证码model.code = vcode;_list.Add(model);// 将邮件记录到缓存中this._cache.GetOrCreate(emailAddress, m =>{// 设置缓存有效期m.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(60);return "";});// 发送邮件EmailMessage email_model = new EmailMessage();email_model.Send(emailAddress, vcode);// 返回发送状态ReceiveObject result = new ReceiveObject();result.code = "0";result.msg = "验证成功";var json = JsonConvert.SerializeObject(result);return json;}catch(Exception ex){_logger.LogError(exception: ex, message: ex.Message);ReceiveObject result = new ReceiveObject();result.code = "999999";result.msg = "系统异常";var json = JsonConvert.SerializeObject(result);return json;}}/// <summary>/// 检查验证码是否有效./// </summary>/// <param name="emailAddress">邮件地址.</param>/// <param name="code">验证码.</param>/// <returns></returns>[HttpGet]public string Check(string emailAddress, string code){try{ReceiveObject result = new ReceiveObject();if (this._cache.Get(emailAddress) == null){_list.Remove(_list.Find(m => m.emailAddress == emailAddress));    // 发现过期的邮箱,将它从变量中剔除result.code = "2";result.msg = "验证码已过期";var json = JsonConvert.SerializeObject(result);return json;}var index = _list.FindIndex(m =>{if (m.emailAddress.Equals(emailAddress) && m.code.Equals(code)){return true;}return false;});if (index >= 0){_list.RemoveAt(index);result.code = "0";result.msg = "验证成功";var json = JsonConvert.SerializeObject(result);return json;}else{result.code = "1";result.msg = "验证失败";var json = JsonConvert.SerializeObject(result);return json;}}catch (Exception ex){_logger.LogError(exception: ex, message: ex.Message);ReceiveObject result = new ReceiveObject();result.code = "999999";result.msg = "系统异常";var json = JsonConvert.SerializeObject(result);return json;}}

3、建立一个发送电子邮箱的帮助类

代码可以参考:如何在 Asp.Net Core 中发送 Email_51CTO博客_.net core发送邮件

这里使用的是MailKit类库来实现发送邮件的功能。

163邮箱的smtp服务器是smtp.163.com,端口是465,密码使用第一步提供的授权密码。

注意:为了避免敏感暴露请使用用户机密,将敏感信息保持到本地,避免上传到代码管理服务器

4、建立一个验证码模型

验证码模型类包括:邮件地址和验证码属性。

    public class VCodeEmailModel{/// <summary>/// 邮箱地址./// </summary>public string emailAddress { get; set; }/// <summary>/// 验证码./// </summary>public string code { get; set; }}

参考:

如何在 Asp.Net Core 中发送 Email_51CTO博客_.net core发送邮件

关于发邮件报错535 Error:authentication failed解决方法_smtplib.smtpauthenticationerror: (535, b'error: au_逸尘️的博客-CSDN博客

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

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

相关文章

【数据可视化】(二)数据探索组件

目录 0.简介 一、数据模式与数据组织 1、数据的定义 2、数据库的定义 3、什么是数据模式? 4、数据模式举例 5、什么是数据纲要? 6、数据组织的层次 二、矢量数据 1、什么是矢量数据?

docker 容器中执行命令出现错误: 13: Permission denied

错误 13: Permission denied [rootVM-32-11-tencentos ~]# docker exec -it kibana1 /bin/bash kibana76c20c215dcb:~$ apt-get install vi E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) E: Unable to acquire the dpkg frontend…

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript&#xff1a; 一个由 ECMA International 进行标准化&#xff0c;TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript&#xff1a; ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范&#xff0c;并且可能被用于…

126、高频Redis面试题:如何保证Redis和数据库数据一致性

高频Redis面试题:如何保证Redis和数据库数据一致性 缓存用法如何更新缓存先更新缓存&#xff0c;再更新数据库先更新数据库&#xff0c;再更新缓存先删除缓存&#xff0c;再更新数据库延时双删&#xff08;删除缓存&#xff0c;更新数据库&#xff0c;再延时删除缓存&#xff0…

flask-----初始项目架构

1.初始的项目目录 -apps 包 ------存放app -user文件夹 -------就是一个app -models.py --------存放表模型 -views.py -------存放主代码 -ext包 -init.py -------实例化db对象 -manage.py -----运行项目的入口 -setting.py -----配置文件 2.各文件内容 manage…

【JavaSE】数组的定义与使用

详解数组 数组的基本概念什么是数组数组的创建及初始化数组的使用 数组是引用类型基本类型变量与引用类型变量的区别引用变量认识 null 数组的应用场景数组练习二维数组 数组的基本概念 什么是数组 数组可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。比如现实…

深入解析搜好货API:开启智能化电商解决方案

随着电商行业的快速发展&#xff0c;人们对于个性化、智能化的购物体验的追求也越来越高。为了满足消费者的需求&#xff0c;搜好货API应运而生。 一、搜好货API的基本原理 搜好货API基于先进的数据挖掘和机器学习算法&#xff0c;通过收集和分析大量的商品信息和用户行为数据…

【数学建模】--聚类模型

聚类模型的定义&#xff1a; “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计&#xff0c;分析或预测&#xff1b;也可以探究不…

[保研/考研机试] KY110 Prime Number 上海交通大学复试上机题 C++实现

题目链接&#xff1a; Prime Numberhttps://www.nowcoder.com/share/jump/437195121691717713466 描述 Output the k-th prime number. 输入描述&#xff1a; k≤10000 输出描述&#xff1a; The k-th prime number. 示例1 输入&#xff1a; 3 7 输出&#xff1a; …

STM32入门——DMA数据搬运工

DMA简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源12个独立可配置的通道&#xff1a; DMA1&#xff08;7个通道&#xff09;&#xff…

代理类型中的 HTTP、HTTPS 和 SOCKS 有什么区别?

HTTP、HTTPS 和 SOCKS 都是代理&#xff08;Proxy&#xff09;协议&#xff0c;用于在网络通信中转发请求和响应&#xff0c;但它们在工作原理和用途上有一些区别。下面是它们之间的主要区别&#xff1a; HTTP代理&#xff1a; 工作原理&#xff1a; HTTP 代理主要用于转发 HTT…

Qt 7. 在自定义类TcpClient类中使用信号槽功能

1. 因为只有QObject类及其子类派生的类才能使用信号和槽机制。 使用信号和槽还必须在类声明的最开始处添加Q_OBJECT宏&#xff0c;在这个程序中&#xff0c;类的声明是自动生成的&#xff0c;已经添加了这个宏。UI类继承自QDialog&#xff0c;QDialog类又继承自QWidget类&…

Map映射学习

一、Map的遍历 创建Map集合 Map<String, Integer> map new HashMap<>();添加元素 map.put("java", 99);map.put("c", 88);map.put("c", 93);map.put("python", 96);map.put("Go", 88); 遍历方法&#xff1a; …

gorm基本操作

一、gorm安装 1.下载gorm go get -u gorm.io/gorm //gorm框架 go get -u gorm.io/driver/mysql //驱动2.mysql准备工作 mysql> create database godb; mysql> grant all on *.* to admin% identified by golang123!; mysql> flush privileges;3.导入gorm框架 impo…

4-20mA模拟电流回路协议比0-20mA模拟电流回路协议有什么优势?

有很多原因使得我们采用4-20mA电流回路协议作为事实标准&#xff08;特别针对回路供电的设备&#xff0c;比如二线制传感器&#xff09;。其中最重要的有以下两点&#xff1a; 1&#xff09;在一个直流系统中&#xff0c;能够有效地侦测开路状态。如果在4-20mA系统中&#xff0…

Unity学习笔记--如何优雅简便地利用对象池生成游戏对象(进阶版)LRU + 对象池

前言 之前写过一篇关于对象池的文章&#xff0c;现在来看写的并不是很好&#xff0c;所以来考虑优化下。 现在来看一年前写的代码&#xff0c;越看越不能入目hhh Unity学习笔记–如何优雅简便地利用对象池生成游戏对象 前置知识 Unity学习笔记–使用 C# 开发一个 LRU 代码实…

Camunda 7.x 系列【7】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…

暑假集训笔记

Problem - B - Codeforces 这题看了好久&#xff0c;一直没思路..也可能是早上来没睡醒的原因吧.有点困.. 昨天晚上12点睡的&#xff0c;然后早上直接睡到7.48....真的6啊 话说这题真有点猜的成分&#xff0c; 先说我的思路&#xff1a;一开始和的奇偶 如果为偶数&#xf…

构建 LVS-DR 群集、配置nginx负载均衡。

目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、准备四台虚拟机 2、配置负载调度器&#xff08;192.168.2.130&#xff09; 3、部署共享存储&#xff08;192.168.2.133&#xff09; 4、配置两个Web服务器&#xff08;192.168.2.131、192.168.2.132&#xff09; 测试集群 二…

Location匹配与Rewrite重写

一、常见的Nginx正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“oll…