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

news2024/9/25 7:20:37

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.com
            String serverIp = "app.cloopen.com";
            //请求端口
            String serverPort = "8883";
            //主账号,登陆云通讯网站后,可在控制台首页看到开发者主账号ACCOUNT SID和主账号令牌AUTH TOKEN
            String accountSId ="自己的";
            String accountToken = "自己的";
            //请使用管理控制台中已创建应用的APPID
            String 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 {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private 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短信
//            //需要生成的验证码保存到session
            session.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的Context
        Context 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;
    }
登录验证

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

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

相关文章

免驱触摸屏为啥在我的Linux上驱动不起来

背景&#xff1a; 某宝上买了个HDMI接口的触摸屏&#xff0c;用树莓派驱动没啥问题&#xff0c;但是用在我自己定制的Linux系统上&#xff0c;咋都不好使&#xff0c;咨询商家&#xff0c;商家说触摸屏的芯片是GT911&#xff0c;芯片是I2c协议&#xff0c;触摸屏上是usb接口的…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了&#xff0c;但是Fiddler官方还有很多其他扩展插件功能&#xff0c;可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c…

这9个UI设计工具一定码住!非常好用

对于设计师来说&#xff0c;好用的UI设计工具无疑会对设计工作起到事半功倍的作用&#xff0c;今天本文与大家分享9个好用的UI设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一个能在网页中直接使用&#xff0c;且支持团队协作的国产UI设计工具&#…

你的shell脚本存在安全问题吗?

更多技术资料&#xff0c;请关注微信公众号“运维之美” 信息安全对于线上环境显得尤为重要&#xff0c;shell脚本的代码中可能经常会引用到密码等变量进行赋值等场景&#xff0c;但是在使用的过程中可能会导致环境的登录信息泄露&#xff0c;导致安全隐患&#xff0c;那么如何…

ISO 7637-2 5a/5b抛负载测试保护用TVS二极管,如何选型号?

在国际标准ISO 16750-2颁布之前&#xff0c;全球各大汽车零部件制造商一直采用的是ISO 7637-2标准。ISO 16750-2国际标准发行之后&#xff0c;汽车抛负载浪涌测试中ISO 7637-2 5A和5B测试标准被ISO 16750-2测试标准取代。查看ISO 16750-2和ISO 7637-2国际标准文档资料对比会发现…

matlab编程实践16、17

捕食者与猎物模型 人口增长 在人口增长或衰减的最简单模型中&#xff0c;增长速度或衰减速度与人口本身的数目成正比。增加或减少人口规模会导致出生和死亡数量成比例地增加或减少。在数学上&#xff0c;可以由以下微分方程描述。 可以得出&#xff1a;&#xff0c;其中。 该简…

【mysql】Win10安装配置MySQL8.0简要

下载 MySQL官网下载安装包 安装

SpringBoot复习:(8)SpringBoot中是怎么判断应用类型是Servlet应用还是WebFlux应用?

在SpringApplication的构造方法里&#xff1a; 调用了WebApplicationType类的静态方法deduceFromClasspath, 该方法调用了ClassUtils类的isPresent方法来判断某个类是否能加载成功&#xff0c;首先判断&#xff0c;如果WebFlux相关的类能加载成功&#xff0c;就说明是WebFlux…

VGN N75pro说明书

VGN N75pro说明书 1、封面和最后一页 2、第01、02、03 3、第04 4、第05

可靠性工程师是做什么的?需要哪些能力?

一、可靠性工程师是做什么的&#xff1f; 官方解释&#xff0c;可靠性工程师是通过产品可靠性试验&#xff0c;进行性能评估&#xff0c;并预测如何改进产品或体系的安全性、可靠性、可维护性。 简单来说&#xff0c;客户在使用产品的过程中&#xff0c;会出现各种各样的质量…

【phaser微信抖音小游戏开发005】画布上添加图片

特别注意&#xff1a;真机模拟的时候&#xff0c;尽量使用网络图片资源&#xff0c;不要在小程序源文件里面使用图片&#xff0c;会出现真机加载不成功&#xff0c;小程序包体积过大的问题。我们学习过程中&#xff0c;只是作为演示使用。 推荐使用场景&#xff1a; 背景图片…

【硬件设计】模拟电子基础一--元器件介绍

模拟电子基础一--元器件介绍 一、半导体&#xff08;了解&#xff09;1.1 基础知识1.2 PN结 二、二级管2.1 定义与特性2.2 二极管的分类 三、三级管四、MOS管三、其他元器件管3.1 电容3.2 光耦3.3 发声器件3.4 继电器3.5 瞬态电压抑制器 前言&#xff1a;本章为知识的简单复习&…

安卓手机变身Linux服务器

文章目录 前言一、准备工作1、安卓手机2、下载软件二、开始安装1、检查系统,确认版本并安装2、配置(安卓7.0 及以上的用户忽略此步)3、问题处理【没有异常的小伙伴忽略】总结前言 在实际开发中有很多地方都需要服务器资源,但是服务器资源不论在哪里都是比较紧缺的资源,今…

hashedWheelTimer类

hashedWheelTimer类 目录概述需求&#xff1a; 设计思路实现思路分析1.hashedWheelTimer类 拓展实现 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait …

SQL-初识函数

select concat(宝,我好爱你呀); select lower(hadsjkfhJKHLH); select upper(hadsjkfhJKHLH); select LPAD(爱你,3,我); select rPAD(爱你,3,我); select trim( 吉林省雕刻技法 萨); select SUBSTRING(我曾经跨过山河大海,1,4); select lpad(1,5,00000);show create table …

MedSAM通用医学分割基础模型(2023+Segment Anything in Medical Images)

摘要&#xff1a; MedSAM&#xff0c;这是为通用医学图像分割设计的首个基础模型。利用包含超过一百万张图像的精心策划的数据集的力量&#xff0c;MedSAM不仅优于现有的最先进的分割基础模型&#xff0c;而且表现出与专业模型相当甚至更好的性能。此外&#xff0c;MedSAM能够…

GC基础知识

1.什么是垃圾 c语言申请内存 malloc 释放内存 free c&#xff1a; new delete java&#xff1a; new 自动内存回收 优点&#xff1a;编程上简单&#xff0c;手动释放内存&#xff0c;容易出两种类型的问题&#xff1a; 1.忘记回收 2多次回收 jvm的调优呢&#xff0c;主要就是…

修改conda环境缓存默认路径

前言&#xff1a;conda环境占用的内存太大了&#xff0c;每次建立一个新的虚拟环境都要加5个G差不多。所以想要修改默认的路径 问题1&#xff1a;找不到.condarc文件夹 创建condarc文件命令 conda config --add channels r 修改conda环境缓存默认路径 打开.condarc 添加 en…

Softmax函数个人解读

1 什么是Softmax? S o f t m a x s o f t m a x Softmaxsoft max Softmaxsoftmax&#xff0c;其中 m a x max max就是求最大值的意思&#xff0c;其核心是soft&#xff0c;在英文中soft有软的意思。与之相对应的hardmax&#xff0c;也就是说的在实际中经常求得最大值&#…

【并发专题】手写LinkedBlockingQueue

分析 LinkedBlockingQueue有如下特点&#xff1a; 近乎无界队列&#xff0c;但可以是有界队列实现了BlockingQueue接口需要实现take方法和put方法&#xff0c;实现阻塞效果数据结构是单链表&#xff0c;有head跟last指针来进行入队出队操作有两把锁&#xff0c;读写分离所以也…