邮箱发送验证码(nodemailer)

邮箱发送验证码

    • 打开`SMTP` 服务
    • 使用 Node.js 邮件发送模块(nodemailer)
    • 封装验证码组件

开发中经常会遇到需要验证码,不过手机验证码需要money,不到必要就不必花费,所以可以使用邮箱发送验证码

打开SMTP 服务

根据自己想使用的邮箱,在官网找到并打开smtp服务

在这里插入图片描述

不同邮箱服务商的 SMTP 服务器配置有所不同,如 QQ 邮箱的 SMTP 服务器是 smtp.qq.com,端口一般是 465(SSL)或 587(TLS)

使用 Node.js 邮件发送模块(nodemailer)

npm install nodemailer

配置nodemailer配置项

'use strict';const nodemailer = require('nodemailer');exports.main = async (event, context) => {const { mail } = event;// 创建6位随机验证码const code = Math.floor(Math.random() * 900000) + 100000;// 创建一个 SMTP 服务器配置对象let transporter = nodemailer.createTransport({service: 'QQ', // 使用 QQ 邮箱服务auth: {user: '', // 发送方邮箱pass: '' // 发送方邮箱授权码,需要替换为实际的授权码}});// 邮件内容let mailOptions = {from: '', // 发送方邮箱to: mail, // 接收方邮箱subject: '验证码', // 邮件主题text: '您的验证码是:' + code, // 邮件正文(纯文本)// html: '<b>您的验证码是:' + code + '</b>' // 邮件正文(HTML 格式)};try {// 发送邮件const info = await transporter.sendMail(mailOptions);console.log('Message sent: %s', info.messageId);// 预览邮件链接console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));// 返回数据给客户端return {code: 0,data: {mail,code},msg: '发送成功'};} catch (error) {console.error(error);return {code: 1,msg: '发送失败'};}
};

注意:nodemailer是在node环境中使用的,所以要在云函数中使用

封装验证码组件

一般情况下,登陆、注册、忘记密码等功能都会需要使用到验证码功能,所以将获取验证码封装为一个组件可以提高复用率

尽量将相关的计算操作都涵盖到组件,比如验证码有效期定时器、邮箱验证、云函数调用等

<template><view class="code-container"><button @click="getCode">{{ getFlag?`还剩${countdown}秒`:`获取验证码` }}</button></view>
</template><script setup>import {defineProps,defineEmits,ref,onBeforeUnmount} from 'vue';const props = defineProps({email: {type: String,default: ''}});const emits = defineEmits(['transmitcode']);// 是否获取验证码的标志位const getFlag = ref(false);// 定时器const timer = ref(null);// 倒计时,验证码有效期const countdown = ref(60);const getCode = () => {if (getFlag.value) return;// 判断邮箱是否为空if (!props.email) return;// 验证邮箱格式const reg = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;if (!reg.test(props.email)) {uni.showToast({title: '请输入正确的邮箱格式',icon: 'none'});return;};// 发送验证码uniCloud.callFunction({name: 'getCode',data: { mail: props.email },success: res => {uni.showToast({title: '验证码已发送',icon: 'success'});// 将获得的验证码交给父组件进行判断emits('transmitcode', res.result.data.code);getFlag.value = true;timer.value = setInterval(() => {countdown.value--;if (countdown.value <= 0) {clearInterval(timer.value);getFlag.value = false;countdown.value = 60;}}, 1000);},fail: err => {uni.showToast({title: '验证码发送失败',icon: 'none'});}});};// 组件销毁时清除定时器onBeforeUnmount(() => {clearInterval(timer.value);});
</script>

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

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

相关文章

AV1视频编解码简介、码流结构(OBU)

