1.先安装nodemailer
npm i --save nodemailer
2.代码
app.js
// 发送邮件验证码路由
const emailRouter = require("./router/email");
app.use("/", emailRouter);
email.js
const express = require("express");
const router = express.Router();
// 导入邮件路由处理函数对应的模块
const email_handler = require("../router_handler/emailHandler");
// 发送验证码邮件
router.post('/api/sendemail',email_handler.sendEmail)
// 发送完了验证码,输入完验证码还要验证一下是否真确
router.post('/api/checkcode',email_handler.checkCode)
module.exports=router
emailHandler.js
// 引入db
const db = require("../db/index");
// 引入bryptjs进行密码加密
const bcrypt = require("bcryptjs");
// 邮件发送
let nodemailer = require("nodemailer");
// 发送验证码
exports.sendEmail = (req, res) => {
//console.log(req);
let transporter = nodemailer.createTransport({
// host: 'smtp.163.com',
service: "qq", //邮箱类型 例如service:'163'
secure: true, //是否使用安全连接,对https协议的
// port: 465, //qq邮件服务所占用的端口
auth: {
user: "xxx@qq.com", //开启SMTP的邮箱,发件人
pass: "授权码在qq邮箱中可以生成", // qq授权码
},
});
//产生随机验证码
var code = "";
for (var i = 0; i < 6; i++) {
code += Math.floor(Math.random() * 10);
}
let options = {
from: "xxx@qq.com", //发送方
to: req.body.user_email, //接收方
subject: "激活验证码", //邮件主题
text: "你的验证码为" + code, //邮件正文
};
transporter.sendMail(options, (err, info) => {
if (err) {
res.send(err);
} else {
// 加密验证码
code = bcrypt.hashSync(code, 10);
const sendCodeSql = "update users set user_code=? where user_email=?";
db.query(sendCodeSql, [code, req.body.user_email], (err, results) => {
console.log('-----------------------------------',results)
if (err) return res.cc(err);
if (results.affectedRows !== 1) return res.cc("添置验证码失败!");
res.send({
status: 0,
message: "添置验证码成功!",
data: { info, code },
});
});
}
});
};
// 验证验证码是否写对
exports.checkCode = (req, res) => {
const checkcodeSql = "select user_code from users where user_email=?";
db.query(checkcodeSql, req.body.user_email, (err, results) => {
if (err) return res.cc(err);
if (results.length <0) return res.cc("用户查找失败!");
const compareResult = bcrypt.compareSync(req.body.user_code, results[0].user_code);
if (!compareResult) return res.cc("验证码错误!");
res.cc("验证码正确!",0)
// 若验证码正确之后,需要将数据库中的验证码清除
const clearcodedSql="update users set user_code=null where user_email=?"
db.query(clearcodedSql, req.body.user_email, (err, results) => {
console.log(results)
if (err) return res.cc(err);
if (results.affectedRows !== 1) return res.cc("验证码清除失败!");
});
});
};
注意
- auth的user和options的from的邮箱需要一致,不然会报错
求助
- 我想实现的另一个功能是登录用户给另一个用户发送邮箱,所以由于两个邮箱需要一致,我还在想解决办法
- 我的验证码发送之后是直接加密存储在users用户表中的,当客户端验证成功之后会清除掉验证码数据,但我总觉得这个方法有点问题。