nodeJs 实现邮箱验证码注册

nodeJs 实现邮箱验证码注册

功能设计

参考内容
1. 逻辑

用户输入邮箱,获取验证码

  • 验证该邮件是否已经注册过
  • 验证该邮件是否已经发送验证码,验证码是否过期。过期则重新生成验证码数据库更新验证码。否则生成验证码存入数据库
  • 基于nodemailer发送验证码
  • 注册成功,新用户信息插入用户表,删除emal表该用户验证码信息
2.数据表
User表

用户表

idemailpassword
11@qq.com密码
Email

生成验证码后,需要将验证码和邮箱存在email表,用户在注册提交时用来验证验证码是否正确是否过期。

用户注册成功后,删除该条记录。

idemailemail_code
11@qq.com验证码
3. 邮箱开启SMTP服务(QQ邮箱)

image

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) { // 当前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;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值