node 使用 nodemailer工具发送验证码到邮箱

 更新时间:2023年10月13日 10:53:38   作者:哇伊卡  
最近闲着没事,我就在练习使用node和mysql编写接口,计划写一个完整的vue系统,这篇文章主要介绍了node 使用 nodemailer工具发送验证码到邮箱,需要的朋友可以参考下

最近闲着没事,我就在练习使用node和mysql编写接口,计划写一个完整的vue系统。刚刚处理完注册登录的功能,我决定加入验证码验证。在思考是否使用手机号或邮箱验证时,最终我选择了将验证码发送到邮箱。于是我发现了一个非常有用的工具——nodemailer。

功能

  • 零依赖性的单个模块–由于没有死角,因此代码易于审核
  • 高度重视安全性
  • Unicode 支持使用任何字符,包括表情符号
  • Windows 支持 –您可以使用 npm在 Windows 上,就像其他模块一样,没有编译的依赖项。从 Azure 或 Windows 盒子免费使用它
  • 使用 HTML 内容以及纯文本替代
  • 加 附件 到消息
  • 嵌入式的 HTML 内容的图像附件–您的设计不会被阻塞
  • 使用 TLS / STARTTLS 的安全电子邮件传递
  • 不同 运输方式 除了内置 SMTP 支持
  • 与签署消息 DKIM
  • 自订 插件支持 用于处理消息
  • OAuth2 认证方式
  • 代理人 用于 SMTP 连接
  • ES6 码 - 没有更多的无意内存泄漏,由于吊装 VAR 的
  • 来自的自动生成的电子邮件测试帐户电子邮件

1.先下nodemailer载依赖

npm i nodemailer
或
yarn add nodemailer

2.在utils文件下创建sendEmail.js,引入nodemailer模块

const nodemailer = require('nodemailer')

创建一个SMTP客户端配置对象:

nodemailer.createTransport({
    host: "smtp.qq.com",  // 邮箱服务的host,我使用的是QQ邮箱
    port: 465, 
    secure: true, 
    auth: { 
        user: 'XXX@qq.com', 发送邮件的邮箱
        pass: '邮箱授权码'
     } 
});

邮箱授权码获取:

登录qq邮箱-》点击设置,找到账户,下滑找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,

![image.png](https://img-blog.csdnimg.cn/img_convert/2fd1e05b4c7dea4b3d5a8ec487588274.png

开启服务,按照指示即可获取。

设置收件人:

mailOptions = {
    from: '来自XX<XXX@qq.com>', //发送邮件的邮箱信息
    to: toEmail, // 发送给谁的邮箱
    subject: "验证码", // 标题
    // text: `你的验证码为XXX,3分钟内有效,请务透漏给他人`,//发送文本
    html: "你的验证码为<b style='color:skybkue;'>" + XXX + "</b>,3分钟内有效,请务透漏给他人!",
}

调用transporter.sendMail发送邮件:

transporter.sendMail(mailOptions)

完整代码

sendEmail.js =>

const nodemailer = require('nodemailer')
const sendEmail =  (toEmail, sendText, host = 'smtp.qq.com') => {
    return new Promise((resolve, reject) => {
      let transporter = nodemailer.createTransport({
        host: host,
        port: 465,
        // 开启安全连接,这个开不开都可以,对安全性有要求的话,最好开启
        secureConnection: true,
        auth: {
          user: 'XXX@qq.com',
          pass: '邮箱授权码',
        },
        tls: {
          rejectUnauthorized: false, // 拒绝认证就行了, 不然会报证书问题
        },
      });
      const mailOptions = {
        from: '来自XXX<XXX@qq.com>',
        to: toEmail,
        subject: "验证码",
        html: "你的验证码为<b style='color:skybkue;'>" + sendText + "</b>,3分钟内有效,请务透漏给他人!",
      }
      transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
          reject(error);
        } else {
          resolve(info)
        }
      })
    })
}
module.exports = {
  sendEmail
}

调用sendEmail获取验证码接口 =>:

