zoukankan      html  css  js  c++  java
  • koa2--nodemailer实现邮箱验证

    依赖包安装:

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

    引入使用:

     1 const Koa = require('koa')
     2 const redis = require('koa-redis')
     3 const nodeMailer = require('nodemailer')
     4 const bodyParser = require('koa-bodyparser')
     5 
     6 const app = new Koa()
     7 
     8 // redis数据库
     9 const store = redis().client
    10 
    11 // formData数据解析到ctx.request.body
    12 app.use(bodyParser())

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

     1 app.use(async ctx => {
     2   // 接口--/users/verify
     3   if ((ctx.request.url.indexOf('/users/verify') > -1) && (ctx.request.method === 'POST')) {
     4     // post参数名
     5     const { username, email } = ctx.request.body
     6 
     7     // 请求到期时间
     8     const expire = await store.hget(`nodemail:${username}`, 'expire')
     9 
    10     // 频率--1分钟内1次
    11     if (expire && (+new Date() - expire < 0)) {
    12       ctx.body = {
    13         code: -1,
    14         msg: '验证请求过于频繁,1分钟内1次'
    15       }
    16       return
    17     }
    18 
    19     // 配置参数
    20     const conf = {
    21       get user() {
    22         return '1489508889@qq.com'
    23       },
    24       get pass() { // smtp授权码,自行替换
    25         return 'xxxxxxxxxxxxx'
    26       },
    27       get code() { // 验证码
    28         return () => {
    29           return Math.random().toString(16).slice(2, 6).toUpperCase()
    30         }
    31       },
    32       get expire() { // 到期时间
    33         return () => {
    34           return +new Date() + 60 * 1000
    35         }
    36       }
    37     }
    38 
    39     const transportOptions = {
    40       service: 'QQ', // no need to set host or port etc. 更多邮箱支持 https://nodemailer.com/smtp/well-known/
    41       auth: {
    42         user: conf.user, // 发件邮箱
    43         pass: conf.pass // smtp授权码
    44       }
    45     }
    46 
    47     let code
    48 
    49     // 邮件模版
    50     const sendMailOptions = {
    51       from: `"认证邮件"<${conf.user}>`, // 发件人
    52       to: email, // 收件人
    53       subject: '注册验证', // 邮件主题
    54       html: `<h3>注册验证码是${code = conf.code()}</h3>` // 邮件内容
    55     }
    56 
    57     // create reusable transporter 
    58     let transporter = nodeMailer.createTransport(transportOptions)
    59 
    60     try {
    61       // send mail
    62       let info = await transporter.sendMail(sendMailOptions)
    63 
    64       if (info) {
    65         // 存储状态
    66         await store.hmset(`nodemail:${username}`, 'code', code, 'expire', conf.expire(), 'email', email, 'storageTime', +new Date())
    67 
    68         ctx.body = {
    69           code: 0,
    70           msg: '验证码发送成功'
    71         }
    72 
    73       }
    74     } catch (error) {
    75       console.log(error)
    76 
    77       ctx.body = {
    78         code: -1,
    79         msg: '验证码发送失败,请重新尝试'
    80       }
    81     }
    82   }
    83 })
    84 
    85 app.listen(4000, () => {
    86   console.log('server running at : 4000')
    87 })

    测试结果:

     

     

     

     QQ邮箱开启smtp:

  • 相关阅读:
    ERROR 1406 : Data too long for column 解决办法
    Sublime配置Python编译环境
    python下载包的时候,如何选择是win32,还是amd64的,其中的cp又是什么意思?
    曝光一个网站,我周末就耗在上面了。(学习)
    Matlab 画图时中文显示乱码的问题?(设置为“桌面代码”修改时区后还是乱码使用这个方法)
    什么是前端和后端开发,看完你就知道了
    彻底卸载mysql 个人亲测!
    python语言的优缺点
    阿里云、华为云和腾讯云等多家物联网平台的异同
    nfs Read only system 问题解决 + NFS 安装
  • 原文地址:https://www.cnblogs.com/caimuguodexiaohongmao/p/11812694.html
Copyright © 2011-2022 走看看