依赖包安装:
/**
* 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: