vk-unicloud如何简单实现邮箱发送验证码?

以下代码是云函数发送验证码api,直接复制+改个人参数:

其中"user"和"pass"使用自己的账号数据,如何拿到看以下步骤:

网易邮箱6.0版:登录--点击设置--点击POP3/SMTP/IMAP--点击开启服务:IMAP/SMTP服务【会弹出自己的账号授权码,有效期一个月】

'use strict';var vkmail;try {vkmail = require('vk-mail');
} catch (err) {console.error("请先添加公共模块:vk-mail");
}module.exports = {/*** XXXnameXXX* @url client/email/pub/sendEmailCode 前端调用的url参数地址* data 请求参数* @param {String} params1  参数1*/main: async (event) => {let { data = {}, userInfo, util, filterResponse, originalParam } = event;let { customUtil, uniID, config, pubFun, vk, db, _, $ } = util;let { uid } = data;let res = { code: 0, msg: "" };// 业务逻辑开始-----------------------------------------------------------// email是vk的云函数写法,故接受不会在event里面而是在Data里面let {email, // 前端接收邮箱type = "bind", // 前端接收验证码类型(如: login register bind unbind)} = data;console.log(" email", email)// 支持QQ 163 等主流邮箱let emailConfig = {"host": "smtp.163.com","port": 465,"secure": true,"auth": {"user": "13574401245@163.com", // 发件人邮箱账号"pass": "NGaZnczUnmssa6x4", // 账号授权码}};if (!email) return { code: -1, msg: "email不能为空" };if (!type) return { code: -1, msg: "type不能为空" };let code = Math.floor(Math.random() * 100000) + 100000;let subject = `验证码 ${code}`;let text = `验证码 ${code},打死也不要告诉别人!`;// 创建邮箱服务实例let emailService = vkmail.createTransport({"host": emailConfig.host,"port": emailConfig.port,"secure": emailConfig.secure, // use SSL"auth": emailConfig.auth});try {// 发送邮件res.sendMailRes = await emailService.sendMail({"from": emailConfig.auth.user, // 邮件的发送者"to": email, // 邮件的接收者"cc": emailConfig.auth.user, // 由于邮件可能会被当成垃圾邮件,但只要把右键抄送给自己一份,就不会被当成垃圾邮件。"subject": subject, // 邮件的标题"text": text, // 邮件的内容});// 标记发送成功res.code = 0;res.msg = "ok";// 发送验证码成功后,通常需要设置验证码(写入数据库)// await uniID.setVerifyCode({ code, email, type });} catch (err) {res.code = -1;res.msg = "邮件发送失败";res.err = err;}// 业务逻辑结束-----------------------------------------------------------return res;}
}

前端传要发送的email即可

<template><view class="content"><input type="text" placeholder="邮箱" v-model="form1.email" /><input type="text" placeholder="验证码" v-model="form1.code" /><view class="tips" style="color: red;">上次发送的验证码:{{form1.code}}</view><view class="title">邮箱注册&登录相关</view><view class="tips" style="text-align: left;">如需要使用此功能,先确保已安装npm包<view>"nodemailer": "^6.4.11"</view></view><view style="display: flex;"><button type="default" @click="sendEmailCode('login')">真实-发送验证码</button><button type="default" @click="setVerifyCode('login')">模拟-发送验证码</button></view><button type="default" @click="loginByEmail">邮箱验证码登录(不存在则注册)</button><view class="title">绑定邮箱相关</view><view style="display: flex;"><button type="default" @click="sendEmailCode('bind')">真实-发送验证码</button><button type="default" @click="setVerifyCode('bind')">模拟-发送验证码</button></view><button type="default" @click="bindEmail">绑定邮箱(需先登录)</button><view class="tips">绑定邮箱时如果不传验证码或者传空则直接绑定并设置email_confirmed为1,不会去校验验证码</view><view class="title">解绑邮箱相关</view><view style="display: flex;"><button type="default" @click="sendEmailCode('unbind')">真实-发送验证码</button><button type="default" @click="setVerifyCode('unbind')">模拟-发送验证码</button></view><button type="default" @click="unbindEmail">解绑邮箱(需先登录)</button><view class="tips">解绑邮箱时如果不传验证码或者传空则直接解除绑定绑定,不会去校验验证码</view></view>
</template><script>var vk = uni.vk;export default {data() {return {form1:{email: '',code: ''}}},onLoad(options) {vk = uni.vk;},methods: {// 为了演示把这个逻辑放在客户端getCode() {const randomStr = '00000' + Math.floor(Math.random() * 1000000)this.form1.code = randomStr.substring(randomStr.length - 6)},sendEmailCode(type) {// let that = this;// if (!/.+@.+/.test(that.form1.email)) {// 	uni.showModal({// 		content: '请输入正确的邮箱',// 		showCancel: false// 	})// 	return// }// var form1 = that.form1;vk.callFunction({url: 'client/email/pub/sendEmailCode',title: '请求中...',data: {email:"13574401245@163.com"},success: (data) => {vk.log("data",data)}});// vk.userCenter.sendEmailCode({// 	data:{// 		serviceType:"qq",// 		email: form1.email,// 		type: type,// 	},// 	success: (data) => {// 		vk.alert("邮件发送成功");// 	}// });},setVerifyCode(type) {let that = this;if (!/.+@.+/.test(that.form1.email)) {uni.showModal({content: '请输入正确的邮箱',showCancel: false})return}that.getCode();var form1 = that.form1;vk.userCenter.setVerifyCode({data:{email: form1.email,code: form1.code,type: type,},success: (data) => {vk.toast("发送成功");}});},// 邮箱登录loginByEmail() {let that = this;var form1 = that.form1;vk.userCenter.loginByEmail({data:form1,success: (data) => {vk.alert("登录成功");}});},// 绑定邮箱bindEmail(){let that = this;var form1 = that.form1;vk.userCenter.bindEmail({data:form1,success: (data) => {vk.alert("绑定成功");}});},// 解绑邮箱unbindEmail(){let that = this;var form1 = that.form1;vk.userCenter.unbindEmail({data:form1,success: (data) => {vk.alert("解绑成功");}});}}}
</script><style lang="scss" scoped>.content {padding: 15px;}.content input {height: 46px;border: solid 1px #DDDDDD;border-radius: 5px;margin-bottom: 15px;padding: 0px 15px;display: block;}.content button {margin-bottom: 15px;margin-left: auto;margin-right: auto;padding-left: 14px;padding-right: 14px;}.content navigator {display: inline-block;color: #007AFF;border-bottom: solid 1px #007AFF;font-size: 16px;line-height: 24px;margin-bottom: 15px;}.tips {text-align: center;line-height: 20px;font-size: 14px;color: #999999;margin-bottom: 20px;}.title{font-size: 36rpx;margin-bottom: 20rpx;}
</style>

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

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

相关文章

机器视觉系统中的重要配件--棱镜

在一套机器视觉系统中&#xff0c;人们一直比较注中工业相机、工业镜头及光源等重要的视觉器件&#xff0c;而小配件通常被忽视&#xff0c;虽然只是配角&#xff0c;但是却起着重要作用。以下以茉丽特镜头为例。 在构建视觉系统当中&#xff0c;遇到某个方向空间不足时&#x…

射频到底是什么

背景: 由于工作中wifi&#xff0c; gps 等等&#xff0c;经常使用到射频这个概念&#xff0c;一直很模糊&#xff0c;于是特此了解并记录一下。 概念理解&#xff1a; 射频可以理解为发射一个信号&#xff0c;该信号本质上是交流电所产生的电磁波&#xff0c; 一般通过这种方…

Flink-CDC 全面解析

Flink-CDC 全面解析 一、CDC 概述 &#xff08;一&#xff09;什么是 CDC CDC 即 Change Data Capture&#xff08;变更数据获取&#xff09;&#xff0c;其核心要义在于严密监测并精准捕获数据库内发生的各种变动情况&#xff0c;像数据的插入、更新以及删除操作&#xff0…

PHP语言的字符串处理

PHP语言的字符串处理 引言 字符串是编程中最基本的数据类型之一&#xff0c;通常用于存储和操作文本数据。在PHP语言中&#xff0c;对字符串的处理非常灵活且强大。无论是简单的字符操作&#xff0c;还是复杂的模式匹配&#xff0c;PHP都提供了丰富的函数和工具来满足不同的需…

PHP的扩展Imagick的安装

windows下的安装 下载&#xff1a;Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows​​​​​​​ 下载&#xff1a;ghostscript&#xff08;PDF提取图片时用到&#xff0c;不处理PDF可以不安装&#xff09; Ghostscript : Downloads 安装扩展 Imagick解压后&…

THREE.js的VideoTexture以及CanvasTexture在部分浏览器以及小程序webview中纯黑不起作用的解决办法

黑色是因为video没有自动播放导致的。 而且video必须设置muted&#xff08;静音&#xff09;属性&#xff0c;否则视频都无法播放&#xff1b; 如果不设置muted,也可以用设置x5-video-player-type"h5" 替代&#xff08;意为兼容qq浏览器&#xff0c;解决在小程序中黑…

【redis】ubuntu18安装redis7

在Ubuntu 18下安装Redis7可以通过以下两种方法实现&#xff1a;手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本&#xff1a; $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…

Java实现迭代器模式

一、简介 1、定义 迭代器模式(Iterator Pattern)是一种面向集合对象而生的行为设计模式。对于集合对象而言&#xff0c;会涉及对集合的添加和删除操作&#xff0c;也要支持遍历集合元素的操作。可以把遍历操作放在集合对象中&#xff0c;但这样做&#xff0c;集合对象就承担太…

uniapp中h5使用地图

export function loadTMap(key) {return new Promise(function(resolve, reject) {window.init function() {// resolve(qq) //注意这里resolve(TMap) //注意这里}var script document.createElement("script");script.type "text/javascript";// scrip…

获取地图文档中的图层列表

大多数情况下,获取地图文档中的图层列表是地理处理脚本中的首要工作之一.获取图层列表后,脚本可以循环遍历每个图层并执行某些类型的处理.制图模块中的ListLayers()函数提供获取图层列表的功能.本节将学习如何获得地图文档中的图层列表. 操作方法: 1.在arcgis中打开地图文件 …

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中&#xff0c;我们逆向分析时候通常都不能直接看到软件的明文源代码&#xff0c;或多或少存在着混淆对抗的操作。下面&#xff0c;我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

【权限管理】Apache Shiro学习教程

Apache Shiro 是一个功能强大且灵活的安全框架&#xff0c;主要用于身份认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和加密&#xff08;Cryptography&#xff09;。它旨在为…

Spring事件发布与监听

Spring事件机制详解&#xff1a;事件发布与监听 在Spring框架中&#xff0c;事件机制基于发布-订阅模式&#xff0c;允许组件之间进行解耦。发布者发布事件&#xff0c;监听者订阅并响应这些事件。Spring事件机制的核心在于ApplicationEvent和ApplicationListener&#xff0c;…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …

TypeScript语言的网络编程

TypeScript语言的网络编程 引言 在现代软件开发中&#xff0c;网络编程是一个不可或缺的部分。随着互联网的快速发展&#xff0c;网络应用程序越来越普遍&#xff0c;涉及到从简单的个人网站到复杂的企业级应用。TypeScript作为一种强类型的JavaScript超集&#xff0c;近年来…

在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库 Three.js&#xff1a;一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer&#xff1a;一个Vue插件&#xff0c;它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles&#xff1a;一个用于处理3D Tiles格式数据的Vue插件&#xff0c;可以用来…

Linux 高级路由 —— 筑梦之路

Linux 高级路由详解 本文将基于您提供的 Linux 高级路由极简教程 文章&#xff0c;深入探讨 Linux 高级路由的概念、配置方法以及应用场景。 一、什么是 Linux 高级路由&#xff1f; Linux 高级路由是指利用 Linux 内核提供的强大网络功能&#xff0c;实现超越传统路由表和默…

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…