Java集成郵箱驗證找回密碼功能全過程
1.添加依賴
<!--導(dǎo)入郵箱依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>3.1.5</version>
</dependency>2.選擇一個自己的郵箱,作為發(fā)件人角色。
說白了,用戶找回密碼時,需要發(fā)件人發(fā)送給用戶郵箱一個驗證碼,那么這個發(fā)件人郵箱,需要我們自己選取。
此時我就選擇用我自己的QQ郵箱,作為發(fā)件人。
下面就需要我們?nèi)Q郵箱,開啟POP3/SMTP服務(wù),獲取授權(quán)碼。



3.編寫郵箱配置【配置發(fā)件人郵箱】
我們在【2】中,選取了我們自己的QQ郵箱,充當(dāng)發(fā)件人角色。
那么我們此時,就需要將該QQ郵箱的配置信息(包含賬號、授權(quán)碼等等),配置到Java的application.yml文件中。
配置好以后,Java就可以在需要時,自動使用我們的QQ郵箱,給忘記密碼的用戶的郵箱發(fā)送驗證碼了。

4.編寫郵箱配置類
其實【3】就夠用了,但是有時候只完成3的配置,仍然無法注入JavaMailSender的實例。
@Configuration
public class MailConfig {
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// 設(shè)置QQ郵箱SMTP服務(wù)器
mailSender.setHost("smtp.qq.com");
mailSender.setPort(587); // QQ郵箱默認(rèn)端口587(TLS)或465(SSL)
// 設(shè)置郵箱賬號和授權(quán)碼(注意:password是授權(quán)碼,不是QQ密碼)
mailSender.setUsername("發(fā)件郵箱賬號");
mailSender.setPassword("授權(quán)碼");
// 設(shè)置編碼
mailSender.setDefaultEncoding("UTF-8");
// 設(shè)置SMTP協(xié)議屬性
Properties props = mailSender.getJavaMailProperties();
props.put("mail.smtp.auth", "true"); // 啟用認(rèn)證
props.put("mail.smtp.starttls.enable", "true"); // 啟用TLS加密
props.put("mail.smtp.starttls.required", "true"); // 必須使用TLS
return mailSender;
}
}5.編寫controller業(yè)務(wù)代碼
由于發(fā)送郵件內(nèi)容不多,所以我們就將所有代碼都寫到一個controller層即可,就不再創(chuàng)建service層了。
@RestController//表明這是一個controller層,并且自動將對象轉(zhuǎn)為JSON格式返回
@RequestMapping("/api/email")//該controller的訪問路徑
public class SendEmailController {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private UserMapper userMapper;
//發(fā)送郵件
@PostMapping("/sendEmail")
public Result sendEmail(@RequestBody EmailDto emailDto){
//1.先查找數(shù)據(jù)庫,是否存在該用戶的賬號,如果不存在,則返回錯誤信息“該賬號不存在”
User user = userMapper.queryUserByUsername(emailDto.getUsername());
if(user == null){
return new Result(404, "該賬號不存在");
}
//2.如果該賬號存在,則判斷該郵箱是否綁定了該賬號,如果沒綁定,則返回錯誤信息“賬號與郵箱未綁定”
if(!user.getEmail().equals(emailDto.getEmail())){
return new Result(404, "賬號與郵箱未綁定");
}
//3.如果綁定了,則往該用戶的郵箱中,發(fā)送一個驗證碼(多少位自己決定,一般是6位)
//生成6位驗證碼
Random random = new Random();
int code = random.nextInt(900000) + 100000;//范圍:100000-999999(6位隨機數(shù)的范圍)。
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("發(fā)件人郵箱");//設(shè)置發(fā)件人郵箱
message.setTo(emailDto.getEmail());//設(shè)置收件人郵箱
message.setSubject("東軟HIS系統(tǒng)驗證碼");//郵件標(biāo)題
message.setText("郵箱驗證碼為:" + code + ",請勿發(fā)送給他人");//郵件內(nèi)容
try {
javaMailSender.send(message);
//4.將該驗證碼存入redis,有效時間設(shè)置為2分鐘,以便后續(xù)驗證該用戶在前端輸入的驗證碼是否正確。TODO
return new Result(200, "發(fā)送成功");
}catch (Exception e){
throw new RuntimeException("發(fā)送郵箱驗證碼失敗,請稍后再試");
}
}
}6.演示效果
情況1:賬號不存在

情況2:賬號與郵箱未綁定

情況3:賬號與郵箱綁定。


可見此時我們的QQ小號的郵箱2037730735@qq.com也確實收到了這個郵箱驗證碼。
7.總結(jié)流程
①找一個自己的郵箱(QQ、163、outlook等都可以),作為發(fā)件人,并將該郵箱的信息配置到j(luò)ava后端
②收件人的郵箱,是從前端傳遞過來的(即:誰忘記了密碼,誰就輸入他自己的郵箱,作為驗證碼的收件人)。
③驗證碼發(fā)送成功后,應(yīng)當(dāng)存入redis,并設(shè)置有效時間(如:2分鐘),以便用戶在前端輸入驗證碼后,驗證正確性。
8.注意
上述發(fā)送郵箱驗證碼成功后,應(yīng)當(dāng)將驗證碼存入redis,我們此時還沒寫寫部分內(nèi)容,稍后會完善的。
到此這篇關(guān)于Java集成郵箱驗證找回密碼功能的文章就介紹到這了,更多相關(guān)Java集成郵箱驗證找回密碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程編程實戰(zhàn)之模擬大量數(shù)據(jù)同步
這篇文章主要介紹了Java多線程編程實戰(zhàn)之模擬大量數(shù)據(jù)同步,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
Spring Boot集成教程之異步調(diào)用Async
在項目中,當(dāng)訪問其他人的接口較慢或者做耗時任務(wù)時,不想程序一直卡在耗時任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async。需要的朋友們下面來一起看看吧。2018-03-03
Java中Scanner類與BufferReader類的不同點(非常詳細(xì))
這篇文章主要介紹了Java中Scanner類與BufferReader類的不同點(非常詳細(xì))的相關(guān)資料,需要的朋友可以參考下2016-08-08
Bean?Searcher配合SpringBoot的使用詳解
這篇文章主要介紹了Bean?Searcher配合SpringBoot的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
SpringBoot3.3中實現(xiàn)多端口監(jiān)聽的示例代碼
在SpringBoot應(yīng)用中實現(xiàn)多端口監(jiān)聽,可以讓一個應(yīng)用處理不同類型的HTTP請求或暴露多個服務(wù)接口,本文詳細(xì)講解了通過配置application.yml文件和編寫自定義配置類的方法,實現(xiàn)了對多個端口的監(jiān)聽,感興趣的可以了解一下2024-11-11
Java并發(fā)編程中的synchronized關(guān)鍵字詳細(xì)解讀
這篇文章主要介紹了Java并發(fā)編程中的synchronized關(guān)鍵字詳細(xì)解讀,在Java早期版本中,synchronized 屬于 重量級鎖,效率低下,這是因為監(jiān)視器鎖(monitor)是依賴于底層的操作系統(tǒng)的Mutex Lock來實現(xiàn)的,Java 的線程是映射到操作系統(tǒng)的原生線程之上的,需要的朋友可以參考下2023-12-12

