nodejs实现邮箱发送验证码及验证码认证功能

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("验证码清除失败!");
    });
  });
};
注意
  1. auth的user和options的from的邮箱需要一致,不然会报错
求助
  1. 我想实现的另一个功能是登录用户给另一个用户发送邮箱,所以由于两个邮箱需要一致,我还在想解决办法
  2. 我的验证码发送之后是直接加密存储在users用户表中的,当客户端验证成功之后会清除掉验证码数据,但我总觉得这个方法有点问题。
  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值