美文网首页
nodeJs 实现邮箱验证码注册

nodeJs 实现邮箱验证码注册

作者: 阿尔法_狗 | 来源:发表于2020-11-02 17:36 被阅读0次

    nodeJs 实现邮箱验证码注册

    功能设计

    参考内容

    1. 逻辑

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

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

    2.数据表

    User表

    用户表

    id email password
    1 1@qq.com 密码
    Email

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

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

    id email email_code
    1 1@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;
    
    

    相关文章

      网友评论

          本文标题:nodeJs 实现邮箱验证码注册

          本文链接:https://www.haomeiwen.com/subject/bpspmktx.html