我的音视频/流媒体开源项目(github) 目录 一、AV1编码技术 二、AV1码流结构(OBU) 三、IVF文件格式 四、ffmpeg支持AV1 五、关于常见格式对AV1的封装 一、AV1编码技术 AV1是由开放媒体联盟(AOM&#xff0c;Alliance for Open Media)在2018年发布的&#xff0c;AV1的前身…

docker swarm 部署问题 和 指定节点部署服务

问题原因&#xff1a; docker swarm 部署遇到的问题&#xff0c; 先前docker compose部署&#xff0c;分别创建了 cloud 网络&#xff1b; 昨进行swarm 集群部署&#xff1b;只是删了57 机器cloud 网络&#xff1b;在创建swarm集群后创建cloud 58机器 没有删除先前的cloud 网络…

pytorch小记(一):pytorch矩阵乘法:torch.matmul(x, y)

pytorch小记&#xff08;一&#xff09;&#xff1a;pytorch矩阵乘法&#xff1a;torch.matmul&#xff08;x, y&#xff09;/ x y 代码代码 1&#xff1a;torch.matmul(x, y)输入张量&#xff1a;计算逻辑&#xff1a;输出结果&#xff1a; 代码 2&#xff1a;y y.view(4,1)…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中&#xff0c;如果需要对器件进行翻转、平移等操作&#xff0c;可以通过transform指…

kafka消费堆积问题探索

背景 我们的商城项目用PHP写的&#xff0c;原本写日志方案用的是PHP的方案&#xff0c;但是&#xff0c;这个方案导致资源消耗一直降不下来&#xff0c;使用了20个CPU。后面考虑使用通过kafka的方案写日志&#xff0c;商城中把产生的日志丢到kafka中&#xff0c;在以go写的项目…

【opencv】第7章 图像变换

7.1 基 于OpenCV 的 边 缘 检 测 本节中&#xff0c;我们将一起学习OpenCV 中边缘检测的各种算子和滤波器——Canny 算子、Sobel 算 子 、Laplacian 算子以及Scharr 滤波器。 7.1.1 边缘检测的一般步骤 在具体介绍之前&#xff0c;先来一起看看边缘检测的一般步骤。 1.【第…

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…

JavaScript系列(26)--安全编程实践详解

JavaScript安全编程实践详解 &#x1f512; 今天&#xff0c;让我们深入探讨JavaScript的安全编程实践。在当今的网络环境中&#xff0c;安全性已经成为开发者必须重点关注的领域。 安全编程基础 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript安全编程涉及多个方…

OpenGL中Shader LOD失效

1&#xff09;OpenGL中Shader LOD失效 2&#xff09;DoTween的GC优化 3&#xff09;开发微信小程序游戏有没有类似Debug真机图形的方法 4&#xff09;射线和Mesh三角面碰撞检测的算法 这是第418篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了U…

Zookeeper 数据迁移实战:基础环境搭建与高效迁移方案全览

文章目录 一、Zookeeper数据迁移简介二、迁移zookeeper数据基础环境三、利用快照迁移zookeeper数据1、Node1最新的zk快照文件和日志文件2、将被迁移方node2的zookeeper的集群全部stop3、将源node1集群数据和日志拷贝到指定目录下4、验证优先启动拷贝的数据、日志的zookeeper节点…

什么是数据仓库?

什么是数据仓库&#xff1f; 数据仓库&#xff08;Data Warehouse&#xff0c;简称DW&#xff09;是一种面向分析和决策的数据存储系统&#xff0c;它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储&#xff0c;为数据分析、报表生成以及商业智能&#xff08;…

ubuntu支持中文的字体

在 Ubuntu 系统中&#xff0c;支持中文的字体可以通过安装或启用适配中文字符的字体包来实现。以下是 Ubuntu 上常用的中文字体以及安装方法&#xff1a; 常见支持中文的字体 思源字体系列&#xff08;推荐&#xff09;&#xff1a; 思源黑体&#xff08;Noto Sans CJK / Sourc…

java 迪米特法则,原理、思想、工作流程、实现细节、稳定性、优缺点、应用场景等

迪米特法则&#xff08;Law of Demeter&#xff0c;LoD&#xff09;&#xff0c;也被称为“最少知识原则”&#xff0c;是一种指导面向对象设计的原则&#xff0c;旨在减少对象之间的耦合度。以下是对迪米特法则的详细解析。 1. 定义 迪米特法则指出&#xff1a;一个对象应该…

[Linux]从零开始的STM32MP157交叉编译环境配置

一、前言 最近该忙的事情也是都忙完了&#xff0c;也是可以开始好好的学习一下Linux了。之前九月份的时候就想入手一块Linux的开发板用来学习Linux底层开发。之前在NXP和STM32MP系列之间犹豫&#xff0c;思来想去还是入手了一块STM32MP157。当然不是单纯因为MP157的性能在NXP之…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

添加计算机到AD域中

添加计算机到AD域中 一、确定计算机的DNS指向域中的DNS二、打开系统设置三、加域成功后 一、确定计算机的DNS指向域中的DNS 二、打开系统设置 输入域管理员的账密 三、加域成功后 这里有显示&#xff0c;就成功了。

你喜欢用什么编辑器?

电脑工作者和程序员所使用的文本编辑器通常需要具备高效率、易用性以及对代码友好等特点&#xff0c;包括语法高亮、自动完成、多文件同时编辑、查找替换、版本控制集成等功能。以下是几个广受开发者欢迎且实用性较强的文本编辑器&#xff1a; Visual Studio Code&#xff08;V…

32单片机综合应用案例——智能家居灯光控制系统(二)(内附详细代码讲解!!!)

"即使世界看似残酷&#xff0c;也要坚持自己的梦想&#xff0c;因为只有这样&#xff0c;你才能创造属于自己的奇迹。”“不要害怕失败&#xff0c;因为失败是成功的垫脚石。”“即使跌倒了一百次&#xff0c;也要勇敢地爬起来一百零一次。”“永远不要低估自己的潜力&…

从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录 一、应用层与TCP之间的联系 二、 当通信双方中的一方如客户端主动断开连接时&#xff0c;仅是在客户端的视角下连接已经断开&#xff0c;在服务端的眼中&#xff0c;连接依然存在&#xff0c;为什么&#xff1f;——触发EPOLLRDHUP事件&#xff1a;对端关闭连接或停止写…

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…