邮箱发送验证码(nodemailer)

news2025/2/1 6:46:32

邮箱发送验证码(nodemailer)

  • 前言:
  • 后端实现
    • 1、前期准备
    • 2、安装nodemailer
    • 3、代码实现
    • 4、效果图

前言:

  想要实现向邮箱发送验证码功能,先来简单地梳理一下思路:

  • 前端用正则表达式简单验证下邮箱格式的正确性
  • 向后端发送请求,后端随机生成验证码,并根据前端传递的邮箱发送验证码

  当然实际开发中当然没有那么简单,根据实际状况书写。
  本文主要讲述后端实现步骤,前端挺容易的,自己研究一下吧。

后端实现

1、前期准备

  以163邮箱为例(若没有邮箱,先注册一个新邮箱),先登录,然后点击设置,选择POP3/SMTP/IMAP

在这里插入图片描述

  再开启服务

在这里插入图片描述

2、安装nodemailer

npm i nodemailer

  官方地址:https://nodemailer.com

3、代码实现

  新建 utils 文件夹,该文件夹下新建mailer.js

const express = require('express');
//创建路由对象
const router = express.Router();

// 导入邮件路由处理函数对应的模块
const mail_handler = require("./mailHandler.js");

//挂载具体的路由
router.get('/mailer/sendmail', mail_handler)

  同级目录下新建mailHandler.js,该文件用于存放实现发送验证码的函数

// 引入数据库
const db = require("../db/index");
// 引入bryptjs对验证码进行加密
const bcrypt = require("bcryptjs");

// 邮件发送插件
let nodemailer = require("nodemailer");

// 发送验证码函数
export.sendEmail = (req, res) => {
  // 创建一个SMTP客户端对象
  let transporter = nodemailer.createTransport({
    host: 'smtp.163.com',
    service: "163", //邮箱类型
    secure: true, //是否使用安全连接,对https协议的
    port: 465, //默认端口
    auth: {
      user: "xxx@163.com", //开启SMTP的邮箱,发件人
      pass: "授权码在163邮箱中可以生成", // 163授权码
    },
  });
  //产生随机6位验证码
  let verify = Math.random().toFixed(6).slice(-6)
  
  // 邮件内容
  let options = {
    from: "xxx@qq.com", //发送方
    to: req.body.user_email, //接收方
    subject: "激活验证码", //邮件主题
    // 还可以是html格式,需要text改成html
    text: "你的验证码为" + code, //邮件正文
  }
  // 发送邮件
  transporter.sendMail(options, (err, info) => {
    if (err) {
      res.send(err);
    } else {
      // 加密验证码
      code = bcrypt.hashSync(code, 10);
      // 将验证码存放到数据库中
      // 有技术的话存放到Redis缓存中去,经常查阅数据库可能会导致服务器超负荷
      const sendCodeSql = "update users set user_code=? where user_email=?";
      db.query(sendCodeSql, [code, req.body.user_email], (err, results) => {
        console.log('-----------------------------------',results)
        if (err) return res.cc(err);
        if (results.affectedRows !== 1) return res.cc("添置验证码失败!");
        res.send({
          status: 200,
          message: "添置验证码成功!",
          data: { info, code },
        });
      });
    }
  });
}

  为什么要切割成那么多文件呢?随着技术的不断提升,我们要逐渐形成模块化的思想。


  在app.js导入并注册路由模块

const express = require('express');
const app = express();
 
//导入路由模块
const router = require('./route.js')
//注册路由模块
app.use(router);
 
