前言
昨天晚上和师傅聊天,说到机房重构的时候添加新功能,比如找回密码进行密码验证,扫码登录一类的东西,今天早上开始试着实现一下。大概用了两个小时的时间实现了这个功能,一开始看到代码很是烦躁,不知在哪开始下手,通过多篇博客的总结,分析和实践,最终实现了这个功能,也算是一大幸事
实现过程
首先在UI层创建一个验证的窗体(因为开始是实验,做了一个简单的),然后在邮箱号内输入数据库中对应的卡号注册时的邮箱号,然后在邮箱内会收到一封验证码,在验证码框输入即可验证。输入错误后,就会提示错误,正确后就会提示正确。
代码
using System;
using System.Net;
using System.Net.Mail;
using System.Windows.Forms;
namespace UI
{
public partial class frmE_Mail : Form
{
public frmE_Mail()
{
InitializeComponent();
}
//定义一个全局的string类型的验证码
string code= "";
//定义一个字符创,里面包含所需要的验证码元素
string a = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//定义一个时间,用于倒计时
int time;
private void button1_Click(object sender, EventArgs e)
{
//实例化一个随机数
Random b = new Random();
yzm = "";
//循环6次得到一个随机的六位数的验证码
for (int i = 0; i < 6; i++)
{
code= code+ a.Substring(b.Next(0, a.Length), 1);
}
//创建服务器对象
SmtpClient smtp = new SmtpClient("smtp.qq.com");
//创建邮件对象准备发送
MailAddress mail1 = new MailAddress("邮箱账号@qq.com");
try
{
//获取文本框的收件人的邮箱
MailAddress mail2 = new MailAddress(textBox1.Text);
//创建邮件对象,准备发送【mail1是发件人地址,mail2是收件人地址】
MailMessage mess = new MailMessage(mail1,mail2);
//邮件的标题
mess.Subject = "邮件验证码";
//邮件的内容
mess.Body = "您的验证码为" + code+ ",请在30分钟内验证,系统邮件请勿回复!";
//创建互联网安全证书
NetworkCredential cred = new NetworkCredential("邮箱账号@qq.com", "此为授权码");
//证书绑定到服务器对象以便服务器验证
smtp.Credentials = cred;
//开始发送
smtp.Send(mess);
//发送完成后按钮不可用
button1.Enabled = false;
//激活timer事件
timer1.Enabled = true;
//倒计时30秒
time = 30;
MessageBox.Show("发送成功");
}
catch
{
MessageBox.Show("输入正确的邮箱格式!");
}
}
private void button2_Click(object sender, EventArgs e)
{
if (code== textBox2.Text)
{
MessageBox.Show("正确");
}
else
{
MessageBox.Show("错误");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
time--;
button1.Text = "time";
if (time <= 0)
{
button1.Text = "发送";
timer1.Enabled = false;
button1.Enabled = true;
}
}
}
}
注意: 实现此功能,需要开启POP3/SMTP服务(发件者的服务)。具体步骤如下:
进入发送人qq邮箱→→设置→→账户→→开启POP3/SMTP服务
开启之后会有一个授权码,保存住,代码中会需要。
知识点:
1、原理:
例如A使用163邮箱发送邮件给B(qq邮箱)。首先A会把邮件通过SMTP(Simple Mail Transfer Protocol)协议传输到163的Smtp服务器上,163的Smtp服务器会根据B的邮箱账号,把邮件通过Smtp协议发给QQ邮箱的Smtp服务器。QQ的Smtp服务器接收到邮件消息后会将之存储在QQ邮箱的邮件存储设备上。当B登陆QQ邮箱后,如果有新邮件,POP3服务器就会从QQ邮箱的邮件存储设备上读出邮件并通过POP3/IMAP服务发送给邮件客户端的B。
关于SMTP 、POP3和IMAP(POP3和IMAP的区别)【研究不是很透彻】:
他们是邮件协议。
smtp是发送协议,pop3和IMAP是接收协议.
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
同时,IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。
2、SmtpClient、MailAddress和MailMessage
使用 SmtpClient 类和 MailMessage 类需引入 System.Net.Mail 命令空间,
SmtpClient:有三个重载
//创建服务器对象
SmtpClient smtp = new SmtpClient("smtp.qq.com");
MailAddress: 就是创建'发件者’对象。
//创建邮件对象准备发送
MailAddress ab = new MailAddress("[email protected]");
MailMessage: 此处的用法是
1、微软已经帮我们封装好了发送邮件的类 MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。MailMessage常用的一些属性有:
1.From:发件人邮箱地址。
1.2、To:收件人的邮箱地址。
1.3、CC:抄送人邮箱地址。
1.4、Subject:邮件标题。
1.5、Body:邮件内容。
1.6、Attachments:邮件附件
2、还需要用到SmtpClient类进行发送邮件。SmtpClient类的意思是:允许应用程序使用简单邮件传输协议 (SMTP) 来发送电子邮件。SmtpClient类常用的一些属性和方法:
2.1、Host: 获取或设置用于 SMTP 事务的主机的名称或 IP 地址。
2.2、EnableSsl:是否使用安全套接字层加密连接。
2.3、UseDefaultCredentials:是否随请求一起发送。
2.4、Credentials:获取或设置用于验证发件人身份的凭证。
2.5、Send():发送。