文章目录

  • 前言
  • 功能实现步骤
    • 一、获取QQ邮箱授权码
    • 二、功能界面
    • 三、创建发送邮箱验证码的类
    • 四、在From1中调用类中的函数,实现功能

前言

  在程序设计中,发送验证码是常见的一个功能,用户在注册账号或忘记密码时,通常需要发送验证码到手机或邮箱来验证身份,此篇博客介绍在C#WinForm中使用SMTP协议发送QQ邮箱验证码(其他邮箱方法类似)。
  关于"发送手机验证码",可以参考我这篇文章:使用SMS接口发送手机验证码


功能实现步骤

一、获取QQ邮箱授权码

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

  获取QQ邮箱授权码的方法


二、功能界面


三、创建发送邮箱验证码的类

QQ邮箱的SMTP使用了SSL加密,必须启用SSL加密,并且指定端口才能发送。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//发送邮件需要引用的命名空间
using System.Net.Mail;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;namespace MailVeriCode
{public class MailVeriCodeClass{#region  邮箱验证码功能/// <summary>///  生成随机验证码/// </summary>/// <param name="CodeLength">验证码长度</param>public static string CreateRandomMailCode(int CodeLength){int randNum;char code;string randomCode = String.Empty;//随机验证码//生成一定长度的随机验证码       //Random random = new Random();//生成随机数对象for (int i = 0; i < CodeLength; i++){//利用GUID生成6位随机数      byte[] buffer = Guid.NewGuid().ToByteArray();//生成字节数组int seed = BitConverter.ToInt32(buffer, 0);//利用BitConvert方法把字节数组转换为整数Random random = new Random(seed);//以生成的整数作为随机种子randNum = random.Next();//randNum = random.Next();                if (randNum % 3 == 1){code = (char)('A' + (char)(randNum % 26));//随机大写字母}else if (randNum % 3 == 2){code = (char)('a' + (char)(randNum % 26));//随机小写字母}else{code = (char)('0' + (char)(randNum % 10));//随机数字}randomCode += code.ToString();}return randomCode;}/// <summary>///  发送邮件验证码/// </summary>/// <param name="MyEmailAddress">发件人邮箱地址</param>/// <param name="RecEmailAddress">收件人邮箱地址</param>/// <param name="Subject">邮件主题</param>/// <param name="MailContent">邮件内容</param>/// <param name="AuthorizationCode">邮箱授权码</param>/// <returns></returns>public static bool SendMailMessage(string MyEmailAddress, string RecEmailAddress, string Subject, string Body, string AuthorizationCode){MailMessage mail = new MailMessage();mail.From = new MailAddress(MyEmailAddress);//发件人邮箱地址mail.To.Add(new MailAddress(RecEmailAddress));//收件人邮箱地址mail.Subject = Subject;//邮件标题mail.Body = Body;  //邮件内容  mail.Priority = MailPriority.High;//优先级SmtpClient client = new SmtpClient();//qq邮箱:smtp.qq.com;126邮箱:smtp.126.com              client.Host = "smtp.qq.com";client.Port = 587;//SMTP端口465或587client.EnableSsl = true;//使用安全加密SSL连接  client.DeliveryMethod = SmtpDeliveryMethod.Network;client.Credentials = new NetworkCredential(MyEmailAddress, AuthorizationCode);//验证发件人身份(发件人邮箱,邮箱授权码);                   try{client.Send(mail);}catch (Exception ex){MessageBox.Show(ex.Message, "发送失败", MessageBoxButtons.OK, MessageBoxIcon.Error);return false;}return true;}/// <summary>///  验证QQ邮箱/// </summary>/// <param name="mail">邮箱</param>/// <returns></returns>public static bool CheckMail(string mail){string str = @"^[1-9][0-9]{4,}@qq.com$";Regex mReg = new Regex(str);if (mReg.IsMatch(mail)){return true;}return false;}#endregion}
}

四、在From1中调用类中的函数,实现功能

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//需要引用的命名空间
using System.Net.Mail;
using System.Net;namespace MailVeriCode
{public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>///  发送邮箱验证码/// </summary>    int seconds1 = 60;//倒计时60sint seconds2 = 60 * 5;//验证码有效时间5分钟string strMailVeriCode;   private void btnMailVeriCode_Click(object sender, EventArgs e){string recEMailAddress = txtMail.Text.Trim();//收件人邮箱             strMailVeriCode = MailVeriCodeClass.CreateRandomMailCode(6);string strBody = "验证码:" + strMailVeriCode + ",5分钟内有效,请勿泄漏于他人。如非本人操作,请忽略。系统邮件请勿回复。";//邮件内容            string strSubject = "【代码科技】注册验证";//邮件标题string strMyEmailAddress = "XXXXXXX";//发件人邮箱string strAuthorizationCode = "XXXXXX";//邮箱授权码if (string.IsNullOrEmpty(recEMailAddress))//判断是否输入了邮箱{MessageBox.Show("请输入邮箱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);txtMail.Focus();}else if (MailVeriCodeClass.CheckMail(recEMailAddress) == false)//判断邮箱格式是否正确{MessageBox.Show("您输入的QQ邮箱有误,请重新输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);txtMail.Focus();return;}else//发送验证码{                //发送if (MailVeriCodeClass.SendMailMessage(strMyEmailAddress, recEMailAddress, strSubject, strBody, strAuthorizationCode) == true){btnMailVeriCode.Enabled = false;//计时器初始化              timer1.Interval = 1000;timer1.Start();timer2.Interval = 1000;timer2.Start();                    }else{               txtMail.Focus();}}}/// <summary>///  倒计时—邮箱验证码1分钟只能点击发送1次/// </summary> private void timer1_Tick(object sender, EventArgs e){if (seconds1 > 0){seconds1--;btnMailVeriCode.Text = "剩余" + seconds1.ToString() + "秒";}else{timer1.Stop();btnMailVeriCode.Text = "获取验证码";btnMailVeriCode.Enabled = true;}}/// <summary>///  手机SMS验证码5分钟内有效;但是如果有新的验证码出现,旧验证码就会失效        /// </summary>private void timer2_Tick(object sender, EventArgs e){if (seconds2 == 0){timer2.Stop();//旧的验证码过期,生成一个新的验证码strMailVeriCode = MailVeriCodeClass.CreateRandomMailCode(6);}}/// <summary>///  确认邮箱验证码/// </summary>      private void btnConfirm_Click(object sender, EventArgs e){string mailVeriCode = txtMailVeriCode.Text.Trim();//邮箱验证码  if (string.IsNullOrEmpty(mailVeriCode) == true){MessageBox.Show("请输入验证码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);txtMailVeriCode.Focus();}else if (mailVeriCode.ToLower() != strMailVeriCode.ToLower())//判断邮箱验证码是否输入正确;不区分字母大小写{MessageBox.Show("您输入的验证码有误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);txtMailVeriCode.Focus();return;}else{MessageBox.Show("验证成功!");}}}
}

参考文章:
https://blog.csdn.net/weixin_42449444/article/details/90722070

C# WinForm 使用SMTP协议发送QQ邮箱验证码相关推荐

  1. SpringBoot实现发送QQ邮箱验证码

    SpringBoot实现发送QQ邮箱验证码 打开qq邮箱官网 点击设置 找到开启服务:POP3/SMTP 然后复制给的密授权码(记住) 导入maven依赖坐标 <!--qq邮箱--> &l ...

  2. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...

  3. java实现发送qq邮箱验证码

    1.登录qq邮箱,开启POP3/SMTP服务 路径:qq邮箱--->设置---->选择账户----> 打开 按照要求发送短信后得到授权码 得到授权码后要记得点击确定,页面拉到最下方点 ...

  4. spring boot 使用javaMailSender 发送qq邮箱验证码

    一 qq邮箱设置 1登录邮箱打开设置 2点击账号 3开启 POP3/SMTP服务 4保存密钥(这个一定要保存后面在java里面要调用) 二. spring boot代码设置 1.maven导入jar包 ...

  5. java发送QQ邮箱验证码实现登录注册、邮箱验证码防刷校验

    文章目录 一:前台功能实现 1.1 页面编写 1.2 发送验证码--sendEmailCode 1.2.1 远程调用发送接口 1.2.1 接口防刷校验--60s内只能发送一次 二:获取QQ邮箱授权码 ...

  6. 登录系统-发送QQ邮箱验证码(2)

    在网上找了很久的QT基于smtp的发送邮件,最后找到了一个别人写的,可以用.下面是链接: https://download.csdn.net/download/weixin_39566101/1063 ...

  7. python应用POP3、IMAP、SMTP 协议,获取邮箱验证码

    POP3和IMAP是邮件相关的协议,IMAP是比POP3更高级一点的协议,实现了了客户端和服务端的交互:邮件协议在实际工作中的应用较为广泛. POP3 它是因特网电子邮件的第一个离线协议标准,POP3 ...

  8. php使用qq发邮件怎么发,php 发送QQ邮箱邮件

    这是我的源码比较简陋 https://www.lanzous.com/i2l7h8f 感谢 https://www.cnblogs.com/woider/p/6980456.html 下载phpmai ...

  9. [网络爬虫|smtp协议|python]东方财富网爬虫,python smtp协议发送爬取数据至QQ邮箱

    本文改自 [网络爬虫|smtp协议|python]东方财富网爬虫,python smtp协议发送爬取数据至QQ邮箱 之前写的爬虫单子,代码已经跑了快3个月了,后续又增加了一些需求,修改了一些小bug ...

最新文章

  1. 绝地求生现在服务器稳定吗,吃鸡服务器不稳定?《绝地求生》国服宣布将首次使用超性能服务器...
  2. Java 源代码和 C 源代码的运行区别
  3. 条件编译#ifdef的妙用详解
  4. .net 返回datatable显示sql列名_3汇总分析-SQL
  5. 进程间的通信方式(一):共享内存
  6. 吴恩达 coursera AI 专项二第三课总结+作业答案
  7. 提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用
  8. react学习(10)----react数组定义 从0开始 直接加个0下标空
  9. Vue中动态(import 、require)显示img图片
  10. [转载] java排序compareTo:降序输出学生成绩
  11. MyBatis:模糊查询的4种实现方式
  12. fileitem方法_FileItem的常用方法
  13. 理解SSD多盒-实时目标检测
  14. HTML恶搞代码 无限弹窗(超简短)
  15. 2022软考中级软件设计师---易混淆知识点总结1
  16. docx4j书签的妙用
  17. java 动态性之反射机制 详解 案例,一起来聊聊Synchronized底层实现原理
  18. MATLAB中矩阵求和的方法
  19. 1069三网合一集团短信通道固定接收号
  20. java win10窗口启动假死_win10底部任务栏卡死无响应解决

热门文章

  1. W10的AndroidStudio4.0.1的下载安装与配置
  2. 王道计组——计算机的组成
  3. postgresql获取基于当前时间计算的当月第一天,最后一天,下个月的第n天等功能
  4. Kotlin 注解全解析
  5. 【Developer Log】ProGuard扰码web项目(WAR)
  6. Android获取百度音乐下载音乐和歌词下载链接
  7. python虚拟数字人直播间带货
  8. Dubbo Wrapper
  9. 数字证书颁发及认证原理
  10. idea maven 仓库 jar 包下载不来下解决方案