NestJS实现发送邮箱验证码
开发背景
书接上回,在开发个人博客
的注册功能时,需要实现获取邮箱验证码
,上篇文章已经讲过前端怎么实现了,这里就来讲一讲后端怎么实现。
需求梳理
- 封装一个
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",
}
}
来简单说一下这些配置:
alias
:邮箱别名,比如你用xiaowang@test.com
这个邮箱给别人发送验证码,但你不想让别人直接看到你的邮箱,可以使用这个alias
给个别名xiaowang
,此时对方看到的就是xiaowang
给自己发了个邮件。host
:邮件服务器地址,这个取决于你自己的邮箱,我这里使用的是163邮箱
,所以这里的服务器地址就是163邮箱
的地址。至于这个地址从哪来,可以登录上你的邮箱,进行查看。
port
:邮件服务器端口,这个端口默认都是465
,如果你的邮件服务器是你自己的,那你可能修改过,这里如实填写即可。secure
:是否使用默认端口,如果port
你使用的是465
,这里就是true
,否则就是false
。user
:你用来给用户发送邮件的邮箱号。pass
:你的授权码,注意,授权码
不等同于密码,是需要自己申请的。
安装依赖
这里我使用的是 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,
},
});
}
参考官方示例
也就是说,每次通过 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);
}
});
}
}
简单说一下这个方法做了什么事:
- 这个方法接收三个参数,
email
为发给对方的邮箱号,subject
为标题,html
为要发送的html内容 - 通过生成一个
随机数
截取后六位作为验证码 - 构造一个
options
,为发送邮件的参数 - 通过
transporter
的sendMail
方法来发送邮件。
到此为止,封装的Email类
就先告一段落了。
使用方法
现在我们有一个获取邮箱验证码的接口(具体接口暂时就先不写了,后面单独一篇文章介绍),在这个接口内我们通过实例化 Email
,并调用它的send
方法即可发送验证码。
await new Email().send({
email: request.email,
subject: "WEBXUE - 欢迎注册"
});
结语
本来以为一篇文章就可以把Email类
的封装、Redis类
的封装、验证码的读写
都全部整完,没想到仅仅发送验证码都写了这么多,剩下的就留给下一篇文章吧。我是一名不太称职的前端程序员,如果发现哪里有什么问题,或者更好的建议,欢迎评论区告诉我,一起学习,一起进步吧!
在下一篇文章,我将介绍NestJS中Redis的封装与读写。
转载自:https://juejin.cn/post/7220725356457164859