Vue+NodeJS实现邮件发送

一.邮箱配置

这里以QQ邮箱为例,网易邮箱类似.

设置->账号

二.后端服务搭建

index.js

const express = require('express')
const  router = require('./router'); 					
const app = express()// 使用路由文件
app.use('/',router);app.listen(3000, () => {console.log('server running ...');
})

router.js

const express = require('express');
const router = express.Router();
const {createSixNum,send}=require('./utils')//发送邮件router.get('/getemail', async (req, res) => {try {const { mail } = req.query; //获取前端传过来的邮箱let code = createSixNum(); // 随机生成6位验证码send(mail, code)  //发送邮件的函数,传入邮箱和6位验证码.then(() => {res.json({ msg: '验证码发送成功' });}).catch((err) => {console.error(err);res.json({ msg: '验证码发送失败' });});} catch (error) {console.error(error);res.status(500).json({ message: '邮件发送失败' });}});

util.js

安装nodemailer

npm i nodemailer
const nodemailer = require('nodemailer')// 随机产生六位验证码function createSixNum() {let Num = "";for (var i = 0; i < 6; i++) {Num += Math.floor(Math.random() * 10);}return Num;}// 创建一个SMTP客户端对象
let transporter = nodemailer.createTransport({host: "smtp.qq.com", // 发送方邮箱 qq 通过lib/wel-konwport: 465,secure: true, // true for 465, false for other portsauth: {user: '2580578725@qq.com', // 发送方邮箱地址pass:*****  // mtp 验证码 这个有了才可以发送邮件,可以qq邮箱去查看自己的码}
})//发送邮件
function send(mail,code) {const mailContent = `<p>尊敬的用户:</p><p>您好!</p><p>***为您提供了以下验证码,用于完成您的操作:</p><p><span style="font-weight: bold; color: #DC143C;">${code}</span></p><p>请注意,此验证码的有效期为5分钟。</p><p>感谢您的使用和支持!</p><p>祝您一天愉快!</p>`;// 邮件信息let mailobj = {from: '<2580578725@qq.com>', // 发送方地址自定义to: mail, // 接收方地址subject: "注册验证码", // 主题内容html: mailContent // 使用html属性设置HTML内容}return new Promise((reslove, reject) => {// 发送邮件transporter.sendMail(mailobj, (err, data) => {if (err) {reject()} else {reslove()}})})}module.exports = { createSixNum ,send}

 至此发送邮件的后端核心就完成了,接下来我们要将验证码缓存5分钟,给用户进行操作,过了5分钟,验证码会自动失效.

安装node-cache

npm i node-cache

router.js(全)

...
const NodeCache = require("node-cache");
const myCache = new NodeCache();...
let code = createSixNum(); // 随机验证码// 将code存入缓存
myCache.set("code", code, 300); // 缓存5分钟send(mail, code)  //发送邮件的函数,传入邮箱和6位验证码.then(() => {res.json({ msg: '验证码发送成功' });}).catch((err) => {console.error(err);res.json({ msg: '验证码发送失败' });
});

至此后端的服务搭建完毕,我们可以配合登录或者注册来使用.假如是邮箱验证注册,我们在验证码缓存的时候,可以在注册的接口中获取验证码

myCache.get("code");

来与前端传过来的验证码进行比对,完成注册.如果比对成功可以用

myCache.del("code");

清空缓存,优化性能.

后面我会出一期完整的邮箱验证注册和登录模块.包括密码加密,JWT生成token,用户信息存储到数据库,Cookie实现无感登录和时效性.

三.Vue前端

由于是从项目中扣出来的,这里的axios请求我进行了封装,单个请求封装就有些多余.大家可以改改,能够将邮箱发过去就好了

axios封装

util.js
import axios from "axios";const http = axios.create({baseURL: 'http://127.0.0.1:3000', // 注意这里的双斜杠timeout: 5000
});// 请求拦截器
http.interceptors.request.use(config => {return config;
}, error => {return Promise.reject(error);
});// 响应拦截器
http.interceptors.response.use(response => {return response.data;
}, error => {return Promise.reject(error);
});export default http;
 api.js
