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.hqwc.cn/news/61839.html

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

相关文章

【Spring专题】Spring之Bean的生命周期源码解析——上(扫描生成BeanDefinition)

目录 前言阅读指引阅读建议 课程内容一、生成BeanDefinition1.1 简单回顾1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 ClassPathBeanDefinitionScanner#scan2.2 ClassPathBeanDefinitionScanner#doScan2.3 ClassPathScanningCandidateComponentProvider#findCandidateCompon…

微服务Eureka注册中心

目录 一、Eureka的结构和作用 二、搭建eureka-server 三、服务注册 四、服务发现 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在的问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址…

混合云环境中 Kubernetes 可观测性的 6 个有效策略...

2023 年&#xff0c;原生云应用程序和平台将快速增长。组织不断努力最大限度地发挥其应用程序的潜力&#xff0c;确保无缝的用户体验并推动业务增长。 混合云环境的兴起以及 Kubernetes 等容器化技术的采用彻底改变了现代应用程序的开发、部署和扩展方式。 在这个数字领域&am…

Harbor企业镜像仓库部署(本地)

简述&#xff1a; Docker 官方镜像仓库是用于管理公共镜像的地方&#xff0c;大家可以在上面找到想要的镜像&#xff0c;也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网&#xff0c;或者不希望将自己的镜像放到互联网上&#xff0c;那么就需要用到 Docker Regis…

centos7安装phpipam1.4

by:铁乐与猫 date&#xff1a;2021-5-11 安装依赖 sudo yum install epel-release sudo yum install php-mcrypt安装 Apache, MySQL, PHP (LAMP) stack packages sudo yum install httpd mariadb-server php php-cli php-gd php-common php-ldap php-pdo php-pear php-snmp …

[保研/考研机试] KY87 鸡兔同笼 北京大学复试上机题 C++实现

描述 一个笼子里面关了鸡和兔子&#xff08;鸡有2只脚&#xff0c;兔子有4只脚&#xff0c;没有例外&#xff09;。已经知道了笼子里面脚的总数a&#xff0c;问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 输入描述&#xff1a; 每组测试数据占1行&#xff0c;…

【JVM】垃圾回收 ——自问自答2

Q: System.gc() 的理解 System.gc()底层调用的是 Runtime.getRuntime.gc(),会现实出发FullGC。 但是&#xff0c;它的调用附带一个免责声明&#xff0c;无法保证对垃圾收集器的调用。 Q&#xff1a; 内存溢出和内存泄漏&#xff1f; 内存溢出&#xff1a; 简而言之&#xf…

深入解析中国供应商API:关键字搜索接口对接与商品数据交互指南

随着电商行业的快速发展&#xff0c;越来越多的企业开始与中国供应商进行合作。而为了实现有效的数据交换和协作&#xff0c;接口对接成为了不可或缺的一环。本文将深入探讨中国供应商API&#xff0c;介绍如何高效地进行接口对接与数据交互&#xff0c;并提供实用的Python示例代…

Vue中使用qrcode说明

1.安装 npm i qrcode1.5.3 2.导入 import QRCode from qrcode 3.转换 说明&#xff1a;拿到服务器传来的字符串&#xff0c;转换成base64&#xff0c;然后通过img标签展示。 // 字符串转成二维码 let result await this.$API.reqPayInfo(this.orderId); 总结&#xff1a;

uniapp 微信小程序 封装公共的请求js(api版本)

一、新建api文件夹 在项目目录下创建api文件夹&#xff0c;内放files跟index.js文件夹&#xff0c;files文件夹内放每个页面对应的js请求接口 1、index.js /*** api接口的统一出口*/ const api {}; const requireComponent require.context(./files, false, /\.js$/) requi…

Oracle DB 安全性 : TDE HSM TCPS Wallet Imperva

• 配置口令文件以使用区分大小写的口令 • 对表空间进行加密 • 配置对网络服务的细粒度访问 TCPS 安全口令支持 Oracle Database 11g中的口令&#xff1a; • 区分大小写 • 包含更多的字符 • 使用更安全的散列算法 • 在散列算法中使用salt 用户名仍是Oracle 标识…

星戈瑞NH2-PEG-ICG应用纳米荧光成像

欢迎来到星戈瑞荧光stargraydye! NH2-PEG-ICG是一种具有胺基的聚乙二醇修饰的吲哚菁绿染料&#xff0c;常用于纳米荧光成像应用。以下是NH2-PEG-ICG在纳米荧光成像应用中的一些特点和优势&#xff1a; **1. 荧光性能&#xff1a;**NH2-PEG-ICG在近红外光谱区域&#xff08;约7…