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


    1.先安装nodemailer
    npm i --save nodemailer 
    
    • 1
    2.代码

    app.js

    // 发送邮件验证码路由
    const emailRouter = require("./router/email");
    app.use("/", emailRouter);
    
    • 1
    • 2
    • 3

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    注意
    1. auth的user和options的from的邮箱需要一致,不然会报错
    求助
    1. 我想实现的另一个功能是登录用户给另一个用户发送邮箱,所以由于两个邮箱需要一致,我还在想解决办法
    2. 我的验证码发送之后是直接加密存储在users用户表中的,当客户端验证成功之后会清除掉验证码数据,但我总觉得这个方法有点问题。
  • 相关阅读:
    机器学习小知识--面试得一塌糊涂
    如何自己制作电子杂志
    【Go】Go结构体内存对齐
    设计模式之享元模式
    Idea JavaWeb项目,继承自HttpFilter的过滤器,启动Tomcat时部署工件出错
    springboot+vue+elementUI 篮球竞赛预约平台#毕业设计
    30天Python入门(第二十五天:深入了解Python中的pandas)
    图像超分经典网络ESRGAN精确解析
    HttpClient使用不当,服务挂了,是时候系统学习一下了
    微服务分布式基于Springcloud的拍卖管理系统597wx
  • 原文地址:https://blog.csdn.net/Wu_JingYi0829/article/details/127844595