SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過(guò)期
springBoot發(fā)送郵件(驗(yàn)證碼,5分鐘過(guò)期)超級(jí)詳細(xì),供大家參考,具體內(nèi)容如下
自己百度了很久,終于成功了,這里記錄一下過(guò)程
1.選擇郵箱(這里選用163郵箱)
首先在網(wǎng)頁(yè)登錄在設(shè)置里面打開(kāi)POP3/SMTP服務(wù)

在application.yaml中配置

要注意的就是這里的password是授權(quán)碼而不是密碼?。?!如果使用qq郵箱把host改為smtp.qq.com
2.關(guān)于驗(yàn)證碼的工具類
private static final String SYMBOLS = "0123456789";
/**
* Math.random生成的是一般隨機(jī)數(shù),采用的是類似于統(tǒng)計(jì)學(xué)的隨機(jī)數(shù)生成規(guī)則,其輸出結(jié)果很容易預(yù)測(cè),因此可能導(dǎo)致被攻擊者擊中。
* 而SecureRandom是真隨機(jī)數(shù),采用的是類似于密碼學(xué)的隨機(jī)數(shù)生成規(guī)則,其輸出結(jié)果較難預(yù)測(cè),若想要預(yù)防被攻擊者攻擊,最好做到使攻擊者根本無(wú)法,或不可能鑒別生成的隨機(jī)值和真正的隨機(jī)值。
*/
private static final Random RANDOM = new SecureRandom();
public static String generateVerCode() {
char[] nonceChars = new char[6];
for (int i = 0; i < nonceChars.length; i++) {
nonceChars[i] = SYMBOLS.charAt(RANDOM.nextInt(nonceChars.length));
}
return new String(nonceChars);
}
/**
*計(jì)算兩個(gè)日期的分鐘差
*/
public static int getMinute(Date fromDate, Date toDate) {
return (int) (toDate.getTime() - fromDate.getTime()) / (60 * 1000);
3.services模塊
/** * 發(fā)送驗(yàn)證碼到指定郵箱 * @param sender 發(fā)送地址 * @param mailSender spring自帶 * @param receiver 接受地址 */ AdvanceResponse getCode(String sender,JavaMailSenderImpl mailSender,String receiver); /** * 注冊(cè)用戶 */ AdvanceResponse addUser(User user,String verCode);
AdvanceResponse是自己封裝的返回對(duì)象,可以無(wú)視
/**
* 驗(yàn)證碼
*/
private String code;
/**
* 發(fā)送時(shí)間
*/
private Date sendTime;
@Override
@Async
public AdvanceResponse getCode(String sender, JavaMailSenderImpl mailSender, String receiver) {
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("驗(yàn)證碼");//設(shè)置郵件標(biāo)題
code = VerCodeGenerateUtil.generateVerCode();
sendTime = new Date();
message.setText("尊敬的用戶,您好:\n"
+ "\n本次請(qǐng)求的郵件驗(yàn)證碼為:" + code + ",本驗(yàn)證碼5分鐘內(nèi)有效,請(qǐng)及時(shí)輸入。(請(qǐng)勿泄露此驗(yàn)證碼)\n"
+ "\n如非本人操作,請(qǐng)忽略該郵件。\n(這是一封自動(dòng)發(fā)送的郵件,請(qǐng)不要直接回復(fù))"); //設(shè)置郵件正文
message.setFrom(sender);//發(fā)件人
message.setTo(receiver);//收件人
mailSender.send(message);//發(fā)送郵件
return AdvanceResponse.successResponse();
}
@Override
public AdvanceResponse addUser(User user, String verCode) {
Date date = new Date();
//判斷驗(yàn)證碼
if (VerCodeGenerateUtil.getMinute(sendTime, date) > 5) {
return AdvanceResponse.failedResponse("驗(yàn)證碼已經(jīng)失效?。?!");
}
if (!verCode.equals(code)) {
return AdvanceResponse.failedResponse("驗(yàn)證碼不正確!??!");
}
user.setRole(0);
user.setCreateTime(date);
user.setUpdateTime(date);
userDao.insert(user);
code = null;
return AdvanceResponse.successResponse();
}
@Async表示異步,可以在郵件未發(fā)送完成時(shí)就返回,而不必等待太長(zhǎng)時(shí)間,必須在總配置類上加@EnableAsync注解才可以生效
4.controller模塊
@Autowired
private UserService userService;
@Autowired
private JavaMailSenderImpl mailSender;
@Value("${spring.mail.username}")
private String sender;
/**
* 發(fā)送驗(yàn)證碼到指定郵箱
*/
@GetMapping("/verCode")
public AdvanceResponse verCode(String receiver) {
return userService.getCode(sender, mailSender, receiver);
}
/**
* 注冊(cè)用戶
*/
@PostMapping("/addUser")
public AdvanceResponse addUser(User user, String sender, JavaMailSenderImpl mailSender, @RequestParam("verCode") String verCode) {
return userService.addUser(user,verCode);
}
基本上后端就完成了,在來(lái)看看前端
5.前端界面
<div class="layui-form-item">
<label for="email" class="layui-form-label">
<span class="x-red">*</span>郵箱
</label>
<div class="layui-input-inline">
<input type="email" id="email" name="email" required="" lay-verify="email"
autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">
<span class="x-red" id="emailMsg"></span>
</div>
<button type="button" class="layui-btn" id="code">獲取驗(yàn)證碼</button>
</div>
<div class="layui-form-item">
<label for="verCode" class="layui-form-label">
<span class="x-red">*</span>驗(yàn)證碼
</label>
<div class="layui-input-inline">
<input type="text" id="verCode" name="verCode" required=""
autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">
<span class="x-red" id="verCodeMsg"></span>
</div>
</div>
前端使用了layui,只關(guān)注input表單即可
接下來(lái)是js代碼
//獲取驗(yàn)證碼
$('#code').click(function () {
const email = $('#email').val();
const myReg = /^[a-zA-Z0-9_-]+@([a-zA-Z0-9]+\.)+(com|cn|net|org)$/;
if (email === null || email.length === 0) {
layer.msg('郵箱不能為空!', {time: 1500, icon: 5, shift: 6});
return false;
}
if (!myReg.test(email)) {
layer.msg('郵箱格式不正確!', {time: 1500, icon: 5, shift: 6});
return false;
}
$.ajax({
type: 'GET',
url: 'user/verCode',
data: {
'receiver': email
},
beforeSend: function () {
loading = layer.msg('處理中', {icon: 16})
},
success: function () {
layer.close(loading);
}
})
});
//這是提交表單,只保留關(guān)鍵部分
$.ajax({
type: 'POST',
url: 'user/addUser',
data: formData,
cache: false, // 不緩存
processData: false, // jQuery不要去處理發(fā)送的數(shù)據(jù)
contentType: false, // jQuery不要去設(shè)置Content-Type請(qǐng)求頭
beforeSend: function () {
loading = layer.msg('處理中', {icon: 16})
},
success: function (result) {
if (result.status === 0) {
layer.msg(result.msg, {time: 1500, icon: 5, shift: 6});
} else {
layer.close(loading);
xadmin.close();
}
}
})
基本上全部完成!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問(wèn)題
這篇文章主要介紹了Java應(yīng)用日志如何與Jaeger的trace關(guān)聯(lián),通過(guò)jaeger發(fā)現(xiàn)這十次請(qǐng)求中有一次耗時(shí)特別長(zhǎng),想定位一下具體原因,感興趣的朋友跟隨小編一起看看吧2022-01-01
SpringBoot詳解如何實(shí)現(xiàn)讀寫分離
當(dāng)響應(yīng)的瓶頸在數(shù)據(jù)庫(kù)的時(shí)候,就要考慮數(shù)據(jù)庫(kù)的讀寫分離,當(dāng)然還可以分庫(kù)分表,那是單表數(shù)據(jù)量特別大,當(dāng)單表數(shù)據(jù)量不是特別大,但是請(qǐng)求量比較大的時(shí)候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫(kù)分表了...我們這篇就簡(jiǎn)單講一下讀寫分離2022-05-05
springboot restTemplate連接池整合方式
這篇文章主要介紹了springboot restTemplate連接池整合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
URLConnection發(fā)送HTTP請(qǐng)求的方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了URLConnection發(fā)送HTTP請(qǐng)求的方法,主要介紹了如何通過(guò)Java(模擬瀏覽器)發(fā)送HTTP請(qǐng)求,有興趣的可以了解一下2017-07-07
教你用IDEA配置JUnit并進(jìn)行單元測(cè)試
今天教各位小伙伴怎么用IDEA配置JUnit并進(jìn)行單元測(cè)試,文中有非常詳細(xì)的圖文介紹及代碼示例,對(duì)正在學(xué)習(xí)IDEA的小伙伴有很好的幫助,需要的朋友可以參考下2021-05-05

