文章目录
- 一、准备工作
- 1、安装 nodemailer
- 2、打开 QQ(此处使用QQ邮箱) 的 IMAP/SMTP服务
- 二、功能实现
- 1、发送邮件功能封装
- 2、生成随机验证码
- 3、发送邮箱验证码
- 4、注册功能
- 三、邮件接收消息展示
- 四、参考资料
一、准备工作
1、安装 nodemailer
yarn add nodemailer
2、打开 QQ(此处使用QQ邮箱) 的 IMAP/SMTP服务
打开用来发送邮箱的QQ的 IMAP/SMTP服务,并获取授权码
需要使用自己的QQ来向注册的用户发送邮件,所以此处需要开启相关服务。此处获取的授权码后续将用于验证。
二、功能实现
1、发送邮件功能封装
可以新建一个 mailQQ.js
文件,封装发送邮件相关功能,便于后续使用。
(1) 设置邮箱配置
// mailQQ.js
const nodemailer = require('nodemailer');// 设置邮箱配置
const transporter = nodemailer.createTransport({// 不知为何出错// host: "smtp.qq.email",service: "qq",// use SSL// secureConnection: true, port: 465,secure: true,auth: {// 用来发送邮件的邮箱账户user: "123456789@qq.com",// QQ开启 IMAP/SMTP服务后获取的授权码pass: "xxx",},
});
期间使用
host: "smtp.qq.email"
的写法时功能无法正常使用,而后在网上查找到相关的资料后,使用service: "qq"
解决了该问题。
参考链接:
- https://blog.csdn.net/qq_43238599/article/details/95325596
- https://www.coder.work/article/1377910
(2) 实现发送邮件功能
// mailQQ.js
function sendMailToMailId(mailId, verifyCode) {// 设置收件人信息let mailOptions = {// 填写发件人 QQfrom: '"发件人名称" <123456789@qq.com>',// 发送至目标邮箱to: mailId,// 主题subject: "邮箱验证",// 文本内容text: `您正在使用该 ${mailId} 邮箱进行注册,验证码为:${verifyCode}`,// html 模板// html: '',// 附件// attachments:[{filename: '',path: ''}]}return new Promise((resolve, reject) => {// 发送邮件transporter.sendMail(mailOptions, (error, info) => {if (error) {reject(error)}else {resolve(info)console.log(info);}})})
}module.exports = {sendMailToMailId
}
sendMailToMailId
方法接收两个参数,mailId
参数为收件人邮箱,verifyCode
参数为随机生成的验证码。
2、生成随机验证码
创建一个 randomCode.js
文件,用于生成随机验证码。
// randomCode.js
// 通过 codeLength 可指定生成的验证码长度
function randomCode(codeLength) {const characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';let result = '';for(let i = 0; i < codeLength; i++) {const randomIndex = Math.floor(Math.random() * characters.length);result += characters[randomIndex];}return result;
}module.exports = {randomCode
}
3、发送邮箱验证码
此处使用 Node.js(express 框架) ,数据库使用(Mongodb) 实现相关功能。
var express = require('express');
var router = express.Router();
// 此处省略 mongodb 连接相关代码
const mongoDB = require('../db/conMongoDB');
const mailQQ = require('../utils/mailQQ');
const randomVerifyCode = require('../utils/randomVerifyCode');// 邮箱验证信息
let mailVerifyCode = {};// 发送邮箱验证码
router.post('/mailVerifyCode', async function (req, res, next) {// 生成 6 位随机验证码const verifyCode = randomVerifyCode.randomCode(6);// 发送邮箱mailQQ.sendMailToMailId(req.body.email, verifyCode).then(() => {// 保存验证码信息,用于后续验证mailVerifyCode[req.body.email] = verifyCode;res.send({ success: true, code: 0, msg: "验证码已发送" });}).catch((err) => {console.log(err);res.send({ success: false, code: 1, msg: "验证码发送失败" });});
})
mailVerifyCode
用于记录收件人邮箱及验证码信息。
{'123456789@qq.com' : '验证码'}
4、注册功能
// 注册
router.post('/register', async function (req, res, next) {// 验证验证码与邮箱是否匹配if (!mailVerifyCode[req.body.email] || req.body.verifyCode != mailVerifyCode[req.body.email]) {res.send({ success: false, code: 1, msg: "注册失败,验证码错误" });} else {const usersTable = mongoDB.collection('users');// 判断数据库中是否已存在该用户名const findResult = await usersTable.findOne({ "email": req.body.email });if (!findResult) {// 插入数据const insertResult = await usersTable.insertOne({"email": req.body.email,"password": req.body.password,"username": req.body.email,"headImg": "",});if (insertResult) {res.send({ success: true, code: 0, msg: "注册成功", data: "" });}} else {res.send({ success: false, code: 1, msg: "注册失败,用户名已存在", data: "" });}}
})
三、邮件接收消息展示
经测试,收件人邮箱可以是 163
邮箱或 QQ
邮箱。
163
邮箱:
QQ
邮箱:
四、参考资料
- https://www.npmjs.com/package/nodemailer
- https://blog.csdn.net/Lu_xiuyuan/article/details/115188745
- https://blog.csdn.net/qq_30306717/article/details/121714585