在Node.js(express 框架)中使用 nodemailer 实现邮箱注册功能

文章目录

      • 一、准备工作
        • 1、安装 nodemailer
        • 2、打开 QQ(此处使用QQ邮箱) 的 IMAP/SMTP服务
      • 二、功能实现
        • 1、发送邮件功能封装
        • 2、生成随机验证码
        • 3、发送邮箱验证码
        • 4、注册功能
      • 三、邮件接收消息展示
      • 四、参考资料

一、准备工作

1、安装 nodemailer

yarn add nodemailer

2、打开 QQ(此处使用QQ邮箱) 的 IMAP/SMTP服务

打开用来发送邮箱的QQ的 IMAP/SMTP服务,并获取授权码

开启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 邮箱:

163 邮箱

QQ 邮箱:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/669522.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Verilog中求两个数的差值

根据输入信号a,b的大小关系&#xff0c;求解两个数的差值&#xff1a;输入信号a,b为8bit位宽的无符号数。如果a>b&#xff0c;则输出a-b&#xff0c;如果a≤b&#xff0c;则输出b-a。 接口信号图如下&#xff1a; 代码如下&#xff1a; &#xff08;CSDN代码块不支持Veril…

QT程序简单国际化实验

文章目录 第一步&#xff1a;新建一个QT工程第二步&#xff1a;添加控件第三步&#xff1a;在pro文件中添加内容第四步&#xff1a;更新文件第五步&#xff1a;打开QT的Linguist第六步&#xff1a;添加翻译内容第七步&#xff1a;回到QT Creator中添加文件第八步&#xff1a;给…

论文精读-存内计算芯片研究进展及应用

文章目录 论文精读-存内计算芯片研究进展及应用概述背景介绍前人工作 存内计算3.1 SRAM存内计算3.2 DRAM存内计算3.3 ReRAM/PCM存内计算3.4 MRAM存内计算3.5 NOR Flash存内计算3.6 基于其他介质的存内计算3.7 存内计算芯片应用场景 总结QA 论文精读-存内计算芯片研究进展及应用…

临时邮箱API发送邮件的安全性?如何保障?

临时邮箱API发送邮件的步骤有哪些&#xff1f;设置邮箱API方法&#xff1f; 电子邮件作为一种重要的通信方式&#xff0c;而临时邮箱API作为一种新兴的邮件发送技术&#xff0c;其安全性更是成为大家关注的焦点。那么&#xff0c;临时邮箱API发送邮件的安全性究竟如何呢&#…

毕业单纯的钻研嵌入式知识有前景吗?

毕业之后单纯地去钻研嵌入式知识到底有没有前景呢&#xff1f;不可否认的是&#xff0c;嵌入式领域有着较高的薪资待遇&#xff0c;并且还存在着巨大的上升空间。然而&#xff0c;要学习嵌入式开发并非易事&#xff0c;其中存在着诸多挑战。其中一个挑战就是需要深入理解计算机…

Django 中链接静态文件目录

将静态文件存放在单独的目录中&#xff0c;使得 Django 可以有效地提供这些静态资源&#xff0c;如图片、CSS 文件、JavaScript 文件等&#xff0c;给用户的浏览器。在部署项目时&#xff0c;可以通过收集静态文件到一个单独的目录&#xff0c;然后将该目录服务于静态文件的 We…

IP地址类型

这些IP地址中有IPv4和IPv6地址,以及一些是链路本地地址(通常用于本地网络中的通信),而另一些则是可以被路由的公共或私有IP地址。 这里是您提供的IP地址的一些简要说明: IPv6 链路本地地址:以fe80:开头的地址是IPv6链路本地地址。这些地址仅用于同一链路(如以太网段或无…

外贸工厂玩转TikTok高效获客,多种引流方式/账号定位/爆款打造/全方位讲解

课程亮点 讲解工厂爆款账号打造技巧&#xff0c;每月实现近1000的询盘 掌握多种引流方式&#xff0c;实现快速搭建流量池 全方位讲解如何抢占行业标签&#xff0c;抢占TikTok流量红利 讲解打造短视频爆款技巧&#xff0c;高效获客 课程大纲 导言:课程介绍 传统外贸获客渠…

java基础之Netty(主要用来开发像微信,qq等聊天软件)

一、Netty的定义 Netty是一个基于Java NIO的网络编程框架&#xff0c;提供了一套高效的、事件驱动的异步网络通信机制。简化了网络应用程序的开发过程&#xff0c;提供了可靠的、高性能的网络传输 二、Netty的特点是什么 异步和事件驱动&#xff1a;Netty使用异步的、非阻塞…

Redis 实战之客户端属性

客户端属性 套接字描述符名字标志输入缓冲区命令与命令参数命令的实现函数输出缓冲区身份验证时间总结 客户端状态包含的属性可以分为两类&#xff1a; 一类是比较通用的属性&#xff0c; 这些属性很少与特定功能相关&#xff0c; 无论客户端执行的是什么工作&#xff0c; 它们…

PSFR-GAN复现

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言快速开始安装依赖权重下载及复原 训练网络数据集训练脚本 代码详解训练BaseOptio…

Windows平台通过MobaXterm远程登录安装在VMware上的Linux系统(CentOS)

MobaXterm是一个功能强大的远程计算工具&#xff0c;它提供了一个综合的远程终端和图形化的X11服务器。MobaXterm旨在简化远程计算任务&#xff0c;提供了许多有用的功能&#xff0c;使远程访问和管理远程服务器变得更加方便&#xff0c;它提供了一个强大的终端模拟器&#xff…