想要实现发送验证码功能,要准备:
- nodemail模块
- 一个有授权的发送验证码的邮箱
nodemail模块:是连接js应用和邮箱的桥梁。
是一个专门来发送消息的中转模块。
步骤
你需要做些什么来发送消息,将以下:
- 创建一个Nodemailer运输车使用 SMTP或一些其他的传输机制
- 设置 消息选项 (发送者 用户名、密码)
- 交付消息对象使用 sendMail () 你以前创建的运输车的方法
nodemailer模块
开启 Smtp : Simple Message Transfer Protocol 简单邮件传输协议
官网:https://nodemailer.com/about/
发送邮箱功能步骤:
1.先在qq邮箱(其他邮箱也可以)的设置\账户里面有个
开启服务:
POP3/SMTP服务 (如何使用 Foxmail 等软件收发邮件?)
已开启 | 关闭
IMAP/SMTP服务 (什么是 IMAP,它又是如何设置?)
已开启 | 关闭
把他俩都开启,记住授权码。
2.下载nodemailer模块
cnpm i -S nodemailer
之后重启程序npm start
3.引入nodemailer模块
var nodemailer = require('nodemailer');
配置邮箱,暴露邮箱接口
utils/config.js
var Email={
config:{
host: "smtp.qq.com",
port: 587,
auth: {
user: '993486146@qq.com', // 发件人
pass: 'vumkdmfgimwtbbci' // 密码
}
},
get transporter(){ //get方法,直接得到config对象 transporter:在controlers的user.js里要用这个方法
return nodemailer.createTransport(this.config);
},
get verify(){ //verify自定义的方法:生成验证码
return Math.random().toString().substring(2,6); //substring(2,6):验证码要4位,从2到6位提取
},
get time(){
return Date.now();
}
};
module.exports={
Mongoose,
Email
};
这里使用的是createTransport方法,与官网本质一样,只是形式不一样,这里先配置了,再传入createTransport来调用。
4.controlers/users.js
引入Email,解构赋值。
处理数据,编写验证码的接口。
使用transporter.sendMail()方法发送mailOptions,有容错处理。
var {Email} = require('../untils/config.js');
var verify=async(req,res,next)=>{
var email=req.query.email; //前端发送来的邮箱
var mailOptions={ //发送给用户显示的字段
from:'小猪网 xxxx@qq.com',
to: email,
subject: '小猪网邮箱验证码',
text: '验证码:'+ Email.verify
}
var info = await Email.transporter.sendMail(mailOptions)
if(info){
res.send({
msg:'验证码发送成功',
status:0
});
}else{
res.send({
msg:'验证码发送失败',
status:-1
});
}
};
到这里验证码就发送出去了。
接下来做的就是检查验证码是否生效了。
生效条件:正确、未过期
- 正确 : 发送验证码的时候,将验证码保存在session里;注册的时候,如果用户请求里邮箱一致、验证码等于session里的验证码,那么验证码就正确。
if(email !== req.session.email || verify !== req.session.verify){}
- 未过期 : 设置60秒过期,时间差小于60秒则未过期
if((Email.time - req.session.time)/1000 > 60){}