【從零搭建個(gè)人博客】之SpringBoot實(shí)現(xiàn)郵箱發(fā)驗(yàn)證碼

博客地址:程序猿劉川楓

博客gitHub源碼地址:https://github.com/liujianview/myBlog

博客gitee源碼地址:https://gitee.com/liuchuanfengview/myBlog

歡迎給個(gè)star鼓勵(lì)一下~

一.前言

在思考博客規(guī)劃時(shí),我覺(jué)得應(yīng)該有用戶注冊(cè)登錄功能,從而可以評(píng)論留言博客文章,也能點(diǎn)贊私信博主,有自己的后臺(tái)。那么就需要驗(yàn)證真實(shí)性,保障用戶隱私,且忘記密碼時(shí)可以重置密碼,此時(shí)就需要發(fā)送驗(yàn)證碼了,這里我采用的是使用郵箱發(fā)送驗(yàn)證碼(當(dāng)然也可以用短信,但不是得花錢買短信條數(shù)嘛,節(jié)儉節(jié)儉~)。更方便的可以接入QQ一鍵登錄,極為方便,后續(xù)文章會(huì)出教程,本次先介紹如何使用QQ郵箱發(fā)送驗(yàn)證碼(其他郵箱同理)。

二.開(kāi)啟QQ郵箱IMAP服務(wù)

首先先點(diǎn)擊 登錄QQ郵箱 進(jìn)入QQ郵箱首頁(yè),點(diǎn)擊設(shè)置-賬戶

image-20210119173022766

往下拉,到中間位置,找到 IMAP/SMTP服務(wù)

image-20210119173511693

點(diǎn)開(kāi)啟IMAP/SMTP服務(wù)并驗(yàn)證后,會(huì)顯示一串密文密碼(復(fù)制存下來(lái),后面會(huì)放在配置文件中)

三.代碼實(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中取出并與用戶輸入值做對(duì)比,再給出響應(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語(yǔ)言來(lái)編寫郵件
//            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è)置過(guò)期時(shí)間
        stringRedisService.set(email, emailCode);
        stringRedisService.expire(email, 300);
        StringBuffer body = new StringBuffer();
        body.append("客官您來(lái)啦,里面請(qǐng)!\n\n").append("    您的驗(yàn)證碼為:  ").append(emailCode+"\n\n");
        body.append("    客官請(qǐng)注意:需要您在收到郵件后5分鐘內(nèi)使用,否則該驗(yàn)證碼將會(huì)失效。\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)證碼還是很簡(jiǎn)單的,大致流程如下:

  1. 登錄QQ郵箱開(kāi)啟IMAP服務(wù)并獲取自己的密文授權(quán)碼
  2. SpringBoot的pom文件中添加郵箱所需依賴
  3. SpringBoot配置文件中添加授權(quán)碼等信息
  4. 調(diào)用隨機(jī)數(shù)代碼,拼接參數(shù)發(fā)送給指定郵箱并存入redis返回成功

?更多精彩功能請(qǐng)關(guān)注我的個(gè)人博客網(wǎng)站:http://liujian.cool

??歡迎關(guān)注我的個(gè)人公眾號(hào):程序猿劉川楓

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容