当前位置: 首页 > news >正文

java集成短信服务 测试版 qq邮箱简单思路

java集成短信服务

注册一个帐号

使用的是容联云,百度搜一下官网

用手机注册一个帐号就行,免费体验不需要认证
注册后会有八块钱送,可以使用免费的给自己设置三个固定手机号发送短信,不需要认证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2UjPY6t-1690897179638)(E:\personboke\blog\source_posts\java集成短信服务\image-20230801213129678.png)]

此页面的 三个信息需要在代码中去进行填写认证

主账户

账户授权令牌

访问的Rest URl

APP id

绑定用于接收短信的手机号

控制台—管理—号码管理—测试号码"绑定 测试号码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2UjPY6t-1690897179638)(E:\personboke\blog\source_posts\java集成短信服务\image-20230801213129678.png)]

添加maven依赖

jdk要使用8以上

<dependency><groupId>com.cloopen</groupId><artifactId>java-sms-sdk</artifactId><version>1.0.3</version>
</dependency>

测试代码

我们需要把以上四个信息填入,还有接收短信的手机号码验证码需要自己手动生成,(这里使用四位随机整数),然后将这些信息传到短信服务平台帮我们发送。

@Component
public class SendMessage {public static String message(String phone){//返回产生的验证码String code= null;//生产环境请求地址:app.cloopen.comString serverIp = "app.cloopen.com";//请求端口String serverPort = "8883";//主账号,登陆云通讯网站后,可在控制台首页看到开发者主账号ACCOUNT SID和主账号令牌AUTH TOKENString accountSId ="自己的";String accountToken = "自己的";//请使用管理控制台中已创建应用的APPIDString appId = "自己的";CCPRestSmsSDK sdk = new CCPRestSmsSDK();sdk.init(serverIp, serverPort);sdk.setAccount(accountSId, accountToken);sdk.setAppId(appId);sdk.setBodyType(BodyType.Type_JSON);//手机号码String to = phone;String templateId= "1";//使用的模板id//生成四位随机数int random=(int)(Math.random()*10000);code = String.valueOf(random);String[] datas = {code,"2"};//格式:你的验证码是{code},请于{2}分钟内正确输入//HashMap<String, Object> result = sdk.sendTemplateSMS(to,templateId,datas);HashMap<String, Object> result = sdk.sendTemplateSMS(to,templateId,datas);if("000000".equals(result.get("statusCode"))){//正常返回输出data包体信息(map)HashMap<String,Object> data = (HashMap<String, Object>) result.get("data");Set<String> keySet = data.keySet();for(String key:keySet){Object object = data.get(key);System.out.println(key +" = "+object);}}else{//异常返回输出错误码和错误信息System.out.println("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));}return code;}
}

调用方法一并附上防止有看不懂的

package com.atheima.reggie.controller;import com.atheima.reggie.Utils.SendMessageUtils;
import com.atheima.reggie.Utils.ValidateCodeUtils;
import com.atheima.reggie.common.R;
import com.atheima.reggie.common.SendMessage;
import com.atheima.reggie.entity.User;
import com.atheima.reggie.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.TimeoutUtils;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate SendMessage sendMessage;@PostMapping("/sendMsg")public R<String> sendMessage(@RequestBody User user, HttpSession session){String phone=user.getPhone();//获取手机号
//        if (StringUtils.isNotEmpty(phone)){
//            //生成随机的四位验证码
//            Integer integer = ValidateCodeUtils.generateValidateCode(4);
//            String code = integer.toString();SendMessageUtils.message(phone);
//            //调用api短信
//            //需要生成的验证码保存到sessionsession.setAttribute(phone,code);
//            //将生成的验证码缓存到redis中并且设置有效期5分钟
//            redisTemplate.opsForValue().set(phone,code,5,TimeUnit.MINUTES);
//            log.info("Sent message"+code);
//        SendMessage()String code=sendMessage.message(phone);if (StringUtils.isNotEmpty(code)){session.setAttribute(phone,code);//将生成的验证码缓存到redis中并且设置有效期5分钟redisTemplate.opsForValue().set(phone,code,5,TimeUnit.MINUTES);log.info("Sent message"+code);return R.success("验证码登录成功");}return R.success("验证码登录失败");}@PostMapping("/login")public R<User> login(@RequestBody Map map,HttpSession session){log.info(map.toString());String phone = map.get("phone").toString();String code = map.get("code").toString();//从cookie中
//        String phonecodeinsessoin =(String) session.getAttribute(phone);//从Redis中获取缓存验证码String phonecodeinsessoin=(String) redisTemplate.opsForValue().get(phone);if (phonecodeinsessoin!=null&&phonecodeinsessoin.equals(code)){LambdaQueryWrapper<User> lambdaQueryWrapper=new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User::getPhone,phone);User user = userService.getOne(lambdaQueryWrapper);if (user==null){user=new User();user.setPhone(phone);user.setStatus(1);userService.save(user);}session.setAttribute("user",user.getId());//如果用户登陆成功则删除缓存验证码redisTemplate.delete(phone);return R.success(user);}return R.error("登陆失败");}@PostMapping("/loginout")public R<String> loginout(@RequestBody Map map,HttpSession session){session.removeAttribute("user");return R.success("退出成功");}
}

示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29o1C7li-1690897334327)(E:\personboke\blog\source_posts\java集成短信服务\image-20230801213715539.png)]

