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会员注册时,开启邮箱验证通知的解决方法. 在论坛上看到很多人都说这个功能没用,邮箱根本 ...
随机推荐
- Self-Supervised Representation Learning
Self-Supervised Representation Learning 2019-11-11 21:12:14 This blog is copied from: https://lilia ...
- linux 实时监控网速脚本(转)
#!/bin/bash ethn=$ while true do RX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{pri ...
- 【推荐】安卓模板项目AndroidProject
[推荐]安卓模板项目AndroidProject https://github.com/getActivity/AndroidProject 安卓架构 博客地址:但愿人长久,搬砖不再有 当我们日复一日 ...
- 【C++】C++中的容器解析
目录结构: contents structure [-] 顺序容器 顺序容器的种类 顺序容器的操作 容器操作可能使迭代器失效 Vector容器的增长机制 容器适配器 关联容器 关联容器的分类 关联容器 ...
- 使用JSP的fmt标签实现国际化支持 - smart-framework ; smart-plugin-i18n
使用JSP的fmt标签实现国际化支持 Smart-framework框架使用smart-plugin-i18n插件来完成国际化处理,原理相同,使用过滤器进行参数设置. ============== ...
- 百度网盘快速下载工具下载:Pandownload下载
众所周知的百度网盘下载限速很厉害,所以就有了快速下载工具出现了.一般情况下,按照家里网速有多快,使用工具下载就有多快. 可以直接复制如下图进行下载: 另外,PanDownload[百度网盘下载工具]无 ...
- 工控随笔_24_关于西门子Step7的Simatic manager打开报3280:503错误。
微软推出Win10系统后,很多工控软件也被迫跟着升级,但是因为Win10系统的不稳定性,导致很多时候,安装的软件莫名其妙的 不能用. 相对Win7和WinXP来说,Win10在兼容性和稳定性都差很多. ...
- Swift编码总结10
1.打开App显示文件已损坏,打不开,您应该将它移到废纸篓,怎么办? 终端输入执行:sudo spctl --master-disable 2.Mac的Siri打开网页控制台,进入开发中模式:不过我觉 ...
- xunit 单元测试
代码:GitHub 参考地址:https://github.com/Acumatica/xunit.autofac xunit +autofac进行单元测试 ①创建一个类库 引用nuget: xuni ...
- LeetCode176——第二高的薪水
题目描述 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 ...