app.listen(8080, () => {
    console.log('hello server');
}

4、效果图

在这里插入图片描述

  希望对你有帮助哟

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+vue+java付费自习室选座系统nl1u1

本系统从用户的角度出发,结合当前的环境而开发的,在开发语言上是使用的Java语言,在框架上我们是使用的springboot框架,数据库方面使用的是MySQL数据库,开发工具为IDEA。 付费自习室管理系统根据实际情况分为前后台两部…

ROS键盘遥控机器人,通过参数服务器指定速度

1、引言 在上节的驱动机器人,我们知道是cmd_vel话题发布一串Twist类型消息来控制,我们可以输入如下命令查看这个Twist的详细信息:rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geome…

Linux 编写一个 简单进度条

进度条 回车换行理解: 我们要理解,回车换行是两个概念: 换行是把光标移到下一行,是竖直的往下平移;" \n "回车是把光标移到当前行的最开始; " \r " 就和一起打字…

[计算机提升] Windows系统权限

1.2 Windows系统权限 在Windows操作系统中,权限是指授予用户或用户组对系统资源进行操作的权利。权限控制是操作系统中重要的安全机制,通过权限控制可以限制用户对系统资源的访问和操作,从而保护系统安全。 Windows操作系统中包含以下几种权…

FPGA设计时序约束五、设置时钟不分析路径

一、背景 在进行时序分析时,工具默认对所有的时序路径进行分析,在实际的设计中,存在一些路径不属于逻辑功能的,或者不需要进行时序分析的路径,使用set_false_path对该路径进行约束,时序分析时工具将会直接忽…

通过onnxruntime进行模型部署过程中的问题

1.onnxruntime包 从https://github.com/microsoft/onnxruntime/releases/下载解压到D:/code/package/onnruntime 2opencv_c下载https://github.com/opencv/opencv/releases/tag/4.8.1 3.测试opencv代码:总结:添加include目录,添加lib库目录…

网工配置命令总结(1)---Web访问及vlan配置

目录 1.Telnet远程登录设备 2.用户通过Web网管登录设备 3.端口隔离功能的实现 4.配置vlan聚合 5.部分vlan间互通&#xff0c;部分vlan间隔离&#xff0c;vlan内用户隔离 6.限制内网网段互访 1.Telnet远程登录设备 1.使能服务器功能 <HUAWEI> system-view [HUAWEI] …

Eslint配置 Must use import to load ES Module(已解决)

最近在配置前端项目时&#xff0c;eslint经常会碰到各种报错&#xff08;灰常头疼~&#xff09; Syntax Error Error No ESLint configuration found.Syntax Error: Error: D:\dmq\dmq-ui.eslintrc.js: Environment key “es2021” is unknown at Array.forEach ()error in ./…

GO 语言处理并发的时候我们是选择sync还是channel

以前写 C 的时候&#xff0c;我们一般是都通过共享内存来通信&#xff0c;对于并发去操作某一块数据时&#xff0c;为了保证数据安全&#xff0c;控制线程间同步&#xff0c;我们们会去使用互斥锁&#xff0c;加锁解锁来进行处理 然而 GO 语言中建议的时候通过通信来共享内存&…

看图学习数据中心机柜导轨方面的英文术语

对于一些数据中心的服务器&#xff0c;存储&#xff0c;交换机等设备的上架安装&#xff0c;有些导轨设计还是有点复杂的&#xff0c;如果安装手册还是英文的&#xff0c;就更有些挑战了。本文用一个实际的导轨图片来对其中常用的一些英文术语做了一个详细解释&#xff0c;供朋…

面试官:Go GMP 模型为什么 P 组件如此重要 ?

大家好&#xff0c;我是木川 Go GMP模型 是 Go语言并发性能的关键组成部分&#xff0c;它允许轻松创建大量的 Goroutines&#xff0c;设计思想包括并行性、线程复用以及抢占调度。 Go 1.1 版本前采用的是 GM 模型&#xff0c;存在一些问题&#xff0c;后面增加了 P 组件&#x…

哪种烧录单片机的方法合适?

哪种烧录单片机的方法合适&#xff1f; 首先&#xff0c;让我们来探讨一下单片机烧录的方式。虽然单片机烧录程序的具体方法会因为单片机型号、然后很多小伙伴私我想要嵌入式资料&#xff0c;通宵总结整理后&#xff0c;我十年的经验和入门到高级的学习资料&#xff0c;只需一…

计算机算法分析与设计(9)---0-1背包和完全背包问题(含C++代码)

文章目录 一、0-1背包概述1.1 问题描述1.2 算法思想 二、0-1背包代码2.1 题目描述2.2 代码编写 三、完全背包概述四、完全背包代码4.1 题目描述4.1 代码编写4.2 代码优化 一、0-1背包概述 1.1 问题描述 1. 0-1背包问题&#xff1a;给定 n n n 种物品和一背包。物品 i i i 的…

Unity可视化Shader工具ASE介绍——7、ASE实现Matcap效果和自定义节点

大家好&#xff0c;我是阿赵。继续介绍Unity可视化Shader编辑工具ASE。上一篇用了很长的篇幅来做了一个遮挡X光的效果。这一篇来做一个MatCap效果。不过做MatCap并不是目的&#xff0c;是想说明一下&#xff0c;怎样在ASE里面自定义方法节点。 一、在ASE里面做MatCap材质 由于…

【每日一题Day348】LC137只出现一次的数字Ⅱ | 状态转移

只出现一次的数字Ⅱ【LC137】 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。 排序 将数组从小到大…

LED灯的基本控制

题目要求 首先让8路LED指示灯闪烁3遍然后熄灭&#xff0c;接着依次点亮LED指示灯&#xff0c;最后依次熄灭LED灯&#xff0c;程序循环实现上述功能。 分析设计 原理图&#xff1a; 首先应该选通Y4C&#xff0c;也就是ABC 100。 代码 #include <regx52.h> #define…

C语言 —— 指针

目录 1. 指针是什么&#xff1f; 2. 指针和指针类型的关系 2.1 指针的解引用 2.2 指针-整数 3. 野指针 3.1 野指针成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间释放 3.2 如何规避野指针 4. 指针运算 4.1 指针-整数 4.2 指针-指针 指针-指针的使用 4.3 指针的关系运…

3.7 static关键字

思维导图&#xff1a; 3.7.1 静态属性 ### 3.7 static关键字 --- Java提供了一个称为static的关键字&#xff0c;用于修饰类的成员&#xff0c;如成员变量、成员方法和代码块。使用static修饰的成员拥有特殊性。 --- #### 3.7.1 静态属性 当属性被static关键字修饰时&…

嵌入式实时操作系统的设计与开发(轮询系统学习)

轮询系统具有以下工作特点&#xff1a;系统完成一个轮询的时间取决于循环中需要执行的函数个数。此外&#xff0c;轮询的次序是静态固定的&#xff0c;在运行时不能进行动态调整。 典型系统 许多工业线程网络中&#xff0c;由于需要控制的设备较多、相互距离又较远&#xff0…

手把手教你用Python绘制神经网络图

接下来教大家如何使用 Python 中的 networkx 库&#xff0c;绘制美观且标准的神经网络。会根据指定的层和节点数量&#xff0c;绘制不同结构的神经网络。 networkx 库可以用来创建和操作图类型的数据结构&#xff0c;其中包括无向图、有向图、带权图等等。 神经网络可以看做是一…