• SpringBoot整合QQ邮箱发送验证码


    1.项目介绍

    基于SpringBoot + QQ邮箱服务 + Hutools实现的获取验证码功能,接下来从如何申请授权码,如何配置项目,如何启动项目,如何测试项目进行讲解,下面的图片是一个测试案例,使用postman进行测试,在测试上填写发送人的邮箱,即可收到验证码邮箱

    img

    2.使用前提

    1.从仓库拉取代码

    2.需要申请邮箱的授权码,然后在application.yml下进行配置

    3.邮箱授权码申请

    1.开启POP3/SMTP服务

    image-20230925173427366

    点击设置,进入下面的页面,然后再点击账号

    image-20230925173455186

    往下滑,找到下面的服务,点击申请授权码,按照提示一步步完成

    image-20230925173604188

    2.复制授权码

    image-20230925173914347

    4.项目使用说明

    1.可以自己手写代码,也可以从我的仓库直接拉取代码

    2.配置application配置文件,修改username改为自己的邮箱,password改为邮箱授权码,详细介绍查看代码说明下的配置文件

    3.启动项目SendemailcodeApplication

    4.使用postman进行测试

    1.拉取仓库代码:

    git clone https://gitee.com/tzmoxi/use-email-getcode.git
    
    • 1

    2.修改配置文件

    修改application.yml下的配置文件,修改成为自己的邮箱和授权码

    image-20230925232720765

    3.修改完成上面的内容,就直接启动项目

    image-20230925232831791

    4.使用postman测试

    首先是get请求,填写请求地址localhost:8080/user/getCode,传递的参数为tos值为接收方邮箱,点击发送即可收到

    image-20230925233457586

    点击发送,成功后,邮箱会收到一个验证码

    image-20230925233647622

    5.代码说明

    1.创建一个SpringBoot工程

    2.引入邮件相关依赖

    注意:springboot相关的依赖给去掉了,在创建工程的时候会自动引入

    <dependencies>
            
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>1.18.24version>
                <scope>providedscope>
            dependency>
    
    
            <dependency>
                <groupId>cn.hutoolgroupId>
                <artifactId>hutool-allartifactId>
                <version>5.8.16version>
            dependency>
    
    
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-mailartifactId>
            dependency>
    
            
            <dependency>
                <groupId>org.apache.commonsgroupId>
                <artifactId>commons-lang3artifactId>
                <version>3.12.0version>
            dependency>
    
            <dependency>
                <groupId>com.mysqlgroupId>
                <artifactId>mysql-connector-jartifactId>
                <scope>runtimescope>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    3.配置application.yml文件

    username和password需要使用自己的

    username事自己的qq邮箱

    password是刚昂申请的邮箱授权码

    Spring:
      # 邮箱基本配置
      mail:
        host: smtp.qq.com
        # 填写自己的邮箱
        username: 111111111111@qq.com
        # 在邮箱内填写自己申请的授权码
        password: aaaaaaaaaaaa
        # 端口号
        port: 587
        # 默认的邮件编码为UTF-8
        default-encoding: UTF-8
        # 其他参数
        properties:
          mail:
            # 配置SSL 加密工厂
            smtp:
              ssl:
                # 本地测试, 先放开ssl
                enable: false
                required: false
              #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
            debug: false
    server:
      port: 8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4.定义实体类

    @Data
    @AllArgsConstructor
    public class ToEmail implements Serializable {
    
       //邮件接受方
    
        private String tos;
    
       //邮件主题
    
        private String subject;
    
    
       //邮件内容
    
        private String content;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5.邮件服务也是核心

    public class MailService {
        /**
         * 注入邮件工具类
         */
        @Resource
        private JavaMailSenderImpl javaMailSender;
    
        @Value("${spring.mail.username}")
        private String sendMailer;
    
        /**
         * 检测邮件信息类
         * @param receiveEmail 接收者
         * @param subject  主题
         * @param emailMsg 内容
         */
        private void checkMail(String receiveEmail, String subject, String emailMsg){
            //  StringUtils 需要引入  commons-lang3 依赖
            //  可以用 receiveEmail == null || receiveEmail.isEmpty() 来代替
            if(StringUtils.isEmpty(receiveEmail)) {
                throw new RuntimeException("邮件收件人不能为空");
            }
            if(StringUtils.isEmpty(subject)) {
                throw new RuntimeException("邮件主题不能为空");
            }
            if(StringUtils.isEmpty(emailMsg)) {
                throw new RuntimeException("邮件内容不能为空");
            }
        }
        
        /**
         * 发送纯文本邮件
         * @param receiveEmail 接收者
         * @param subject  主题
         * @param emailMsg 内容
         */
        public Boolean sendTextMail(String receiveEmail, String subject, String emailMsg) {
            // 参数检查
            checkMail(receiveEmail, subject, emailMsg);
            try {
                // true 代表支持复杂的类型
                MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);
                // 邮件发件人
                mimeMessageHelper.setFrom(sendMailer);
                // 邮件收件人
                mimeMessageHelper.setTo(receiveEmail.split(","));
                // 邮件主题
                mimeMessageHelper.setSubject(subject);
                // 邮件内容
                mimeMessageHelper.setText(emailMsg);
                // 邮件发送时间
                mimeMessageHelper.setSentDate(new Date());
        
                // 发送邮件
                javaMailSender.send(mimeMessageHelper.getMimeMessage());
                System.out.println("发送邮件成功: " + sendMailer + "-->" + receiveEmail);
                return true;
            } catch (MessagingException e) {
                e.printStackTrace();
                System.out.println("发送邮件失败: " + e.getMessage());
                return false;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    6.编写控制层

    @RestController
    @RequestMapping("/user")
    public class EmailController {
    
        @Resource
        private MailService mailService;
    
        @RequestMapping("/getCode")
        public R sendEmail(ToEmail toEmail, HttpServletRequest request) {
            if(toEmail == null || toEmail.getTos() == null ) {
                return R.error( "参数错误!");
            }
            toEmail.setSubject("你本次的验证码是");
            // 使用hutools工具获取验证码
            CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
            String verCode = captcha.getCode();
            String content = "尊敬的xxx,您好:\n"
                    + "\n本次请求的邮件验证码为:" + verCode + ",本验证码 5 分钟内效,请及时输入。(请勿泄露此验证码)\n"
                    + "\n如非本人操作,请忽略该邮件。\n(这是一封通过自动发送的邮件,请不要直接回复)";
            toEmail.setContent(content);
    
            Boolean check = mailService.sendTextMail(toEmail.getTos(), toEmail.getSubject(), toEmail.getContent());
            if(check) {
                return R.success("发送成功");
            } else {
                return R.error( "发送失败");
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    6.Git仓库地址

    基于SpringBoot实现邮箱发送验证码仓库地址

    更多内容查看:
    在这里插入图片描述

  • 相关阅读:
    嵌入式linux总线设备驱动模型分析
    设计模式之组合模式
    【计算机视觉(CV)】基于全连接网络实现宝石分类
    白盒测试之测试用例设计方法
    LeetCode902最大为 N 的数字组合(相关话题:数位DP问题,递归遍历和减枝)
    机器学习10-信念贝叶斯分类器
    Agisoft Metashape相机标定笔记
    朗强:高清视频HDMI延长器的特点
    燕之屋通过港交所聆讯:苦战IPO十余年,黄健等人提前精准套现
    JAVA该怎么学习,到公司会学的一样吗
  • 原文地址:https://blog.csdn.net/qq_52699757/article/details/133284366