Spring 项目实现 JavaMail 发送邮件验证码 并 验证

前言:在 Spring 官网中的 framework 模块中有 Mail 的说明文档,可以看一下。传送门
第一步:添加 jar 依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

第二步:在 application.yml 文件中添加 mail 属性配置

 spring:
  mail:
    host: smtp.163.com			#邮箱服务主机(稍后说明)
    password: HHUBZCSCNITVEVOO	#你的邮箱授权码(稍后说明)
    username: luce@163.com		#你的邮箱(用于发送)
    default-encoding: UTF-8		#预防中文乱码
    properties:
      mail:
        smtp:
          auth: true			#开启安全验证
          starttls:
            enable: true		#加密通讯
            required: true		#是否必须通过使用加密通讯进行通讯

### 额外的一些配置
sms:
  server:
    sms-valid-time-interval: 300	#过期时间 /秒
    length: 6						#验证码长度
    message: 您的验证码【%s】,验证码%s分钟内有效请及时使用。

邮箱服务主机:每个邮箱服务商都会有服务主机,QQ邮箱的发件主机是 smtp.qq.com 网易163邮箱的发件主机是 smtp.163.com
授权码:将你的邮箱进行第三方客户端发送件授权,具体操作如下图
在这里插入图片描述
在这里插入图片描述

第三步:创建实例

//这是我用来验证码工具类
import com.demo.config.base.code.RandomCode;	
//这是获取上面额外配置信息的工具bean
import com.demo.config.base.code.SmsServicesSettings;	

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.TimeUnit;

@Service
public class CodeService {
    private Logger logger = LoggerFactory.getLogger(CodeService.class);

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private SmsServicesSettings smsServicesSettings;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 发送邮箱验证码
     * @param emailAddress 收件人邮箱
     * @author luce
     * @date 2021/8/4 13:30
     */
    public void sendMailCode(String emailAddress) {
        String code = RandomCode.createSmsCode(smsServicesSettings.getLength());
        long smsValidTimeInterval = smsServicesSettings.getSmsValidTimeInterval();
        String text = String.format(smsServicesSettings.getMessage(), code, smsValidTimeInterval / 60);

        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message);
        try {
            //发件人
            helper.setFrom(new InternetAddress("luce@163.com", "通知"));
            //收件人邮箱
            helper.setTo(emailAddress);
            //邮件主题
            helper.setSubject("用户注册验证码");
            //内容
            helper.setText(text);
            //发送
            mailSender.send(message);
            //将验证码存入redis中 
            stringRedisTemplate.opsForValue().set(emailAddress, code, smsValidTimeInterval, TimeUnit.SECONDS);
            logger.info("验证邮件发送成功。");
        } catch (MessagingException | UnsupportedEncodingException ex) {
            logger.error("验证邮件发送时发生了意外: " + ex.getMessage());
        }
    }
    
    /**
     * 验证安全码
     * @author luce
     * @date 2021/8/6 17:24
     * @param emailAddress
     * @param code
     * @return boolean
     */
    public boolean verify(@RequestParam String emailAddress, @RequestParam String code) {
        String s = stringRedisTemplate.opsForValue().get(emailAddress);
        return code.equals(stringRedisTemplate.opsForValue().get(emailAddress));
    }
}

工具类 RandomCode

/**
  * @author luce
  * @date 2021年08月06日 14:18
  */
public class RandomCode {

   /**
     * 随机短信验证码
     * @param length int
     * @return String
     */
   public static String createSmsCode(int length) {
       Random random = new Random();
       StringBuilder builder = new StringBuilder();
       IntStream.range(0, length).forEach(i -> builder.append(random.nextInt(10)));
       return builder.toString();
   }
}

工具类 SmsServicesSettings

/**
  * 读取 xml 中的额外配置
  * @author luce
  * @date 2021年08月06日 14:43
  */
@Component
@ConfigurationProperties(prefix = "sms.server")
public class SmsServicesSettings {

   private long smsValidTimeInterval;		//用来设置redis中验证码的过期时间 
   private int length;						//设置验证码长度
   private String message;					//邮件的内容文本

   public long getSmsValidTimeInterval() {
       return smsValidTimeInterval;
   }

   public void setSmsValidTimeInterval(long smsValidTimeInterval) {
       this.smsValidTimeInterval = smsValidTimeInterval;
   }

   public int getLength() {
       return length;
   }

   public void setLength(int length) {
       this.length = length;
   }

   public String getMessage() {
       return message;
   }

   public void setMessage(String message) {
       this.message = message;
   }
}   

第四步:添加Controller API 调用测试,Controller 层的代码借鉴一下就行,直接 copy 用不了

/**
 * @author luce
 * @date 2021年08月06日 16:11
 */
@Api(tags = "验证码管理")
@RestController
public class CodeController {

    @Autowired
    private CodeService service;


    /**
     * 发送邮箱验证码
     *
     * @param emailAddress 收件人邮箱
     * @return com.hb56.common.result.RestInfo<?>
     * @author luce
     * @date 2021/8/6 16:08
     */
    @ApiOperation(value = "发送邮箱验证码")
    @GetMapping(path = "/mail/securitycode")
    public RestInfo<?> sendMailSecurityCode(@RequestParam String emailAddress) {
        service.sendMailCode(emailAddress);
        return RestUtil.setSuccessMsg("发送成功", null);
    }

