博客地址:程序猿劉川楓
博客gitHub源碼地址:https://github.com/liujianview/myBlog
博客gitee源碼地址:https://gitee.com/liuchuanfengview/myBlog
歡迎給個(gè)star鼓勵(lì)一下~
一.前言
在思考博客規(guī)劃時(shí),我覺得應(yīng)該有用戶注冊登錄功能利耍,從而可以評論留言博客文章蚌本,也能點(diǎn)贊私信博主,有自己的后臺隘梨。那么就需要驗(yàn)證真實(shí)性程癌,保障用戶隱私,且忘記密碼時(shí)可以重置密碼轴猎,此時(shí)就需要發(fā)送驗(yàn)證碼了嵌莉,這里我采用的是使用郵箱發(fā)送驗(yàn)證碼(當(dāng)然也可以用短信,但不是得花錢買短信條數(shù)嘛捻脖,節(jié)儉節(jié)儉~)锐峭。更方便的可以接入QQ一鍵登錄,極為方便可婶,后續(xù)文章會出教程沿癞,本次先介紹如何使用QQ郵箱發(fā)送驗(yàn)證碼(其他郵箱同理)。
二.開啟QQ郵箱IMAP服務(wù)
首先先點(diǎn)擊 登錄QQ郵箱 進(jìn)入QQ郵箱首頁矛渴,點(diǎn)擊設(shè)置-賬戶
往下拉椎扬,到中間位置,找到 IMAP/SMTP服務(wù)
點(diǎn)開啟IMAP/SMTP服務(wù)并驗(yàn)證后具温,會顯示一串密文密碼(復(fù)制存下來蚕涤,后面會放在配置文件中)
三.代碼實(shí)現(xiàn)
1.pom文件導(dǎo)入支持郵件依賴
<!--qq郵件發(fā)送所需依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.配置文件application.properites添加郵箱配置信息
在配置文件最后加入以下內(nèi)容
#配置QQ郵件信息
spring.mail.host=smtp.qq.com
#發(fā)送郵件者信箱
spring.mail.username=xxxx@qq.com
#IMAP/SMTP服務(wù)時(shí)郵箱的密文授權(quán)碼(之前保存的)
spring.mail.password=xxxx
spring.mail.default-encoding=UTF-8
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
3.具體實(shí)現(xiàn)代碼
我的思路是把驗(yàn)證碼隨機(jī)生成后放入redis緩存,設(shè)置5分鐘有效期铣猩,使用時(shí)從redis中取出并與用戶輸入值做對比揖铜,再給出響應(yīng)提示,代碼如下:
/**
* @description: 發(fā)送郵件獲取驗(yàn)證碼
* @author: liuchuanfeng
* @time: 2020/12/8 15:52
*/
@RestController
@Slf4j
public class GetEmailCodeController {
@Autowired
StringRedisServiceImpl stringRedisService;
@Autowired
JavaMailSender mailSender;//注入發(fā)送郵件的bean
@Value("${spring.mail.username}")
private String emailUserName;
//定義發(fā)送的標(biāo)題
public static String title="[程序猿劉川楓]獲取驗(yàn)證碼";
/**
* @description: 發(fā)送給指定郵箱驗(yàn)證碼
* @param email
* @return: java.lang.String
* @author: liuchuanfeng
* @time: 2020/12/8 16:23
*/
@PostMapping(value = "/getCode", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String getEmail(@RequestParam("email") String email) {
try {
String body = setEmailBody(email);
MimeMessage mimeMessage = this.mailSender.createMimeMessage();
MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setFrom(emailUserName);//設(shè)置發(fā)件qq郵箱
message.setTo(email); //設(shè)置收件人
message.setSubject(title); //設(shè)置標(biāo)題
message.setText(body); //第二個(gè)參數(shù)true表示使用HTML語言來編寫郵件
// FileSystemResource file = new FileSystemResource(
// File file = new File("圖片路徑");
// helper.addAttachment("圖片.jpg", file);//添加帶附件的郵件
// helper.addInline("picture",file);//添加帶靜態(tài)資源的郵件
log.info("getEmail send email message: [{}]", message);
this.mailSender.send(mimeMessage);
} catch (Exception e) {
log.error("[{}] send email message exception", email, e);
return JsonResult.fail().toJSON();
}
return JsonResult.success().toJSON();
}
private String setEmailBody(String email){
//獲取郵箱隨機(jī)驗(yàn)證碼
String emailCode = EmailRandomUtil.randomNumBuilder();
//在redis中保存郵箱驗(yàn)證碼并設(shè)置過期時(shí)間
stringRedisService.set(email, emailCode);
stringRedisService.expire(email, 300);
StringBuffer body = new StringBuffer();
body.append("客官您來啦,里面請!\n\n").append(" 您的驗(yàn)證碼為: ").append(emailCode+"\n\n");
body.append(" 客官請注意:需要您在收到郵件后5分鐘內(nèi)使用剂习,否則該驗(yàn)證碼將會失效蛮位。\n\n");
return body.toString();
}
}
生成6位隨機(jī)驗(yàn)證碼如下:
/**
* @description: 郵件生成驗(yàn)證碼
* @author: liuchuanfeng
* @time: 2020/12/8 15:56
*/
public class EmailRandomUtil {
public static String randomNumBuilder(){
String result = "";
for(int i=0;i<6;i++){
result += Math.round(Math.random() * 9);
}
return result;
}
}
四.總結(jié)
用SpringBoot實(shí)現(xiàn)郵箱發(fā)送驗(yàn)證碼還是很簡單的较沪,大致流程如下:
- 登錄QQ郵箱開啟IMAP服務(wù)并獲取自己的密文授權(quán)碼
- SpringBoot的pom文件中添加郵箱所需依賴
- SpringBoot配置文件中添加授權(quán)碼等信息
- 調(diào)用隨機(jī)數(shù)代碼鳞绕,拼接參數(shù)發(fā)送給指定郵箱并存入redis返回成功
?更多精彩功能請關(guān)注我的個(gè)人博客網(wǎng)站:http://liujian.cool
??歡迎關(guān)注我的個(gè)人公眾號:程序猿劉川楓