SpringBoot实现 QQ邮箱验证码

发布于:2024-05-14 ⋅ 阅读:(188) ⋅ 点赞:(0)

SpringBoot实现 QQ邮箱验证码

一、开通SMTP校验码

1.登录qq邮箱

在这里插入图片描述

2.开启SMTP服务

在这里插入图片描述

3.发送手机短信

在这里插入图片描述

4.得到授权码

在这里插入图片描述

二、回到spring项目中

1.导入所需依赖

 <!--邮箱验证登录导入的依赖-->
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-email</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-core</artifactId>
        </dependency>

2.验证码工具类


/**
 * QQ邮箱
 * 随机生成验证码工具类
 */
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     * @param length 长度为4位或者6位
     * @return
     */
//    public static Integer generateValidateCode(int length){
//        Integer code =null;
//        if(length == 4){
//            code = new Random().nextInt(9999);//生成随机数,最大为9999
//            if(code < 1000){
//                code = code + 1000;//保证随机数为4位数字
//            }
//        }else if(length == 6){
//            code = new Random().nextInt(999999);//生成随机数,最大为999999
//            if(code < 100000){
//                code = code + 100000;//保证随机数为6位数字
//            }
//        }else{
//            throw new RuntimeException("只能生成4位或6位数字验证码");
//        }
//        return code;
//    }

    /**
     * 随机生成大小写字母和数字的验证码
     * @return 6位随机验证码
     */
    public static String generateValidateCode(int length) {
        String code = "";
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            int type = random.nextInt(3);//随机生成数字、大写字母、小写字母
            switch (type) {
                case 0:
                    code += (char) (random.nextInt(10) + '0');//数字
                    break;
                case 1:
                    code += (char) (random.nextInt(26) + 'A');//大写字母
                    break;
                case 2:
                    code += (char) (random.nextInt(26) + 'a');//小写字母
                    break;
            }
        }
        return code;
    }
    /**
     * 随机生成指定长度字符串验证码
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

/**
 * 邮箱对应发送信息
 */
public class EmailUtil {
    /**
     * @param email 发送的邮箱,就是登录时你填的邮箱
     * @param authCode 填写第一个工具类的随机生成的验证码
     */
    public static void sendAuthCodeEmail(String email, String authCode) {
        try {
            SimpleEmail mail = new SimpleEmail();
            mail.setHostName("smtp.qq.com");//发送邮件的服务器,这个是qq邮箱的,不用修改
            mail.setAuthentication("xxx@qq.com", "xxx");//第一个参数一般是自己的邮箱第二个参数就是SMTP的授权码,我们上面获取过了
            mail.setFrom("xxx@qq.com","xxx");  //读一个参数是发送邮件的邮箱,第二个是发件人姓名
            mail.setSSLOnConnect(true); //使用安全链接
            mail.addTo(email);//接收的邮箱
            mail.setSubject("xxx验证码");//设置邮件的主题
            mail.setMsg("尊敬的用户您好,\n\n感谢您选择我们的服务!您的登录验证码为:"+"["+authCode+"]"+",请妥善保管。请注意,该验证码仅在三分钟内有效,请尽快使用。\n\n若有任何疑问,请随时联系我们。祝您生活愉快");//设置邮件的内容
            mail.send();//发送
        } catch (EmailException e) {
            e.printStackTrace();
        }
    }
}

3.具体实现逻辑(serviceimpl)

 	 /**
     * qq邮箱验证码
     * @param msg
     * @return
     */
	@Override
    public ResponseResult sendEmail(String msg) {
		//校验msg是否为空
        if(StringUtils.isNotEmpty(msg)){
            //不为空则生成随机验证码
            String code = ValidateCodeUtils.generateValidateCode(6).toString();//生成长度为6的验证码
            logger.info("验证码code:" + code);
            //调用直接封装的qq邮箱发送邮箱
            EmailUtil.sendAuthCodeEmail(msg,code);
            //把code存放到redis中3分钟
            redisTemplate.opsForValue().set(msg , code,3, TimeUnit.MINUTES);//键 值 时间 单位
            return new ResponseResult(200,"发送成功",code);
        }

        return new ResponseResult(410,"发送失败",null);
    }

三、测试qq邮箱验证码

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到