依赖包安装:

/**
* 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:

koa2--nodemailer实现邮箱验证的更多相关文章

  1. (进阶篇)PHP实现用户注册后邮箱验证,激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...

  2. PHP用户注册邮箱验证激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...

  3. android 自定义view -- 实现自定义 邮箱验证的Edittext

    //onFinishInflate 当View中所有的子控件均被映射成xml后触发 /** * 实现自定义 实现邮箱验证的EidtText */public class CustomEditText ...

  4. [麦先生]在Laravel框架里实现邮箱验证---发送邮件

    在经过一段时间的使用后,发现在项目中很多地方需要用到用户验证,以短信验证和邮箱验证为主流趋势,小麦总结了如果在Laravel框架中实现发送邮件功能,以后会陆续更上如何实现短信验证..... 在.env ...

  5. javamail实现邮箱验证功能

    javamail是基于SMTP协议和POP3协议的邮件发送与接收系统,在用户注册与登陆的过程中,常需要用到邮箱验证功能,下面是基于javamail的一个简单实现 用户注册后通过servlet得到邮箱地 ...

  6. PHP邮箱验证是否有效

    今天一开电脑发现有人在我的主页给我乱留言,所以加了一个邮箱验证. 网上发现一个很巧妙的算法,分享一下: function checkmail($email){ $exp = "^[a-z'0 ...

  7. discuz3.2x增加邮箱验证功能

    为防止垃圾用户多次注册,为disczu增加邮箱验证功能. 大致分为二步: 1.申请邮箱,这里推荐使用腾讯免费企业邮箱:https://exmail.qq.com/portal/introducefre ...

  8. .net 实现注册邮箱验证激活

    没事上网当了个注册邮箱验证激活的代码,用起来感觉还不错,特意和大家要一起分享一下 下面是主要实现代码: uing System.Net.Mail; public partial class jquer ...

  9. JS非空验证及邮箱验证

    非空验证 <body> <table> <tr> <td>姓名:</td> <td><input type="t ...

  10. DEDECMS开启邮箱验证通知的解决方法

    [摘要]织梦CMS是开源内容管理系统,是国内开源CMS的领先品牌,目前程序安装量已达七十万,本文介绍DEDECMS会员注册时,开启邮箱验证通知的解决方法. 在论坛上看到很多人都说这个功能没用,邮箱根本 ...

随机推荐

  1. vue npm run dev 报错 semver\semver.js:312 throw new TypeError('Invalid Version: ' + version)

    npm run dev运行报错信息如下图: 原因分析: 版本问题 解决办法: 在semver.js(node_modules/semver/semver.js)里做了一些改动,代码如下: // if ...

  2. springMVC:为MultipartFilte配置了上传文件解析器,报错或不能使用

    一.问题描述为支持restful风格请求,并且应对可能上传文件的情况,需要在配置hiddenHttpMethodFilter过滤器之前配置MultipartFilter.目的是让MultipartFi ...

  3. python 一般处理

    #!/usr/bin/env python# -*- coding:utf-8 -*-# Author:afei# QQ:97259460# date = 2019/8/29 s_code1=''s_ ...

  4. Python3基础 None 使用is来判断

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  5. WebGL学习笔记(十六):遮罩

    这里总结下几种WebGL中实现遮罩的方法. 模板缓冲 模板缓冲可以实现渲染剔除,但是我们之前的学习里,剔除范围是基于上一次渲染的结果,且上一次的渲染也会进行显示,这样的话并不适合用来实现遮罩. 我们想 ...

  6. [转]TrueType字体结构

    TrueType字体通常包含在单个TrueType字体文件中,其文件后缀为.TTF. OpenType字体是以类似于TrueType字体的格式编码的POSTSCRIPT字体.OPENTYPE字体使用. ...

  7. 【GM4008】GM4008升级固件发布(版本V4.2.1.1)

    ===================== GM4008固件升级发布 ===================== 〇.简介:GM4008 8通道0-24mA电流采集模块,采用全电气隔离方案,配合高性能 ...

  8. MongoDB开发深入之三:复制

    复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录,复制是将主节点的oplog日志同步并应用到其他从节点的过程. 首先要理解两个概念:1.复制:提供冗余和高可用性:2. ...

  9. 使用Port Forwarding连接k8s集群的pod(redis、mysql等)

    一. 创建Redis的deployment和service 1. 创建Redis deployment redis-master-deployment.yaml  apiVersion: apps/v ...

  10. 快速改变文件hash值的方法

    查看哈希值命令 Linux : md5sum + 文件名 $ md5sum .png fe5c3f5ef1d207bc1b646911b463c907 .png Windows : certutil ...