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:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM