likes
comments
collection
share

NestJS实现发送邮箱验证码

作者站长头像
站长
· 阅读数 50

开发背景

书接上回,在开发个人博客的注册功能时,需要实现获取邮箱验证码上篇文章已经讲过前端怎么实现了,这里就来讲一讲后端怎么实现。

需求梳理

  • 封装一个Email类来发送邮箱验证码(本篇实现)
  • 封装一个Redis类来读写验证码
  • 注册service中验证

封装Email类

配置文件

相信大家在写 nestjs 服务时一定会有一个配置文件吧,假设我们这里的配置文件叫 config.ts,那么我们需要在配置文件中配置上发送邮件的参数。

export default {
  // ...
  EMAIL:{
    // 别名,自己定义
    alias: "WEBXUE",
    // 邮件服务器地址
    host: "smtp.163.com",
    // 邮件服务器端口
    port: 465,
    // 是否使用默认465端口
    secure: true,
    // 你的邮箱
    user: "xxx@163.com",
    // 你的授权码
    pass: "XXXXXXXX",
  }
}

来简单说一下这些配置:

  1. alias:邮箱别名,比如你用xiaowang@test.com这个邮箱给别人发送验证码,但你不想让别人直接看到你的邮箱,可以使用这个alias给个别名xiaowang,此时对方看到的就是xiaowang给自己发了个邮件。
  2. host:邮件服务器地址,这个取决于你自己的邮箱,我这里使用的是163邮箱,所以这里的服务器地址就是163邮箱的地址。至于这个地址从哪来,可以登录上你的邮箱,进行查看。

NestJS实现发送邮箱验证码

  1. port:邮件服务器端口,这个端口默认都是465,如果你的邮件服务器是你自己的,那你可能修改过,这里如实填写即可。
  2. secure:是否使用默认端口,如果port你使用的是465,这里就是true,否则就是false
  3. user:你用来给用户发送邮件的邮箱号。
  4. pass:你的授权码,注意,授权码不等同于密码,是需要自己申请的。

NestJS实现发送邮箱验证码

安装依赖

这里我使用的是 nodemailer来发送邮件,除了它之外,还需要安装nestjs对应的模块@nestjs-modules/mailer

npm i nodemailer @nestjs-modules/mailer

封装类

src目录下新建一个tools目录,在该目录下定义一个EmailTool.ts文件。

首先需要引入对应的插件和配置文件。

import * as nodemail from "nodemailer";
import { EMAIL } from "src/config";

接下来把一个的骨架实现。

export class Email {
  constructor(){}
}

需要在这个中定义一个私有属性transporter,是一个服务。

export class Email {
  private transporter = null;
  
  constructor(){}
}

然后在constructor中创建这个服务。

constructor(){
  // 通过nodemail的createTransport方法创建这个服务,将config中的参数依次传入
  this.transporter = nodemail.createTransport({
    host: EMAIL.host,
    port: EMAIL.port,
    secure: EMAIL.secure,
    auth: {
      user: EMAIL.user,
      pass: EMAIL.pass,
    },
  });
}

参考官方示例

NestJS实现发送邮箱验证码

也就是说,每次通过 new 这个类就会自动创建一个服务。

接下来在这个类下面封装一个发送验证码的方法send

export class Email {
  // ...
  constructor(){
    // ...
  }
  // 发送验证码的方法
  send({ email, subject = "WEBXUE", html }) {
    const code = Math.random().toString().slice(-6);
    const options = {
      from: `${EMAIL.alias}<${EMAIL.user}>`,
      to: email,
      subject,
      text: `验证码为${code}`,
      html,
    };
    this.transporter.sendMail(options, (error, info) => {
      if (error) {
        console.log("邮件发送失败");
        console.log(error);
      } else {
        console.log("邮件发送成功");
        console.log(info);
      }
    });
  }
}

简单说一下这个方法做了什么事:

  1. 这个方法接收三个参数,email为发给对方的邮箱号,subject为标题,html为要发送的html内容
  2. 通过生成一个随机数截取后六位作为验证码
  3. 构造一个options,为发送邮件的参数
  4. 通过transportersendMail方法来发送邮件。

到此为止,封装的Email类就先告一段落了。

使用方法

现在我们有一个获取邮箱验证码的接口(具体接口暂时就先不写了,后面单独一篇文章介绍),在这个接口内我们通过实例化 Email,并调用它的send方法即可发送验证码。

await new Email().send({
  email: request.email,
  subject: "WEBXUE - 欢迎注册"
});

结语

本来以为一篇文章就可以把Email类的封装、Redis类的封装、验证码的读写都全部整完,没想到仅仅发送验证码都写了这么多,剩下的就留给下一篇文章吧。我是一名不太称职的前端程序员,如果发现哪里有什么问题,或者更好的建议,欢迎评论区告诉我,一起学习,一起进步吧!

在下一篇文章,我将介绍NestJS中Redis的封装与读写。

转载自:https://juejin.cn/post/7220725356457164859
评论
请登录