nodeJs 實現(xiàn)郵箱驗證碼注冊
功能設(shè)計
參考內(nèi)容
1. 邏輯
用戶輸入郵箱承绸,獲取驗證碼
- 驗證該郵件是否已經(jīng)注冊過
- 驗證該郵件是否已經(jīng)發(fā)送驗證碼,驗證碼是否過期链烈。過期則重新生成驗證碼數(shù)據(jù)庫更新驗證碼驰后。否則生成驗證碼存入數(shù)據(jù)庫
- 基于
nodemailer
發(fā)送驗證碼 - 注冊成功,新用戶信息插入用戶表,刪除emal表該用戶驗證碼信息
2.數(shù)據(jù)表
User表
用戶表
id | password | |
---|---|---|
1 | 1@qq.com | 密碼 |
生成驗證碼后爷光,需要將驗證碼和郵箱存在email表,用戶在注冊提交時用來驗證驗證碼是否正確是否過期梦湘。
用戶注冊成功后瞎颗,刪除該條記錄。
id | email_code | |
---|---|---|
1 | 1@qq.com | 驗證碼 |
3. 郵箱開啟SMTP服務(wù)(QQ郵箱)
4.代碼參考
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) { // 當(dāng)前email不存在,既沒有給該email發(fā)送過驗證碼
await EmailModel.inster(email, code);
} else { // 當(dāng)前email瓣颅,已經(jīng)發(fā)送了驗證碼
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: '郵件已發(fā)送' };
}
static async SendEmail(email, subject, text, html) {
return await transporter.sendMail({
from: emailConfig.auth.user, // 發(fā)送者郵箱地址
to: email, // 接收這郵箱地址
subject, // 郵件主題
html, // html模板
text // 文本內(nèi)容
})
}
}
module.exports = Email;