Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#通过邮箱验证来找回密码

C#通过邮箱验证来找回密码

作者头像
喜欢ctrl的cxk
发布于 2019-11-08 02:41:02
发布于 2019-11-08 02:41:02
1.6K028
代码可运行
举报
文章被收录于专栏:Don的成长史Don的成长史
运行总次数:28
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

代码语言:txt
AI代码解释
复制
                 本文链接:[https://blog.csdn.net/weixin\_42449444/article/details/90722070](https://blog.csdn.net/weixin_42449444/article/details/90722070) 

写在前面:

嘤嘤嘤 开头嘤嘤嘤,先扯一哈卵谈?,然后再聊代码修福报。大家都知道忘记密码一直是一个让人头大的问题,比如我这鱼的记忆就忘记了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的伪随机验证码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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#发送邮件:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Net;
using System.Net.Mail;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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." (注释已经写得很详细啦)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()来转换成小写字母再进行比对。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (textBox.Text.ToLower() != code.ToLower())   //若验证码输入错误
{
    MessageBox.Show("您输入的验证码有误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else   //验证成功
{
    MessageBox.Show("验证成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

好好coding,天天向上!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/06/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LLM 效果不好?可能是 Prompt 写错了!Prompt Engineering 技术的最全综述
生成式人工智能(GenAI)系统,特别是基于Transformer架构的大型语言模型(LLM),正在迅速崛起并被广泛应用于各个行业和研究领域。这些模型能够通过文本、图像、音频或视频等多种形式的“提示”(prompt)进行交互,并根据提示生成相应的文本、图像、音频或视频输出。 LLM 从撰写营销邮件到解决数学问题,其应用范围不断拓展。 但是,想要有效地利用LLM需要掌握提示工程(prompt engineering)技术,即设计和优化提示以获得最佳结果。 这门新兴领域正快速发展,新的提示技术层出不穷,但同时也面临着术语混乱和缺乏系统性理解等挑战。
Lion 莱恩呀
2025/04/04
8240
LLM 效果不好?可能是 Prompt 写错了!Prompt Engineering 技术的最全综述
Prompt工程师指南从基础到进阶篇:用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题
Prompt工程是一种相对较新的学科,用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题。Prompt工程技能有助于更好地理解大型语言模型(LLMs)的能力和局限性。研究人员使用Prompt工程来改善LLMs在各种常见和复杂任务上的能力,
汀丶人工智能
2023/05/14
3.7K1
Prompt工程师指南从基础到进阶篇:用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题
提升ChatGPT性能的实用指南:Prompt Engineering的艺术
提示工程是一门新兴学科,就像是为大语言模型(LLM)设计的"语言游戏"。通过这个"游戏",我们可以更有效地引导 LLM 来处理问题。只有熟悉了这个游戏的规则,我们才能更清楚地认识到 LLM 的能力和局限。
腾讯技术工程官方号
2023/08/11
1.7K0
提升ChatGPT性能的实用指南:Prompt Engineering的艺术
Prompt Engineering:提示词工程最佳实践与应用
随着人工智能技术的不断发展,特别是大型语言模型(LLM)的兴起,提示词工程(Prompt Engineering)逐渐成为提升AI模型性能、增强任务执行效率的关键技术。Prompt Engineering通过设计和优化提示词(Prompt),引导LLM生成特定类型的输出,广泛应用于文本生成、数据增强、代码生成、问答系统等领域。本文将深入探讨Prompt Engineering的背景知识、功能点、优点、缺点,以及与市场其他技术的对比,并结合具体业务场景和底层原理,通过Java示例展示其实际应用。
小马哥学JAVA
2024/12/26
9100
提示工程(prompt engineering):技术分类与提示词调优看这篇就够了
在人工智能盛起的当下,出现了一个新兴的行业——提示工程(prompt engineering)。提示词,简言之,就是我们和AI说的话。在人机交互模式下,一个好的提示词,往往能产生事半功倍的效果。文本领域,好的提示词往往能超越RAG/Agent所能发挥的能力;图片对应的视觉领域,好的提示词往往能产生更好地图片/视觉效果。
山行AI
2024/04/30
4.6K0
提示工程(prompt engineering):技术分类与提示词调优看这篇就够了
Agent 应用于提示工程
如果Agent模仿了人类在现实世界中的操作方式,那么,能否应用于提示工程即Prompt Engingeering 呢?
半吊子全栈工匠
2023/10/30
5230
Agent 应用于提示工程
提示工程Prompt Engineering
上一篇大型语言模型LLM中,介绍了什么是LLM、LLM的基础内容,并提到LLM将利用词汇的分布生成文档。这一篇是关于提示和提示工程的介绍,主要内容是我们如何影响词汇的分布。
MySQLSE
2024/06/14
1380
提示工程Prompt Engineering
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistenc
看完基础篇的各种场景介绍后,你应该对 Prompt 有较深的理解。之前的章节我们讲的都是所谓的「术」,更多地集中讲如何用,但讲「道」的部分不多。高级篇除了会讲更高级的运用外,还会讲更多「道」的部分。高级篇的开篇,我们来讲一下构成 prompt 的框架。
汀丶人工智能
2023/05/12
2.3K0
解锁LLMs的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展
Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,如算术推理(arithmetic reasoning)、常识推理(commonsense reasoning)、符号推理(symbolic reasoning)。
汀丶人工智能
2024/06/15
9280
解锁LLMs的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展
一个通用的自适应prompt方法,突破了零样本学习的瓶颈
今天要给大家介绍一篇Google的研究,解决了大语言模型(LLMs)在零样本学习方面的困境。相比于少样本学习,LLMs在零样本学习上常常表现得比较弱,这主要是因为缺乏指导。而且,目前的研究对零样本学习的改进也不多,因为在没有真实标签的任务中设计prompt方法还比较困难。
zenRRan
2023/08/22
7970
一个通用的自适应prompt方法,突破了零样本学习的瓶颈
来啦来啦!关于CoT提示策略综述
思维链(CoT)是一个循序渐进、连贯的推理链,通常被用作大型语言模型(LLM)的提示策略并体现出了巨大的优势。近年来,基于CoT提示的展示出的效果吸引了众多的研究。
zenRRan
2023/10/14
1.3K0
来啦来啦!关于CoT提示策略综述
大语言模型的预训练[6]:思维链(Chain-of-thought,CoT)定义原理详解、Zero-shot CoT、Few-shot CoT 以及在LLM上应
在 2017-2019 年之间,随着 Transformer 模型的提出,计算资源与大规模语料库不断出现,自然语言处理领域发生了翻天覆地的变化,传统的全监督学习的范式逐渐达到了瓶颈,很难在传统的训练方式上取得大幅度提升。这时大规模预训练模型的如 Bert、RoBERTa 等模型的出现使得研究方向转向了以预训练模型为基础 + 下游任务 Fine-tune 的范式。
汀丶人工智能
2023/07/20
3.1K0
大语言模型的预训练[6]:思维链(Chain-of-thought,CoT)定义原理详解、Zero-shot CoT、Few-shot CoT 以及在LLM上应
不写代码也能年薪百万?Prompt+低代码开发实战
近期 AIGC 狂潮席卷,“前端走向穷途”“低代码时代终结”的言论甚嚣尘上。事实上 GPT 不仅不会干掉低代码,反而会大幅度促进低代码相关系统的开发。本文会介绍 GPT Prompt Engineering 的基本原理,以及如何帮助低代码平台相关技术快速开发落地的技术方案。接着往下看吧~
腾讯云开发者
2023/06/13
1.3K0
不写代码也能年薪百万?Prompt+低代码开发实战
提示词(prompt)工程指南(一):提示介绍
提示工程是一种相对较新的学科,专门用于开发和优化提示,以高效地使用语言模型(LM)来处理各种应用和研究主题。提示工程技能有助于更好地理解大型语言模型(LLMs)的能力和局限性。研究人员使用提示工程来提高LLMs在各种常见和复杂任务上的容量,例如问题解答和算术推理。开发人员使用提示工程来设计与LLMs和其他工具接口的强大而有效的提示技术。
云微
2023/03/31
2.3K0
AI在线求鼓励?这些人一句话让GPT-3算术准确率提升61%
机器之心报道 编辑:张倩、小舟 GPT-3 对一些问题的回答令人大跌眼镜,但它可能只是想要一句「鼓励」。 「一个玩杂耍的人总共有 16 个球,其中一半是高尔夫球,高尔夫球中又有一半是蓝色的球,请问蓝球总共有多少个?」 对于一个小学生来说,这是一道再简单不过的数学题。但看似无所不能的 GPT-3 却被这道题难住了。 如果你输入这个问题之后,直接向 GPT-3 发问:「问题的答案(阿拉伯数字)是:__?」它会「不假思索」地给出一个错误答案:8。 GPT-3:你别说准不准,你就说快不快吧。 怎么能让 GPT-
机器之心
2022/05/27
8980
AI在线求鼓励?这些人一句话让GPT-3算术准确率提升61%
提示词(prompt)工程指南(三):高级提示
到此为止,已经很明显完善提示有助于在不同任务上获得更好的结果。这就是提示工程的整体理念。
云微
2023/03/31
1.7K0
大模型Prompt-Tuning技术进阶
近两年来,随之Prompt-Tuning技术的发展,有诸多工作发现,对于超过10亿参数量的模型来说,Prompt-Tuning所带来的增益远远高于标准的Fine-tuning,小样本甚至是零样本的性能也能够极大地被激发出来,得益于这些模型的 参数量足够大 ,训练过程中使用了 足够多的语料 ,同时设计的 预训练任务足够有效 。最为经典的大规模语言模型则是2020年提出的GPT-3,其拥有大约1750亿的参数,且发现只需要设计合适的模板或指令即可以 实现免参数训练的零样本学习 。
@小森
2024/06/06
3910
大模型Prompt-Tuning技术进阶
Google | 提出CoT解码新方法,无需Prompt,就能让大模型(LLM)进行CoT推理
在增强大语言模型(LLM)的推理能力方面,先前的研究主要集中在特定的Prompt技术上,例如少样本(Few-shot)或零样本(Zero-shot)思维链(CoT)提示。这些方法虽然有效,但通常涉及手工密集型Prompt工程。
ShuYini
2024/02/22
6800
Google | 提出CoT解码新方法,无需Prompt,就能让大模型(LLM)进行CoT推理
99%的普通人不会用的AI沟通术:揭秘我与AI对话的沟通技巧
Prompt Engineering(提示工程)作为与 LLM 交互的关键技术,正逐渐成为连接人类需求与模型能力的桥梁。
AIGC新知
2025/04/13
1710
99%的普通人不会用的AI沟通术:揭秘我与AI对话的沟通技巧
LLM最全「怪癖」首曝光!马里兰OpenAI等30+学者祭出75页提示报告
最近,来自马里兰大学、OpenAI、斯坦福、微软等12所机构的30多名研究者,首次对LLM的提示技术进行了大规模的系统研究,并发布了一份长达75页的详尽报告。
新智元
2024/06/17
1120
LLM最全「怪癖」首曝光!马里兰OpenAI等30+学者祭出75页提示报告
推荐阅读
LLM 效果不好?可能是 Prompt 写错了!Prompt Engineering 技术的最全综述
8240
Prompt工程师指南从基础到进阶篇:用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题
3.7K1
提升ChatGPT性能的实用指南:Prompt Engineering的艺术
1.7K0
Prompt Engineering:提示词工程最佳实践与应用
9100
提示工程(prompt engineering):技术分类与提示词调优看这篇就够了
4.6K0
Agent 应用于提示工程
5230
提示工程Prompt Engineering
1380
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistenc
2.3K0
解锁LLMs的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展
9280
一个通用的自适应prompt方法,突破了零样本学习的瓶颈
7970
来啦来啦!关于CoT提示策略综述
1.3K0
大语言模型的预训练[6]:思维链(Chain-of-thought,CoT)定义原理详解、Zero-shot CoT、Few-shot CoT 以及在LLM上应
3.1K0
不写代码也能年薪百万?Prompt+低代码开发实战
1.3K0
提示词(prompt)工程指南(一):提示介绍
2.3K0
AI在线求鼓励?这些人一句话让GPT-3算术准确率提升61%
8980
提示词(prompt)工程指南(三):高级提示
1.7K0
大模型Prompt-Tuning技术进阶
3910
Google | 提出CoT解码新方法,无需Prompt,就能让大模型(LLM)进行CoT推理
6800
99%的普通人不会用的AI沟通术:揭秘我与AI对话的沟通技巧
1710
LLM最全「怪癖」首曝光!马里兰OpenAI等30+学者祭出75页提示报告
1120
相关推荐
LLM 效果不好?可能是 Prompt 写错了!Prompt Engineering 技术的最全综述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验