目录
1、开启邮箱IMAP/SMTP服务,获取授权码
2、相关代码
1、使用配置Redis(用于存储验证码,具有时效性)
2、邮箱依赖和hutool(用于随机生成验证码)
3、配置Redis和邮箱信息
4、开启Redis服务
5、编写发送邮箱验证码
6、邮箱登录验证功能
3、测试
1、开启邮箱IMAP/SMTP服务,获取授权码
1、登录邮箱(以qq邮箱为例),点击邮箱右上角邮箱-设置-常规-第三方服务,会有如下选项
2、点击生成授权码(这边已经开启IMAP/SMTP服务,未开启的要先设置为开启),之后根据指示可以拿到一串由邮箱服务器提供的专属于自己的授权码,用于在Java代码中连接邮箱
2、相关代码
1、使用配置Redis(用于存储验证码,具有时效性)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、邮箱依赖和hutool(用于随机生成验证码)
<!-- 邮箱验证码依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 一个很强大的工具库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.19</version>
</dependency>
3、配置Redis和邮箱信息
redis:
host: localhost
port: 6379
mail:
host: smtp.qq.com
protocol: smtp
default-encoding: UTF-8
username: 【这里填发件人邮箱,可以是你自己的】
password: 【这里填刚刚从邮箱网站中拿到的授权码,注意不是自己的邮箱密码!!】
nickname: 【发件人自命名】
properties:
mail.smtp.auth: true #启用SMTP服务器的身份验证,这是为了确保只有合法用户可以发送邮件。
mail.smtp.starttls.enable: #启用TLS加密,这是为了确保邮件传输的安全性。
mail.smtp.starttls.required: true #要求使用TLS加密,如果连接不是通过TLS加密传输,则连接将失败。
4、开启Redis服务
这里以windows作为举例:
5、编写发送邮箱验证码
import cn.hutool.core.util.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/email")
public class EmailController {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private RedisTemplate redisTemplate;
@Value("${spring.mail.username}")
private String sender;
@Value("${spring.mail.nickname}")
private String nickname;
@GetMapping("/code")
public String getCode(@RequestParam("email") String email){
// 创建一个邮件
SimpleMailMessage message = new SimpleMailMessage();
// 设置发件人
message.setFrom(nickname+'<'+sender+'>');
// 设置收件人
message.setTo(email);
// 设置邮件主题
message.setSubject("欢迎访问"+nickname);
//生成六位随机数
String code = RandomUtil.randomNumbers(6);
//将验证码存入redis,有效期为5分钟
redisTemplate.opsForValue().set("email_code_"+email, code, 300000, TimeUnit.MILLISECONDS);
String content = "【验证码】您的验证码为:" + code + " 。 验证码五分钟内有效,逾期作废。\n\n\n" +
"------------------------------\n\n\n" ;
message.setText(content);
// 发送邮件
javaMailSender.send(message);
return "发送成功";
}
}
6、邮箱登录验证功能
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private RedisTemplate redisTemplate;
// 通过邮箱验证登录
@PostMapping("/loginByEmail")
public ResponseBean loginByEmail(@RequestParam(value = "code") String code) {
String email = "【这里写你已经收到验证码的邮箱】";
String emailKey = "email_code_"+email;
String storedToken = (String) redisTemplate.opsForValue().get(emailKey);
if(code.equals(storedToken)){
return ResponseBean.success("验证成功",null);
}else {
return ResponseBean.error("验证失败");
}
}
}
3、测试
成功接收到来自发送方的验证码
再进行邮箱登录测试
检查Redis服务器存储情况: