写在前面:

嘤嘤嘤 开头嘤嘤嘤,先扯一哈卵谈?,然后再聊代码修福报。大家都知道忘记密码一直是一个让人头大的问题,比如我这鱼的记忆就忘记了Ubuntu里面的MySql密码 然后直接GG...只能删库跑路啦 我没了 我人直接没啦。这是双系统里面的Ubuntu,不是虚拟机里的Ubuntu,有图有真相.....忘记密码的后果是很严重的。

正是因为有极少部分像我一样的、会忘记密码的沙雕存在,所以找回密码功能是非常重要的。找回密码功能简单来说就是俩个步骤:①输入账号并通过验证,证明这个号是你的;②输入新密码,MD5加密保存到数据库的用户表中。(关于MD5加密存储,前段时间写过一篇博文 传送门:C#操作Sql Server数据库以及MD5加密存储)。现在的验证方式有很多种:通过邮箱进行验证、通过手机号进行短信验证、通过密保问题进行验证...等等。我考虑到运营商需要收取一毛钱一条的短信费,于是手机号验证直接被我pass掉了(此处手动滑稽并流下穷人的泪水)。然后通过密保问题来进行很简单实现的,我记得早期QQ就有这个密保验证找回密码的功能。当时QQ要求填写3个密保问题,比如:你的小学班主任是?你的学号是?.....个人不是很喜欢密保问题验证找回密码,于是我在数据库大作业中选择的找回密码方式是邮箱认证。好了 原谅我是个话痨,终于说到这篇博文的正题啦——C#如何通过邮箱认证来找回密码。(QQ邮箱的小弹窗真好!点击文本链接还可以跳转到网页)。

获取QQ邮箱授权码:

在QQ邮箱的邮箱设置中,进入账户页面,开启QQ邮箱的一系列服务?然后验证密保即可获取当前账号的QQ邮箱授权码。什么是授权码,它又是如何设置的?咱也不知道咱也不敢问(手动滑稽.jpg 紫色字体是传送门 点击跳转)。

授权码其实就是一个QQ邮箱推出的、长度为16位的、用于登录第三方客户端的专用密码。

————————————————2019.06.20更新—————————————————

需要注意一点:QQ邮箱的授权码是具有时效性的,一段时间后授权码会失效而导致邮箱验证码发送失败。

这种情况很好解决的,只需要在QQ邮箱中重新获取一个新的授权码即可,为了方便更新授权码,我把授权码写成了全局变量。

这样只需把之前的源代码中的发件人邮箱用Program.QQemail代替,授权码用Program.AuthorizationCode代替即可。

————————————————————————————————————————

验证码的生成:

验证码的生成,其实就是伪随机字符串的生成。这部分在前面的博文C#生成图形验证码中已经提到过了。我是通过无脑for循环+Random随机选择字符来实现的.......?

先把验证码中包含的所有元素(大小写字母和数字)放入一个string型的字符串list中,然后调用Random()随机生成一个下标,通过这个下标来获取list中对应的字符,for循环length次后,就能得到一个长度为length的伪随机验证码。是不是很简单很low呀??我直接把这段代码写在了项目的静态类Program中,这样的话,所有窗体都可以通过调用静态方法Program.CreateRandomCode(length)来生成一个包含大小写字母和数字的、长度位length的伪随机验证码。

public static string CreateRandomCode(int length)  //生成由数字和大小写字母组成的验证码
{string list = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";  //list中存放着验证码的元素Random random = new Random();string code = "";   //验证码for (int i = 0; i < length; i++)   //循环6次得到一个伪随机的六位数验证码{code += list[random.Next(0, list.Length - 1)];}return code;
}

C#发送邮件:

嘤嘤嘤,这部分需要先引进俩个命名空间。

using System.Net;
using System.Net.Mail;

接着实例化邮件类MailMessage,然后就像很简单了呀。像正常地写邮件一样:输入收件人邮箱地址、邮件标题、邮件内容等等。最后输入发件人邮箱和邮箱授权码验证你的身份就发送成功了。

MailMessage mail = new MailMessage();  //实例化一个邮件类
mail.From = new MailAddress("(发件人邮箱地址)");   //发件人邮箱地址
mail.To.Add(new MailAddress("(收件人邮箱地址)"));    //收件人邮箱地址
mail.Subject = "(邮件标题)";    //邮件标题
mail.Body = "(邮件内容)";  //邮件内容
SmtpClient client = new SmtpClient("smtp.qq.com");   //实例化一个SmtpClient类
client.EnableSsl = true;    //使用安全加密连接
client.Credentials = new NetworkCredential("(发件人邮箱)", "(邮箱授权码)");//验证发件人身份(发件人邮箱,邮箱授权码);
client.Send(mail);  //发送邮件
MessageBox.Show("发送成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

不要问我是怎么晓得的,问就是我像蔡徐坤一样会ctrl。虽然我写代码的样子菜得像蔡徐坤,但是我会ctrl啊。写代码的样子菜得像蔡徐坤真的一点不要紧,最重要的是要像蔡徐坤一样会ctrl,这里的ctrl不是指像坤坤一样喜欢唱跳rap篮球,而是说要会用多用ctrl+鼠标左键。碰到不懂的函数或类就直接Ctrl+鼠标左键点击它查看它的定义。

比如对着MailMessage按下ctrl+鼠标左键点击后,就能查看它的定义,如图:

邮箱验证的时间控制:

根据常识我们可以知道,邮箱验证的时间是需要控制的,比如:①发送邮件验证码的一定时间内不能再次发送(我设定的是1分钟);②邮件验证码具有时效性,超过一定的时间验证码就会失效(我设定的是5分钟)。我先定义了全局变量:俩个计时器cnt1、cnt2和一个邮箱验证码code。然后用到了俩个Timer控件,一个用于控制多次发送验证码的时间间隔,一个用来记录验证码的有效期限。"Talk is cheap, show me the code." (注释已经写得很详细啦)

private void Button_Click(object sender, EventArgs e)   //发送邮箱验证码
{string userid = textBox1.Text.Trim();   //账号string email = textBox2.Text.Trim();    //邮箱if (!String.IsNullOrEmpty(userid)&&!String.IsNullOrEmpty(email))  //账号、邮箱非空{SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=Library;User ID=sa;Password=sql123");connection.Open();SqlCommand command = new SqlCommand("SELECT username,email FROM login_table WHERE username='" + userid + "' AND email='" + email + "'", connection);SqlDataReader data = command.ExecuteReader();if (data.HasRows)   //若输入的电子邮箱是账号注册时填写的邮箱{try{MailMessage mail = new MailMessage();  //实例化一个发送邮件类mail.From = new MailAddress("tanyaodan@qq.com");   //发件人邮箱地址mail.To.Add(new MailAddress(email));    //收件人邮箱地址mail.Subject = "【HBU图书管理系统】找回密码";    //邮件标题code = Program.CreateRandomCode(6);   //生成伪随机的6位数验证码mail.Body = "验证码是: " + code + ",请在5分钟内进行验证。验证码提供给他人可能导致账号被盗,请勿泄露,谨防被骗。系统邮件请勿回复。";  //邮件内容          SmtpClient client = new SmtpClient("smtp.qq.com");   //实例化一个SmtpClient类。client.EnableSsl = true;    //使用安全加密连接client.Credentials = new NetworkCredential("tanyaodan@qq.com", "(16位授权码不能泄露)");//验证发件人身份(发件人的邮箱,邮箱里的生成授权码);        client.Send(mail);//计时器初始化cnt1 = 60;cnt2 = 300;timer1.Enabled = true;   //time1用来记录1分钟timer2.Enabled = true;   //time2用来记录5分钟button.Enabled = false;  //发送按钮不可点击//MessageBox.Show("发送成功!");}catch{MessageBox.Show("发送失败!\n请检查邮箱是否输入有误。", "", MessageBoxButtons.OK, MessageBoxIcon.Error);}}else{MessageBox.Show("该邮箱不是账号绑定的邮箱。", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);}}else{MessageBox.Show("请将账号和邮箱填写完整!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}
}private void Timer1_Tick(object sender, EventArgs e)    //发送完邮件,需要60秒后才能再次发送邮件
{if (cnt1 > 0){cnt1--;button.Text = "发送(" + cnt1 + ")";}else{timer1.Enabled = false;button.Enabled = true;button.Text = "发送";}
}private void Timer2_Tick(object sender, EventArgs e)    //验证码5分钟内有效,但是如果有新的验证码出现,旧验证码就会GG
{if (cnt2 == 0){timer2.Enabled = false;code = Program.CreateRandomCode(6);    //旧的验证码过期,生成一个新的验证码}
}

关于账号绑定邮箱:

这部分我是在用户注册的时候实现的,将用户注册的所有信息都保持到sql server数据库中的login_table表中。在找回密码时,只需要连接到sql server通过SELECT语句进行查询即可,只有当输入的账号和邮箱是绑定好的才能发送邮件验证码进行邮箱验证。这部分很简单实现的,在上面的那个代码块里已经写啦,看下效果图吧(原谅我的找回密码界面很丑?)。

验证码正误判断:

验证码的判断是忽略字母大小写的,这里我把文本框textBox中输入的内容和邮箱验证码都通过ToLower()来转换成小写字母再进行比对。

if (textBox.Text.ToLower() != code.ToLower())   //若验证码输入错误
{MessageBox.Show("您输入的验证码有误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else   //验证成功
{MessageBox.Show("验证成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

好好coding,天天向上!

C#通过邮箱验证来找回密码相关推荐

  1. 网站发送邮箱验证实现找回密码

    从上图可以看出,浏览器通过访问web站点中的邮件发送程序来提交邮件发送请求. 邮件发送程序将把邮件发送给自己网站的SMTP服务器,该SMTP服务器收到邮件后,将根据收件人的地址在将邮件的目的地,要么是 ...

  2. java web 找回密码_JavaWeb利用邮箱帮用户找回密码

    本文是介绍在一个小的JAVAWeb项目中,利用邮箱帮用户找回密码. 效果展示 需要一个发送邮件的jar包 : javax.mail .jar 1.JSP页面(设置邮箱输入框) pageEncoding ...

  3. SpringBoot+Vue实现邮箱登录注册找回密码(附接口文档)

  4. php 找回密码功能,找回密码类

    ~~~ /** * 找回密码_步骤 ** 判断帐号类型 ** 手机发送验证码||邮箱发送验证码 ** 修改密码 **/ public function findpass() { $step = I(' ...

  5. javaWeb实现使用邮箱邮件找回密码功能

    JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...

  6. html实现密码手机找回,找回密码.html

     找回密码 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

  7. ThinkPHP 3.2 用户注册邮箱验证帐号找回密码

    一.前言 当然现在有的网站也有手机短信的方式找回密码,原理就是通过发送验证码来验明正身,和发送邮件验证一样,最终还是要通过重置密码来完成找回密码的流程. 本文将使用PHP+Mysql+jQuery来实 ...

  8. php通过邮箱找回密码,PHP邮件验证找回密码

    内容转载自网络,如有侵权请留言. 话不多说直接上代码. 前台HTML+Jq操作: 输入您注册的电子邮箱,找回密码: $(function(){ $("#sub_btn").clic ...

  9. 邮箱验证修改密码,通过邮箱找回密码

    使用邮箱验证修改密码,在这里我是使用163免费邮进行测试 前台代码 1 <input type="text" name="Mail" id="M ...

最新文章

  1. 如何让Python不回显获取密码输入
  2. svn git 导入本地文件到远程服务器 import
  3. VC中BSTR和CString的使用
  4. 【MFC】在CHtmlView中准确判断页面加载完成
  5. poj2912(带权并查集+枚举)
  6. python中怎么比较两个列表的大小_Python:找到两个列表中存在的给定长度的公共子列表...
  7. CodeDay#7 启动 | 北京欢迎你
  8. [vue-cli]vue-cli默认是单页面的,那要弄成多页面该怎么办呢
  9. HDU - 2609 - How many
  10. 自动生成数据同步存储过程的存储过程
  11. 数据库表历史数据备份(定时任务)
  12. 纪念feedsky彻底成为广告公司
  13. 分了很多节的word文档,使用尾注插入的参考文献,最后怎么在参考文献之后加入致谢?
  14. java+selenium键盘操作
  15. matplotlib自定义鼠标光标坐标格式
  16. btrfs filesystem 增加容量
  17. Ant Design删除操作弹出对话框
  18. PDPS软件:机器人最佳布局位置自动选择功能介绍与使用方法
  19. 【Qt入门第23篇】 数据库(三)利用QSqlQuery类执行SQL语句
  20. iOS Jenkins自动化打包 上传fir、蒲公英、邮件、钉钉提醒

热门文章

  1. c++标准库第五章通用工具5.1Pari和Tuple
  2. 悄悄告诉你免拔卡TikTok不要再用,一图吓死你
  3. CG动画制作项目第十篇:插件Form的使用
  4. 小米预装的安全应用程序中存在漏洞
  5. Centos5.8 安装SVN并配置HTTP访问
  6. 借助 Istio 让服务更具弹性 | 周末送福利
  7. PC#1 ping PC#2,请描述PC1和PC2之间的通信过程【杭州多测师】【杭州多测师_王sir】...
  8. 2021年知数堂公开课首秀
  9. 【stm32f407】独立看门狗 iwdog
  10. springboot基于Java的服装穿搭信息管理系统的设计与实现