【從零搭建個(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í),我覺得應(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è)置-賬戶

image-20210119173022766

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

image-20210119173511693

點(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)證碼還是很簡單的较沪,大致流程如下:

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末失仁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子们何,更是在濱河造成了極大的恐慌萄焦,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冤竹,死亡現(xiàn)場離奇詭異拂封,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹦蠕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門冒签,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钟病,你說我怎么就攤上這事萧恕。” “怎么了肠阱?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵票唆,是天一觀的道長。 經(jīng)常有香客問我屹徘,道長走趋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任噪伊,我火速辦了婚禮簿煌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鉴吹。我一直安慰自己啦吧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布拙寡。 她就那樣靜靜地躺著授滓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肆糕。 梳的紋絲不亂的頭發(fā)上般堆,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音诚啃,去河邊找鬼淮摔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛始赎,可吹牛的內(nèi)容都是我干的和橙。 我是一名探鬼主播仔燕,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼魔招!你這毒婦竟也來了晰搀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤办斑,失蹤者是張志新(化名)和其女友劉穎外恕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乡翅,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳞疲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蠕蚜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尚洽。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖靶累,靈堂內(nèi)的尸體忽然破棺而出腺毫,到底是詐尸還是另有隱情,我是刑警寧澤尺铣,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布拴曲,位于F島的核電站,受9級特大地震影響凛忿,放射性物質(zhì)發(fā)生泄漏澈灼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一店溢、第九天 我趴在偏房一處隱蔽的房頂上張望叁熔。 院中可真熱鬧,春花似錦床牧、人聲如沸荣回。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽心软。三九已至,卻和暖如春著蛙,著一層夾襖步出監(jiān)牢的瞬間删铃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工踏堡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猎唁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓顷蟆,卻偏偏與公主長得像诫隅,于是被迫代替她去往敵國和親腐魂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容