文章目錄
- 依賴配置
- 開啟 QQ 郵箱 SMTP 服務
- 配置文件
- 代碼實現
- 驗證碼服務
- 郵件服務
- 接口實現
- 執行流程
依賴配置
<dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Redis 集成依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>6.3.2.RELEASE</version> </dependency><!-- 郵件發送支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!-- 驗證碼生成工具 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
</dependencies>
開啟 QQ 郵箱 SMTP 服務
- 打開瀏覽器,登錄到 QQ 郵箱。
- 點擊左上角的齒輪按鈕,進入設置頁面,見下圖:
4. 在設置中找到“第三方服務”,激活 IMAP/SMTP(默認為禁用),并生成獨立的 SMTP 授權碼。
配置文件
spring: data: redis: host: your_redis_hostport: your_redis_port # 通常為6379password: your_redis_passwordlettuce: pool: max-active: 8 # 最大連接數 max-idle: 8 # 最大空閑連接數 min-idle: 0 # 最小空閑連接數 max-wait: 100 # 連接等待時間 mail: host: smtp.qq.com port: 465 username: your_qq_account@qq.compassword: 111 # 輸入 QQ 郵箱的授權碼properties: mail: smtp: ssl: enable: true # QQ 郵箱需要開啟 SSLauth: true
代碼實現
驗證碼服務
使用 Redis 緩存驗證碼并實現驗證碼的校驗功能:
@Service
public class CaptchaService { @Autowired private StringRedisTemplate redisTemplate; /** * 生成驗證碼 * @param email 目標郵箱 * @return 生成的驗證碼 */ public String generateCaptcha(String email) { // 生成驗證碼 String code = RandomStringUtils.randomNumeric(6); redisTemplate.opsForValue().set( "CAPTCHA:" + email, code, Duration.ofMinutes(5) // 驗證碼有效期為5分鐘 ); return code; } /** * 驗證碼校驗 * @param email 郵箱 * @param code 驗證碼 * @return 是否驗證通過 */ public boolean validateCaptcha(String email, String code) { String captcha = redisTemplate.opsForValue().get("CAPTCHA:" + email); return captcha != null && captcha.equals(code); }
}
郵件服務
@Service
public class EmailService { @Autowired private JavaMailSender mailSender; /** * 發送驗證碼郵件 * @param email 收件人郵箱 * @param authCode 驗證碼 */ public void sendCaptchaEmail(String email, String authCode) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("your_qq_account@qq.com"); message.setTo(email); message.setSubject("驗證碼"); message.setText("您的驗證碼是:" + authCode + ",有效期為5分鐘"); mailSender.send(message); }
}
接口實現
@RestController
public class AuthController { @Autowired private UserService userService; @Autowired private CaptchaService captchaService; @Autowired private EmailService emailService; /** * 注冊接口 * @param userDTO 用戶信息 * @param captcha 驗證碼 * @return 注冊結果 */ @PostMapping("/register") public Result register(@RequestBody UserDTO userDTO, @RequestParam String captcha) { if (!captchaService.validateCaptcha(userDTO.getEmail(), captcha)) { return Result.error("驗證碼錯誤"); } userService.register(userDTO); return Result.success(); } /** * 登錄接口 * @param userDTO 用戶信息 * @return 登錄結果 */ @PostMapping("/login") public Result login(@RequestBody UserDTO userDTO) { User user = userService.login(userDTO); if (user == null) { return Result.error("用戶不存在"); } // 登錄成功,生成 JWT 令牌 Map<String, Object> claims = new HashMap<>(); claims.put("userId", user.getId()); String token = JwtUtils.createJWT("secretKey", 60000, claims); UserVO userVO = new UserVO(); BeanUtils.copyProperties(user, userVO); LoginResponse loginResponse = new LoginResponse(userVO, token); return Result.success(loginResponse); } /** * 發送驗證碼接口 * @param email 郵箱地址 * @return 發送結果 */ @PostMapping("/send-code") public Result sendCode(@RequestParam String email) throws MessagingException { // 校驗郵箱格式if (!RegexUtils.isEmailValid(email)) { return Result.error("郵箱格式非法"); } String code = captchaService.generateCaptcha(email); emailService.sendCaptchaEmail(email, code); return Result.success(); }
}
執行流程
- 用戶輸入郵箱,調用
/send-code
接口獲取驗證碼。 - 用戶填寫驗證碼并調用
/register
接口進行注冊。 - 系統校驗驗證碼,驗證成功則注冊,失敗則返回錯誤信息。