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:

koa2--nodemailer实现邮箱验证的更多相关文章
- (进阶篇)PHP实现用户注册后邮箱验证,激活帐号
我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...
- PHP用户注册邮箱验证激活帐号
我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...
- android 自定义view -- 实现自定义 邮箱验证的Edittext
//onFinishInflate 当View中所有的子控件均被映射成xml后触发 /** * 实现自定义 实现邮箱验证的EidtText */public class CustomEditText ...
- [麦先生]在Laravel框架里实现邮箱验证---发送邮件
在经过一段时间的使用后,发现在项目中很多地方需要用到用户验证,以短信验证和邮箱验证为主流趋势,小麦总结了如果在Laravel框架中实现发送邮件功能,以后会陆续更上如何实现短信验证..... 在.env ...
- javamail实现邮箱验证功能
javamail是基于SMTP协议和POP3协议的邮件发送与接收系统,在用户注册与登陆的过程中,常需要用到邮箱验证功能,下面是基于javamail的一个简单实现 用户注册后通过servlet得到邮箱地 ...
- PHP邮箱验证是否有效
今天一开电脑发现有人在我的主页给我乱留言,所以加了一个邮箱验证. 网上发现一个很巧妙的算法,分享一下: function checkmail($email){ $exp = "^[a-z'0 ...
- discuz3.2x增加邮箱验证功能
为防止垃圾用户多次注册,为disczu增加邮箱验证功能. 大致分为二步: 1.申请邮箱,这里推荐使用腾讯免费企业邮箱:https://exmail.qq.com/portal/introducefre ...
- .net 实现注册邮箱验证激活
没事上网当了个注册邮箱验证激活的代码,用起来感觉还不错,特意和大家要一起分享一下 下面是主要实现代码: uing System.Net.Mail; public partial class jquer ...
- JS非空验证及邮箱验证
非空验证 <body> <table> <tr> <td>姓名:</td> <td><input type="t ...
- DEDECMS开启邮箱验证通知的解决方法
[摘要]织梦CMS是开源内容管理系统,是国内开源CMS的领先品牌,目前程序安装量已达七十万,本文介绍DEDECMS会员注册时,开启邮箱验证通知的解决方法. 在论坛上看到很多人都说这个功能没用,邮箱根本 ...
随机推荐
- Spring Boot使用Html
1.引入模板thymeleaf <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- Visionworks OpenVX
[TOC] Visionworks OpenVX OpenVX heterogeneous computation framework Spec OpenVX 1.2源碼解析 - 目錄結構 除了官方的 ...
- docker部署spring boot项目在服务器上
IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...
- Q-Dir – 布局灵活的文件管理,强烈推荐
Q-dir 是轻量的文件管理器,特点鲜明,各种布局视图切换灵活,默认四个小窗口组成一个大窗口,操作快捷.软件虽小,却非常好用 下载地址: https://www.softwareok.com/?Dow ...
- Java读取CSV数据并写入txt文件
读取CSV数据并写入txt文件 package com.vfsd; import java.io.BufferedWriter; import java.io.File; import java.io ...
- 【GMT43智能液晶模块】例程二十二:USB_CDC实验——高速数据传输
源代码下载链接: 链接:https://pan.baidu.com/s/10KOWONWbNYlonyuX0W0Mcg 提取码:ggpo 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43 ...
- 123456123456----updateV#%#6%#%---pinLv###1%%%----com.zzj.CarCleanGame567---前show后广--儿童洗车-222222
com.zzj.CarCleanGame567---前拼show后广--儿童洗车-
- C++内存管理5-处理new分配内存失败情况(转)
C++内存管理5-处理new分配内存失败情况(转) endl; 参考博客: https://www.cnblogs.com/findumars/p/9905195.html
- Flask 学习(一)简单介绍
Flask介绍(轻量级的框架) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收ht ...
- Leetcode problems classified by company 题目按公司分类(Last updated: October 2, 2017)
All LeetCode Questions List 题目汇总 Sorted by frequency of problems that appear in real interviews. Las ...