vue+node.js+koa2+mongoDB实现 koa2--nodemailer实现邮箱验证

依赖包安装:

/**
 * koa-bodyparser用于把formData数据解析到ctx.request.body
 * 通过ctx.request.body访问请求的参数
 * koa-redis用于保存状态
 */
npm install nodemailer koa-bodyparser koa-redis

引入使用:

const Koa = require('koa')
const redis = require('koa-redis')
const nodeMailer = require('nodemailer')
const bodyParser = require('koa-bodyparser')

const app = new Koa()

// redis数据库
const store = redis().client

// formData数据解析到ctx.request.body
app.use(bodyParser())
 

以QQ邮箱为发送方,实现过程:

app.use(async ctx => {
  // 接口--/users/verify
  if ((ctx.request.url.indexOf('/users/verify') > -1) && (ctx.request.method === 'POST')) {
    // post参数名
    const { username, email } = ctx.request.body

    // 请求到期时间
    const expire = await store.hget(`nodemail:${username}`, 'expire')

    // 频率--1分钟内1次
    if (expire && (+new Date() - expire < 0)) {
      ctx.body = {
        code: -1,
        msg: '验证请求过于频繁,1分钟内1次'
      }
      return
    }

    // 配置参数
    const conf = {
      get user() {
        return '1489508889@qq.com'
      },
      get pass() { // smtp授权码,自行替换
        return 'xxxxxxxxxxxxx'
      },
      get code() { // 验证码
        return () => {
          return Math.random().toString(16).slice(2, 6).toUpperCase()
        }
      },
      get expire() { // 到期时间
        return () => {
          return +new Date() + 60 * 1000
        }
      }
    }

    const transportOptions = {
      service: 'QQ', // no need to set host or port etc. 更多邮箱支持 https://nodemailer.com/smtp/well-known/
      auth: {
        user: conf.user, // 发件邮箱
        pass: conf.pass // smtp授权码
      }
    }

    let code

    // 邮件模版
    const sendMailOptions = {
      from: `"认证邮件"<${conf.user}>`, // 发件人
      to: email, // 收件人
      subject: '注册验证', // 邮件主题
      html: `<h3>注册验证码是${code = conf.code()}</h3>` // 邮件内容
    }

    // create reusable transporter
    let transporter = nodeMailer.createTransport(transportOptions)

    try {
      // send mail
      let info = await transporter.sendMail(sendMailOptions)

      if (info) {
        // 存储状态
        await store.hmset(`nodemail:${username}`, 'code', code, 'expire', conf.expire(), 'email', email, 'storageTime', +new Date())

        ctx.body = {
          code: 0,
          msg: '验证码发送成功'
        }

      }
    } catch (error) {
      console.log(error)

      ctx.body = {
        code: -1,
        msg: '验证码发送失败,请重新尝试'
      }
    }
  }
})

app.listen(4000, () => {
  console.log('server running at : 4000')
})
 

测试结果:




QQ邮箱开启smtp:

评论