Springboot集成qq邮箱

自己以前做过就不多赘述
以下文章来自博客
https://blog.csdn.net/sdrfghb/article/details/126845550?
提示:以下是本篇文章正文内容,下面案例可供参考

邮箱设置
这边主要展示qq邮箱设置,网易或别的邮箱请自行百度设置

qq邮箱地址
打开账号POP3/SMTP服务

注意保存授权码

添加依赖,为了让验证码页面好看点,咱们可以使用thymeleaf

org.springframework.boot spring-boot-starter-mail org.springframework.boot spring-boot-starter-thymeleaf

yaml 配置
spring:
mail:
# 邮箱服务器地址
host: smtp.qq.com
# 账号
username: qq号
# 密码
password: 上面qq邮箱的授权码
# 编码格式
default-encoding: UTF-8
# 超时时间
properties:
mail:
smtp:
auth: true
enable: true
connectiontimeout: 10000
timeout: 10000
writetimeout: 10000
# 配置SSL 加密工厂
socketFactoryClass: javax.net.ssl.SSLSocketFactory
# 表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
debug: true

封装工具类
/**
* description: 使用thymeleaf模板发送邮件
*
* @param subject 主题
* @param map Thymeleaf html模板参数
* @param htmlName 模板名称
* @param addressee 收件人
* @return boolean
* @author Tigger
*/
public boolean sendThymeleafMail(String subject, Map<String, Object> map, String htmlName, String… addressee) {
boolean flag = false;
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = null;
mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
// 邮件发送者
mimeMessageHelper.setFrom(from);
// 邮件接受者
mimeMessageHelper.setTo(addressee);
// 主题
mimeMessageHelper.setSubject(subject);

        // 这里引入的是Template的ContextContext context = new Context();// 设置模板中的变量context.setVariables(map);// 第一个参数为模板的名称String process = templateEngine.process(htmlName, context);// 第二个参数true表示这是一个html文本mimeMessageHelper.setText(process,true);javaMailSender.send(mimeMessage);flag = true;}catch (MessagingException e) {e.printStackTrace();}return flag;
}

使用,这边使用了lombok和redis,需要的自己引下依赖,不需要的自行删除。
/**

  • description: 生成指定位数短信验证码
  • @param count 指定位数
  • @return java.lang.String
  • @author Tigger
    */
    private String getRandCode(int count) {
    return String.valueOf((int)((Math.random()9+1) Math.pow(10,count-1)));
    }

