发送邮箱验证码
前置内容
本文内容中未定义的方法和函数请先阅读:
- 【Npm nodemailer】:https://www.npmjs.com/package/nodemailer
- 【云剪切板——统一后端返回数据格式】:https://www.hyz.cool/articles/209
- 【Nodejs express 连接 Redis】:https://www.hyz.cool/articles/208
路由
- UserController.js
const express = require("express")
const UserController = express.Router();
const UserService = require("../services/UserService")
/**
* 发送邮箱
*/
UserController.get("/email",UserService.sendEmailCode)
module.exports = UserController
js
发送邮箱工具类
- EmailSender.js
const nodeMailer = require("nodemailer")
//配置
const EmailConfig={
host:'smtp.126.com',
secure:true,
auth:{
user:"***@126.com",
pass:"****"
}
}
let transporter = nodeMailer.createTransport(EmailConfig)
//发送验证码
export const sendCode = (email, code) => {
//邮件内容
let mailOptions = {
from: `"续加仪的云剪切板" <${EmailConfig.auth.user}>`,//发送者
to: email,//接收者
subject: "续加仪云剪切板注册验证码",//主题
html: `<p style="text-indent: 20px;">您本次注册账号的邮箱验证码是:</p>
<p style="text-align: center;text-decoration: underline;font-size: x-large;text-space: 3px;"><strong>${code}</strong></p>
<p style="text-indent: 10px;">有效时间3分钟,请不要向任何人泄漏!</p>
<p style="text-align: right;">【续加仪的云剪切板】</p>
<p style="text-align: right;">【祝好!】</p>`
}
//发送并返回结果
return new Promise((resolve, reject) => {
transporter.sendMail(mailOptions,(error,info)=>{
if(error) reject("发送验证码失败!",error)
else resolve("发送验证码成功")
})
})
}
js
发送邮箱验证码
- UserService.js
/**
* 发送邮箱验证码
*/
export const sendEmailCode = [
validator.query("email","邮箱地址不能为空").isLength({min:1})
.custom(email=>{
return new Promise((resolve, reject)=>{
let reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
if(reg.test(email))resolve(true)
else reject("邮箱格式不正确")
})
}),
(req,res,next)=>{
//校验参数
let validationResult = validator.validationResult(req);
if (!validationResult.isEmpty()) return Result.result(res, Result.invalidParams(validationResult.array()))
//拿到参数
let {email} = req.query;
//判断是否已经发过
RedisService().get(KEY.EMAIL+email).then(result=>{
if(result) return Result.result(res,Result.failed("验证码已经发送过了,请3分钟后再试"))
//生成code
let code = parseInt(Math.random()*1000000)%900000+100000
//发送
sendCode(email,code).then(result=>{
//写入缓存
RedisService().set(KEY.EMAIL+email,code,{EX:3*60});
//返回结果
return Result.result(res,Result.success("发送邮箱验证码成功"))
}).catch(err=>{
return Result.result(res,Result.failed("发送邮箱验证码失败"))
})
}).catch(err=>{
return Result.result(res,Result.failed("查询邮箱验证码失败"))
})
}]
js