• Vue+NodeJS实现邮件发送


    一.邮箱配置

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

    设置->账号

    二.后端服务搭建

    index.js
    1. const express = require('express')
    2. const router = require('./router');
    3. const app = express()
    4. // 使用路由文件
    5. app.use('/',router);
    6. app.listen(3000, () => {
    7. console.log('server running ...');
    8. })
    router.js
    1. const express = require('express');
    2. const router = express.Router();
    3. const {createSixNum,send}=require('./utils')
    4. //发送邮件
    5. router.get('/getemail', async (req, res) => {
    6. try {
    7. const { mail } = req.query; //获取前端传过来的邮箱
    8. let code = createSixNum(); // 随机生成6位验证码
    9. send(mail, code) //发送邮件的函数,传入邮箱和6位验证码
    10. .then(() => {
    11. res.json({ msg: '验证码发送成功' });
    12. })
    13. .catch((err) => {
    14. console.error(err);
    15. res.json({ msg: '验证码发送失败' });
    16. });
    17. } catch (error) {
    18. console.error(error);
    19. res.status(500).json({ message: '邮件发送失败' });
    20. }
    21. });
    util.js

    安装nodemailer

    npm i nodemailer
    1. const nodemailer = require('nodemailer')
    2. // 随机产生六位验证码
    3. function createSixNum() {
    4. let Num = "";
    5. for (var i = 0; i < 6; i++) {
    6. Num += Math.floor(Math.random() * 10);
    7. }
    8. return Num;
    9. }
    10. // 创建一个SMTP客户端对象
    11. let transporter = nodemailer.createTransport({
    12. host: "smtp.qq.com", // 发送方邮箱 qq 通过lib/wel-konw
    13. port: 465,
    14. secure: true, // true for 465, false for other ports
    15. auth: {
    16. user: '2580578725@qq.com', // 发送方邮箱地址
    17. pass:***** // mtp 验证码 这个有了才可以发送邮件,可以qq邮箱去查看自己的码
    18. }
    19. })
    20. //发送邮件
    21. function send(mail,code) {
    22. const mailContent = `
    23. 尊敬的用户:

    24. 您好!

    25. ***为您提供了以下验证码,用于完成您的操作:

    26. ${code}

    27. 请注意,此验证码的有效期为5分钟。

    28. 感谢您的使用和支持!

    29. 祝您一天愉快!

    30. `;
    31. // 邮件信息
    32. let mailobj = {
    33. from: '<2580578725@qq.com>', // 发送方地址自定义
    34. to: mail, // 接收方地址
    35. subject: "注册验证码", // 主题内容
    36. html: mailContent // 使用html属性设置HTML内容
    37. }
    38. return new Promise((reslove, reject) => {
    39. // 发送邮件
    40. transporter.sendMail(mailobj, (err, data) => {
    41. if (err) {
    42. reject()
    43. } else {
    44. reslove()
    45. }
    46. })
    47. })
    48. }
    49. module.exports = { createSixNum ,send}

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

    安装node-cache

    npm i node-cache
    router.js(全)
    1. ...
    2. const NodeCache = require("node-cache");
    3. const myCache = new NodeCache();
    4. ...
    5. let code = createSixNum(); // 随机验证码
    6. // 将code存入缓存
    7. myCache.set("code", code, 300); // 缓存5分钟
    8. send(mail, code) //发送邮件的函数,传入邮箱和6位验证码
    9. .then(() => {
    10. res.json({ msg: '验证码发送成功' });
    11. })
    12. .catch((err) => {
    13. console.error(err);
    14. res.json({ msg: '验证码发送失败' });
    15. });

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

    myCache.get("code");

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

    myCache.del("code");

    清空缓存,优化性能.

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

    三.Vue前端

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

    axios封装
    util.js
    1. import axios from "axios";
    2. const http = axios.create({
    3. baseURL: 'http://127.0.0.1:3000', // 注意这里的双斜杠
    4. timeout: 5000
    5. });
    6. // 请求拦截器
    7. http.interceptors.request.use(config => {
    8. return config;
    9. }, error => {
    10. return Promise.reject(error);
    11. });
    12. // 响应拦截器
    13. http.interceptors.response.use(response => {
    14. return response.data;
    15. }, error => {
    16. return Promise.reject(error);
    17. });
    18. export default http;
     api.js
    1. import http from '@/utils/http';
    2. //email
    3. export async function getEmailAPI(mail) {
    4. const response = await http({
    5. url: 'getemail',
    6. method:'get',
    7. params: {mail}
    8. });
    9. return response; // 返回响应数据
    10. }

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

    发送请求
    1. import {getEmailAPI} from './api'
    2. //邮件
    3. function sendemail(){
    4. //邮件正则
    5. const qqEmailRegex = /^[1-9]\d{4,10}@qq\.com$/;
    6. if (qqEmailRegex.test(email.value)) {
    7. getEmailAPI(email.value) //email.value input的值
    8. .then(response=>{
    9. console.log(response)
    10. })
    11. .catch(error=>{
    12. console.log(error)
    13. })
    14. } else {
    15. console.log('邮件格式不正确')
    16. }
    17. }

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

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

  • 相关阅读:
    DevOps(十二)Jenkins实战之Web发布到远程服务器
    FITC标记的STAT1-ASON,绿色荧光素标记STAT1反义寡核苷酸,FITC-STAT1-ASON
    prototype属性与__proto__属性的用法及为什么要用这两个属性
    SSM+人才交流平台 毕业设计-附源码221022
    哭了,我终于熬出头了,Java开发4年,费时8个月,入职阿里,涨薪14K
    从零开始搭建java web springboot Eclipse MyBatis jsp mysql开发环境
    API接口对电商平台有怎样的帮助?如何获取API接口?
    Shell编程——正则表达式
    Android开发:Fragment中优雅使用ViewBinding【Java】
    四、thymeleaf注释
  • 原文地址:https://blog.csdn.net/m0_71469120/article/details/132700810