/**

  • description: 发送邮箱验证码
  • @param mailNumber 发送邮箱账号
  • @return java.lang.String
  • @author Tigger
    */
    public String sendCodeMailInfo(String mailNumber) {
    String sendMessage = null;
    String randCode = getRandCode(6);
    log.info(“邮箱验证码-{}”, randCode);
    Map<String, Object> stringObjectMap = new HashMap<>(1);
    stringObjectMap.put(“codeMessage”, randCode);
    boolean mail = mailUtil.sendThymeleafMail(“验证码”, stringObjectMap, “mailAssign.html”, mailNumber);
    if (mail) {
    log.info(“邮箱验证码发送成功”);
    // 将验证码放入redis
    boolean set = redisUtil.set(mailNumber + FinalCode.REDIS_Mail_SMS, randCode, FinalCode.SECOND_NUMBER);
    if (set) {
    log.info(“短信验证码缓存成功”);
    }
    sendMessage = “邮箱验证码发送成功”;
    }
    return sendMessage;
    }
登录验证

相关文章:

java集成短信服务 测试版 qq邮箱简单思路

java集成短信服务 注册一个帐号 使用的是容联云&#xff0c;百度搜一下官网 用手机注册一个帐号就行&#xff0c;免费体验不需要认证 注册后会有八块钱送&#xff0c;可以使用免费的给自己设置三个固定手机号发送短信&#xff0c;不需要认证。 此页面的 三个信息需要在代码中…...

#P0994. [NOIP2004普及组] 花生采摘

题目描述 鲁宾逊先生有一只宠物猴&#xff0c;名叫多多。这天&#xff0c;他们两个正沿着乡间小路散步&#xff0c;突然发现路边的告示牌上贴着一张小小的纸条&#xff1a;“欢迎免费品尝我种的花生&#xff01;――熊字”。 鲁宾逊先生和多多都很开心&#xff0c;因为花生正…...

Elasticsearch和Kibana的安装及验证

金翅大鹏盖世英&#xff0c;展翅金鹏盖世雄。 穿云燕子锡今鸽&#xff0c;踏雪无痕花云平。 ---------------- 2023.7.31.101 ----------------- 本文密钥&#xff1a;365 Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎&#xff0c;常用来进行全文检索、…...

细讲TCP三次握手四次挥手(一)

计算机网络体系结构 在计算机网络的基本概念中&#xff0c;分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多&#xff0c;在学习时要多思考。这些概念对后面的学习很有帮助。 网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必…...

【linux-zabbix】zabbix-agent启动报错:Daemon never wrote its PID file. Failing.

背景&#xff1a; 发现有部分的agent失联&#xff0c;排查发现机器正常&#xff0c;agent没起来。 排查日志发现&#xff1a; # journalctl -xe -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit zabbix-agent.service has begun start…...

【微信小程序】初始化 wxCharts,调用updateData动态更新数据

要初始化 wxCharts&#xff0c;你需要按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保已将 wx-charts.js 文件正确引入到小程序的相应页面或组件中。可以通过以下方式引入&#xff1a; const wxCharts require(../../../../components/wx-charts.js);请根据你的项目…...

【C语言初阶(19)】实用的 VS 调试技巧

文章目录 Ⅰ 调试的介绍Ⅱ 常用调试快捷键Ⅲ 调试的时候查看程序当前信息⒈查看临时变量的值⒉查看内存信息⒊查看调用堆栈⒋查看汇编信息⒌查看寄存器信息 Ⅳ 观察形参指针指向的数组Ⅴ 易于调试的代码该如何编写⒈const 修饰指针变量⒉良好代码示范 Ⅵ 编程中常见的错误 Ⅰ 调…...

虚拟机之间配置免密登录

目录 一、配置主机名映射 二、虚拟机配置SSH免密登录 三、验证 一、配置主机名映射 即修改/etc/hosts文件&#xff0c;将几台服务器和主机名进行映射。 注意每台服务器都要进行同样的配置。这样在各自服务器下&#xff0c;我们就可以通过主机名访问对应的ip地址了。 当然&…...

【contenteditable属性将元素改为可编辑状态】

