首先设置一下发件人邮箱,以QQ邮箱为例:
找到帐户,开启POP3/SMTP服务
然后会提醒你怎么去实现,验证完后,会给你一个授权码,记住这个授权码,后端spring boot 会用到
下面回到IDEA,写代码实现发送验证码。
1.引入依赖:
<!-- 邮箱验证码依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置配置文件yml
#邮箱验证码配置
mail:
#smtp服务主机 qq邮箱则为smtp.qq.com;163邮箱是smtp.163.com
host: smtp.qq.com
#服务协议
protocol: smtp
# 编码集
default-encoding: UTF-8
#发送邮件的账户
username: xxxxxx@xx.com
#授权码
password: xxxxxxxxxxx
test-connection: true
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
注意:要放在spring下;host一定要引入;密码就是你的授权码
3.创建一个发送邮箱验证码实体类ToEmail:
import java.io.Serializable;
/**
* TODO 邮箱验证码实体类
*
* @author DB
* <br>CreateDate 2021/9/13 0:33
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ToEmail implements Serializable {
// 邮件接收方
private String[] tos;
// 邮件主题
private String subject;
// 邮件内容
private String content;
}
4.创建一个生成 6 位随机码的工具类VerCodeGenerateUtil:
/**
* TODO
*
* @author DB
* <br>CreateDate 2021/9/13 2:07
*/
import java.security.SecureRandom;
import java.util.Random;
/**
* @Classname VerCodeGenerateUtil
* @Description 生成验证码工具类
* @Date 2021/9/7 14:23
* @Created by DB
*/
public class VerCodeGenerateUtil {
//验证码包含的字段,可自己设置
private static final String SYMBOLS = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
private static final Random RANDOM = new SecureRandom();
// 生成 6 位数的随机数字
public static String generateVerCode() {
// 如果是六位,就生成大小为 6 的数组
char[] numbers = new char[6];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
}
return new String(numbers);
}
}
5.写到EmailController测试一下:
import com.qcby.db.common.contest.QcbyContext;
import com.qcby.db.common.web.ResultJson;
import com.qcby.db.entity.ToEmail;
import com.qcby.db.entity.User;
import com.qcby.db.service.LoginService;
import com.qcby.db.util.VerCodeGenerateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* TODO 邮箱验证码
*
* @author DB
* <br>CreateDate 2021/9/13 0:35
*/
@RestController
@RequestMapping("email")
public class EmailController {
// 引入邮件接口
@Autowired
private JavaMailSender mailSender;
@Autowired
private LoginService loginService;
// 获得发件人信息
@Value("${spring.mail.username}")
private String from;
@RequestMapping("sendEmail")
public ResultJson commonEmail(ToEmail toEmail, HttpServletRequest request) {
// 创建邮件消息
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(toEmail.getTos());
message.setSubject("您本次的验证码是");
String verCode = VerCodeGenerateUtil.generateVerCode();
message.setText("尊敬的xxx,您好:\n"
+ "\n本次请求的邮件验证码为:" + verCode + ",本验证码 5 分钟内效,请及时输入。(请勿泄露此验证码)\n"
+ "\n如非本人操作,请忽略该邮件。\n(这是一封通过自动发送的邮件,请不要直接回复)");
mailSender.send(message);
User user = QcbyContext.getUser(request.getHeader("token"));
user.setVerCode(verCode);
return ResultJson.ok("发送成功");
}
}
6.使用Postman测试一下:
实现!!!
参考:SpringBoot 整合 Email 实现发送验证码–努力努力再努力——thx