    /**
     * 验证邮箱安全码
     *
     * @param emailAddress 收件人邮箱
     * @param code         验证码
     * @return boolean
     * @author luce
     * @date 2021/8/6 16:09
     */
    @ApiOperation(value = "验证邮箱安全码", notes = "返回boolean类型")
    @PostMapping("/mail/securitycode")
    public RestInfo<?> verify(@RequestParam String emailAddress, @RequestParam String code) {
        String s = service.verify(emailAddress, code) ? "验证成功" : "验证失败";
        return RestUtil.setSuccessMsg(s, null);
    }
}

在这里插入图片描述

有关spring项目中如何引入Redis可以看另一篇博文:简单易懂的 Spring 项目引入 Redis 示例

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 该项目骨架集成了以下技术: - SpringBoot多环境配置 - SpringMVC - Spring - MyBaits - MyBatis Generator - MyBatis PageHelper - Druid - Lombok - JWT - Spring Security - JavaMail - Thymeleaf - HttpClient - FileUpload - Spring Scheduler - Hibernate Validator - Redis Cluster - MySQL主从复制,读写分离 - Spring Async - Spring Cache - Swagger - Spring Test - MockMvc - HTTPS - Spring DevTools - Spring Actuator - Logback+Slf4j多环境日志 - i18n - Maven Multi-Module - WebSocket - ElasticSearch # 功能们: ## 用户模块 - 获取图片验证码 - 登录:解决重复登录问题 - 注册 - 分页查询用户信息 - 修改用户信息 ## 站内信模块 - 一对一发送站内信 - 管理员广播 - 读取站内信(未读和已读) - 一对多发送站内信 ## 文件模块 - 文件上传 - 文件下载 ## 邮件模块 - 单独发送邮件 - 群发邮件 - Thymeleaf邮件模板 ## 安全模块 - 注解形式的权限校验 - 拦截器 ## 文章管理模块 - 增改删查 # 整合注意点 1. 每个Mapper上都要加@Mapper 2. yaml文件 @Value获取xx.xx.xx不可行,必须使用@ConfigurationProperties,指定prefix,属性设置setter和getter 3. logback日志重复打印:自定义logger上加上 ` additivity="false" ` 4. SpringBoot 项目没有项目名 5. 登录 Spring Security +JWT - 已登录用户验证token - 主要是在Filter中操作。 从requestHeader中取得token,检查token的合法性,检查这一步可以解析出username去查数据库; 也可以查询缓存,如果缓存中有该token,那么就没有问题,可以放行。 - 未登录用户进行登录 - 登录时要构造UsernamePasswordAuthenticationToken,用户名和密码来自于参数,然后调用AuthenticationManager的authenticate方法, 它会去调用UserDetailsService的loadFromUsername,参数是token的username,然后比对password,检查userDetails的一些状态。 如果一切正常,那么会返回Authentication。返回的Authentication的用户名和密码是正确的用户名和密码,并且还放入了之前查询出的Roles。 调用getAuthentication然后调用getPrinciple可以得到之前听过UserDetailsService查询出的UserDetails - 在Controller中使用@PreAuthorize等注解需要在spring-web配置文件中扫描security包下的类 6. 引用application.properties中的属性的方式:@ConfigurationProperties(prefix = "spring.mail") + @Component + setter + getter 7. 引用其他自定义配置文件中的属性的方式: - @Component - ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
要在Spring Boot中集成邮箱验证码功能,你可以按照以下步骤进行操作: 1. 在项目的pom.xml文件中添加mail模块的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 这样就可以使用Spring Boot提供的邮件功能了。\[1\] 2. 在配置文件(application.properties或application.yml)中填写相关的邮箱配置,例如使用163邮箱: ```properties # Mail spring.mail.host=smtp.163.com spring[email protected] spring.mail.password=your-password spring.mail.default-encoding=UTF-8 [email protected] ``` 其中,`spring.mail.host`是SMTP服务器地址,`spring.mail.username`和`mail.from`是你的邮箱地址,`spring.mail.password`是你的邮箱授权码(不是邮箱密码)。你需要在相关邮箱设置中开启SMTP服务,并获取授权码。\[2\]\[3\] 3. 在你的代码中使用JavaMailSender发送邮件,可以通过注入`JavaMailSender`对象来实现: ```java @Autowired private JavaMailSender javaMailSender; public void sendVerificationCode(String email, String code) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(email); message.setSubject("验证码"); message.setText("您的验证码是:" + code); javaMailSender.send(message); } ``` 以上代码示例中,`sendVerificationCode`方法用于发送验证码邮件,其中`email`是收件人邮箱地址,`code`是验证码内容。你可以根据实际需求自定义邮件的主题和内容。 这样,你就可以在Spring Boot中集成邮箱验证码功能了。记得替换相关配置为你自己的邮箱信息。 #### 引用[.reference_title] - *1* *2* *3* [Spring Boot 整合163或者qq邮箱发送验证码](https://blog.csdn.net/hghjgkjn/article/details/125952509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值