依赖包安装:

  1. /**
  2. * koa-bodyparser用于把formData数据解析到ctx.request.body
  3. * 通过ctx.request.body访问请求的参数
  4. * koa-redis用于保存状态
  5. */
  6. 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:

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. Self-Supervised Representation Learning

    Self-Supervised Representation Learning 2019-11-11 21:12:14  This blog is copied from: https://lilia ...

  2. linux 实时监控网速脚本(转)

    #!/bin/bash ethn=$ while true do RX_pre=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{pri ...

  3. 【推荐】安卓模板项目AndroidProject

    [推荐]安卓模板项目AndroidProject https://github.com/getActivity/AndroidProject 安卓架构 博客地址:但愿人长久,搬砖不再有 当我们日复一日 ...

  4. 【C++】C++中的容器解析

    目录结构: contents structure [-] 顺序容器 顺序容器的种类 顺序容器的操作 容器操作可能使迭代器失效 Vector容器的增长机制 容器适配器 关联容器 关联容器的分类 关联容器 ...

  5. 使用JSP的fmt标签实现国际化支持 - smart-framework ; smart-plugin-i18n

    使用JSP的fmt标签实现国际化支持   Smart-framework框架使用smart-plugin-i18n插件来完成国际化处理,原理相同,使用过滤器进行参数设置. ============== ...

  6. 百度网盘快速下载工具下载:Pandownload下载

    众所周知的百度网盘下载限速很厉害,所以就有了快速下载工具出现了.一般情况下,按照家里网速有多快,使用工具下载就有多快. 可以直接复制如下图进行下载: 另外,PanDownload[百度网盘下载工具]无 ...

  7. 工控随笔_24_关于西门子Step7的Simatic manager打开报3280:503错误。

    微软推出Win10系统后,很多工控软件也被迫跟着升级,但是因为Win10系统的不稳定性,导致很多时候,安装的软件莫名其妙的 不能用. 相对Win7和WinXP来说,Win10在兼容性和稳定性都差很多. ...

  8. Swift编码总结10

    1.打开App显示文件已损坏,打不开,您应该将它移到废纸篓,怎么办? 终端输入执行:sudo spctl --master-disable 2.Mac的Siri打开网页控制台,进入开发中模式:不过我觉 ...

  9. xunit 单元测试

    代码:GitHub 参考地址:https://github.com/Acumatica/xunit.autofac xunit +autofac进行单元测试 ①创建一个类库 引用nuget: xuni ...

  10. LeetCode176——第二高的薪水

    题目描述 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1 ...