元素添加contenteditable属性之后点击即可进入编辑状态 像这种只修改一条属性不必再打开弹框进行编辑&#xff0c;使用contenteditable会很方便 添加失焦、回车、获焦事件 如 <p :contenteditable"item.contenteditable || false"keydown.enter"key($event…...

Android 第三方库CalendarView

Android 第三方库CalendarView 根据需求和库的使用方式&#xff0c;自己弄了一个合适自己的日历&#xff0c;仅记录下&#xff0c;方便下次弄其他样式的日历。地址 需求&#xff1a; 只显示当月的数据 默认的月视图有矩形的线 选中的天数也要有选中的矩形框 今天的item需要…...

钉钉群消息推送

1. 添加钉钉群机器人 PC端登录&#xff08;当前版本手机端无法进行推送关键词设置&#xff09;&#xff0c;群设置--> 机器人 --> webhook进行安全设置复制webhook对应的url 2. 群消息推送 钉钉群消息支持纯文本和markdown类型 2.1 调用示例源码 import com.alibaba.…...

css clip-path 属性介绍

circle() – 圆 语法&#xff1a;circle( [<shape-radius>]? [at <position>]? ) shape-radius 圆的半径 position 圆的中心点位置 使用方法&#xff1a; clip-path: circle(); // 以元素的中心点为圆的中心点&#xff0c;最小宽度一半为圆的半径。clip-path: c…...

Python之pyinstaller打包exe填坑总结

一、起因 编写了一个提取图片中文字的python脚本&#xff0c;想传给同事使用&#xff0c;但是同事电脑上没有任何python环境&#xff0c;更没有安装python库&#xff0c;因此想到通过pyinstaller打包成exe程序传给同事使用&#xff0c;于是开始了不断地挖坑填坑之旅 import p…...

Form Generator 表单JSON数据储存以及JSON回显表单

一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…...

Python - OpenCV识别条形码、二维码(已封装,拿来即用)

此代码可识别条形码和二维码&#xff0c;已封装好&#xff0c;拿来即用&#xff1a; import cv2 import pyzbar.pyzbar as pyzbar import numpy from PIL import Image, ImageDraw, ImageFontclass CodeScan():def __init__(self):super(CodeScan, self).__init__()def decode…...

Python如何快速实现爬取网页?

首先我们对要编写的爬虫程序进行简单地分析&#xff0c;该程序可分为以下三个部分&#xff1a; 拼接 url 地址发送请求将照片保存至本地 明确逻辑后&#xff0c;我们就可以正式编写爬虫程序了。 导入所需模块 本节内容使用 urllib 库来编写爬虫&#xff0c;下面导入程序所用…...

怎么才能远程控制笔记本电脑?

为什么选择AnyViewer远程控制软件&#xff1f; 为什么AnyViewer是远程控制笔记本电脑软件的首选&#xff1f;以下是选择AnyViewer成为笔记本电脑远程控制软件的主要因素。 跨平台能力 AnyViewer作为一款跨平台远程控制软件&#xff0c;不仅可以用于从一台Windows电…...

【3】C++实现多进程、多线程

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、同步与互斥1、【thread】同步并发的方法(1)创建、终止、等待、分离线程的方法1.创建线程形式1:使用一个循环执行的函数创建一个线程形式2:…...

Linux用户权限信息、chmod以及chown命令

权限修改 权限信息chmod命令chown命令 权限信息 在Linux系统中&#xff0c;每个文件和目录都包含了权限信息&#xff0c;用于控制对其的访问权限。 文件权限&#xff1a;Linux系统中的文件权限由三组权限表示&#xff0c;分别是所有者权限、组权限和其他用户权限。 所有者权…...

利用vscode--sftp,将本地项目/文件上传到远程服务器中详细教程

1、首先在 vscode 中下载 sftp&#xff1a; 2、然后在 vscode 中打开本地将要上传的项目或文件&#xff1a; 3、安装完后&#xff0c;使用快捷键 ctrlshiftP 打开指令窗口&#xff0c;输入 sftp:config &#xff0c;回车&#xff0c;在当前目录中会自动生成 .vscode 文件夹及 s…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...