const { sendEmail } = require("../utils/sendEmail");
/*email 邮箱账户 passWord  密码 verification_code 验证码  code_expires 验证码有效期 code_effective 验证码是否有效 (0 无效 ;1 有效 */
exports.GetCaptcha = async (req, res) => {
  try {
    const isExit = await resSql('SHOW TABLES LIKE "userAccount"');
    if (!isExit.length) {
      await resSql(
        `CREATE TABLE userAccount(email VARCHAR(50) NOT NULL,passWord VARCHAR(255),verification_code INT(10),code_expires VARCHAR(255),code_effective TINYINT(1) DEFAULT 0,PRIMARY KEY (email))`
      );
    }
    // 发送验证码到邮箱
    // console.log('=========检测邮箱格式=======');
    const { email } = req.body;
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      res.json({
        code: 500,
        message: "错误的邮箱格式",
      });
      return;
    }
    // 设置验证码
    let verification_code = "";
    for (let i = 0; i < 6; i++) {
      verification_code += parseInt(Math.random() * 10);
    }
    const now_timestamp = moment().format("x");
    // 验证码3min内有效
    const code_expires = `${Number(now_timestamp) + 180000}`;
    // 查询email是否存在
    const isExitEmail = await resSql(
      `SELECT * FROM userAccount WHERE email='${email}'`
    );
    // 插入
    let sendCodeSql = `INSERT INTO userAccount (email, verification_code, code_expires, code_effective) VALUES ("${email}", "${verification_code}", "${code_expires}", 1)`;
    if (isExitEmail.length) {
      // 存在就修改
      sendCodeSql = `UPDATE userAccount SET verification_code='${verification_code}', code_expires='${code_expires}', code_effective=1 WHERE email='${email}'`;
    }
    sendEmail(email, verification_code)
      .then(async () => {
        try {
          await resSql(sendCodeSql);
          res.json({
            code: 200,
            message: "发送成功!验证码3分钟内有效",
          });
        } catch (error) {
          res.json({
            code: 500,
            message: error,
          });
        }
      })
      .catch((err) => {
        res.json({
          code: 500,
          message: err || "发送失败",
        });
      });
  } catch (error) {
    res.json({
      code: 500,
      message: error || "错误返回",
    });
  }
};

到此这篇关于node 使用 nodemailer 发送验证码到邮箱的文章就介绍到这了,更多相关node发送验证码到邮箱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • node.js错误处理之npm无法下载第三方包

    node.js错误处理之npm无法下载第三方包

    这篇文章主要给大家介绍了关于node.js错误处理之npm无法下载第三方包的相关资料,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的帮助,需要的朋友可以参考下
    2023-07-07
  • Mongoose学习全面理解(推荐)

    Mongoose学习全面理解(推荐)

    本篇文章主要介绍了Mongoose全面理解,详细的介绍了mongoose连接数据库,查找读取数据和数据验证等,有兴趣的可以了解一下。
    2017-01-01
  • 基于Koa2写个脚手架模拟接口服务的方法

    基于Koa2写个脚手架模拟接口服务的方法

    这篇文章主要介绍了基于Koa2写个脚手架模拟接口服务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • NodeJS中的命令行程序、工程目录、NPM

    NodeJS中的命令行程序、工程目录、NPM

    使用NodeJS编写的东西,要么是一个包,要么是一个命令行程序,而前者最终也会用于开发后者,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码,NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题
    2023-11-11
  • node.js连接mongoose数据库方法详解

    node.js连接mongoose数据库方法详解

    之前我们都是通过shell来完成对数据库的各种操作的,在开发中大部分时候我们都需要通过程序来完成对数据库的操作。而Mongoose就是一个让我们可以通过Node来操作MongoDB的模块
    2022-08-08
  • nodejs和npm版本不匹配报错的解决方法

    nodejs和npm版本不匹配报错的解决方法

    当公司要求使用固定nodejs的版本时,自己不小心更新了npm,就会导致npm和nodejs不匹配,下面这篇文章主要给大家介绍了关于nodejs和npm版本不匹配报错的解决方法,需要的朋友可以参考下
    2023-04-04
  • node.js降低版本的方式详解(解决sass和node.js冲突问题)

    node.js降低版本的方式详解(解决sass和node.js冲突问题)

    这篇文章主要介绍了node.js降低版本的方式(解决sass和node.js冲突),本文是因为sass版本和node版本不匹配(可以找一下对应的版本),本文给大家详细讲解,需要的朋友可以参考下
    2023-02-02
  • nodejs 使用nodejs-websocket模块实现点对点实时通讯

    nodejs 使用nodejs-websocket模块实现点对点实时通讯

    这篇文章主要介绍了nodejs 使用nodejs-websocket模块实现点对点实时通讯的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • 我的Node.js学习之路(四)--单元测试

    我的Node.js学习之路(四)--单元测试

    在专业化的软件开发过程中,无论什么平台语言,现在都需要UnitTest单元测试. Node.js有built-in的Assert。 今天让我们来看一下Node.js的单元测试。在这儿我们使用nodeunit
    2014-07-07
  • kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.

    kafka调试中遇到Connection to node -1 could not be established. Br

    这篇文章主要介绍了kafka调试中遇到Connection to node -1 could not be established. Broker may not be available的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-09-09

最新评论