nodeJs 实现邮箱验证码注册
功能设计
参考内容
1. 逻辑
用户输入邮箱,获取验证码
- 验证该邮件是否已经注册过
- 验证该邮件是否已经发送验证码,验证码是否过期。过期则重新生成验证码数据库更新验证码。否则生成验证码存入数据库
- 基于
nodemailer
发送验证码 - 注册成功,新用户信息插入用户表,删除emal表该用户验证码信息
2.数据表
User表
用户表
id | password | |
---|---|---|
1 | 1@qq.com | 密码 |
生成验证码后,需要将验证码和邮箱存在email表,用户在注册提交时用来验证验证码是否正确是否过期。
用户注册成功后,删除该条记录。
id | email_code | |
---|---|---|
1 | 1@qq.com | 验证码 |
3. 邮箱开启SMTP服务(QQ邮箱)
image4.代码参考
const NodeEmail = require('nodemailer');
const { emailConfig } = require('../../config/base');
const EmailModel = require('../model/Email');
const UserModel = require('../model/User');
const { EmailExistHttpException } = require('../lib/HttpException')
const transporter = NodeEmail.createTransport({
service: 'qq',
port: 465,
secureConnection: true,
auth: emailConfig.auth // => { user: 你的邮箱, pass: 你的邮箱密码,开启POP3/SMTP的密码,如上图 }
});
class Email {
static async getEmailCode(email) {
const user = await UserModel.findUser(email);
if (user) throw new EmailExistHttpException();
const db = await EmailModel.findEmail(email);
// 生成验证码
let code = Math.random().toString().slice(-6);
if (!db) { // 当前email不存在,既没有给该email发送过验证码
await EmailModel.inster(email, code);
} else { // 当前email,已经发送了验证码
const startTime = new Date(db.createdAt).getTime();
const intervalTime = 1000 * 60 * 60; // 过期时间
if (new Date().getTime() - startTime > intervalTime ){
await EmailModel.updateCode(email, code);
}else{
code = db.email_code;
}
}
const subject = "账号注册";
const text = "text";
const html = `<div><span>验证码:</span><b>${code}</b></div>`;
await Email.SendEmail(email, subject, text, html);
return { message: '邮件已发送' };
}
static async SendEmail(email, subject, text, html) {
return await transporter.sendMail({
from: emailConfig.auth.user, // 发送者邮箱地址
to: email, // 接收这邮箱地址
subject, // 邮件主题
html, // html模板
text // 文本内容
})
}
}
module.exports = Email;
网友评论