import http from '@/utils/http';
//email
export async function getEmailAPI(mail) {const response = await http({url: 'getemail',method:'get',params: {mail}});return response; // 返回响应数据}

这里我传的是params参数,如果你是axios.get('..',mail)... 后端记得修改为req.body

发送请求

import {getEmailAPI} from './api'
//邮件 
function sendemail(){  
//邮件正则
const qqEmailRegex = /^[1-9]\d{4,10}@qq\.com$/;if (qqEmailRegex.test(email.value)) {getEmailAPI(email.value) //email.value input的值.then(response=>{console.log(response)}).catch(error=>{console.log(error)})} else {console.log('邮件格式不正确')}}

后续再加上冷却,多长时间才可以发下一封.以及进行下面的操作.

如果有不对或者优化的地方可以指正,如果使用时出现了问题,可以留言评论,大家一起解决!

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

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

相关文章

sklearn中的数据集使用

导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集&#xff1a;{iris}) print(f查看数据集的特征&#xff1a;{iris.feature_names}) print(f查看数据集的标签&#xff1a;{iris.target_names}) print(f查看数据集的描述…

期货基础知识

一、期货是什么&#xff1f;  期货是与现货相对应&#xff0c;并由现货衍生而来。期货通常指期货合约&#xff0c;期货与现货完全不同&#xff0c;现货是实实在在可以交易的货&#xff08;商品&#xff09;&#xff0c;期货主要不是货&#xff0c;而是以某种大众产品如棉花、大…

Nginx从安装到使用,反向代理,负载均衡

什么是Nginx&#xff1f; 文章目录 什么是Nginx&#xff1f;1、Nginx概述1.1、Nginx介绍1.2、Nginx下载和安装1.3、Nginx目录结构 2、Nginx命令2.1、查看版本2.2、检查配置文件正确性2.3、启动和停止2.4、重新加载配置文件2.5、环境变量的配置 3、Nginx配置文件结构4、Nginx具体…

论文阅读_大模型_ToolLLM

英文名称: ToolLLM: Facilitating Large Language Models to Master 16000 Real-world APIs 中文名称: TOOLLLM&#xff1a;帮助大语言模型掌握16000多个真实世界的API 文章: http://arxiv.org/abs/2307.16789 代码: https://github.com/OpenBMB/ToolBench 作者: Yujia Qin 日期…

部署项目至服务器

安装conda https://zhuanlan.zhihu.com/p/489499097 个人租借的服务器如何进行端口的开放呢&#xff1f; 防火墙设置&#xff1a; 添加规则设置&#xff1a; 即可&#xff1b; 通常下租借的服务器没有防火墙设置 相关链接&#xff1a; https://blog.csdn.net/weixin_4520…

算法通关村16关 | 滑动窗口最长字串专题

1. 最长字串专题 1.1 无重复字符的最长字串 题目 LeetCode3 给定一个字符串s&#xff0c;请你找出其中不含有重复字符的最长字串的长度。 思路 找最长字串&#xff0c;需要知道所有无重复字串的首和尾&#xff0c;找出其中最长的&#xff0c;最少两个指针才可以完成&#xff…

PHP8内置函数中的变量函数-PHP8知识详解

在php8中&#xff0c;与变量相关的内置函数比较多&#xff0c;本文说一些比较重要的、常见的内置函数。今日着重讲解了5个&#xff0c;分别是&#xff1a;检测变量是否为空的函数empty()、判断变量是否定义过的函数isset()、销毁指定的变量的函数unset()、获取变量的类型的函数…

Vagrant + VirtualBox + CentOS7 + WindTerm 5分钟搭建本地linux开发环境

1、准备阶段 将环境搭建所需要的工具和文件下载好&#xff08;页面找不到可参考Tips部分&#xff09; Vagrant 版本&#xff1a;vagrant_2.2.18_x86_64.msi 链接&#xff1a;https://developer.hashicorp.com/vagrant/downloads VirtualBox 版本&#xff1a;VirtualBox-6.1.46…

使用redis实现队列功能

使用redis实现队列功能 操作方法描述LPUSHLong lPush(String key, String… values)将一个或多个值 value 插入到列表 key 的表头&#xff0c;返回插入后列表中value的数量&#xff0c;若key不存在&#xff0c;会创建一个新的列表并执行 LPUSH 操作RPOPLPUSHString rPopLPush(S…

【网络编程】TCP/IP协议(互联网的基石)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

How to clean up Graylog Default index set log

一、前言: Graylog 满了,没有自动清理 挤爆硬盘空间,手动清理流程: 二、问题描述: Elasticsearch nodes disk usage above high watermark (triggered a few seconds ago)mree are ast search modes i the use wtm a mos mo re disk ther dsk s saoe me e waemak f ths…

974. 和可被 K 整除的子数组

974. 和可被 K 整除的子数组 C代码&#xff1a;滑动窗口 // 1、最长子数组 2、两个单调队列、求最大值-最小值&#xff0c;判断是否满足条件 3、满足记录长度 // 窗口移动条件&#xff1a;int longestSubarray(int* nums, int numsSize, int limit){int queMax[numsSize];in…