SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊(cè)功能
本文為大家分享了SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊(cè)功能實(shí)例,供大家參考,具體內(nèi)容如下
這里有兩種方式:
使用Apache Common包中開源的email組件,通過實(shí)例化HtmlEmail()對(duì)象,可通過配置外置字典、或yml等配置文件實(shí)現(xiàn)靈活配置;
依賴:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.5</version> </dependency>
使用SpringBoot Starter email組件;
依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
我這里是采用的第一種方式,簡單易懂;
首先需要配置Email的各項(xiàng)參數(shù),其中hostname、host、username、passsword(注意:此處的密碼并不是登錄的密碼,而是郵箱開啟smtp服務(wù)的令牌);
我這里使用SpringBoot的yml配置文件,可以通過切換不同的環(huán)境:local/dev/test/pro/prod等等環(huán)境實(shí)現(xiàn)靈活配置,該配置為自定義配置;
我此處使用的是本人的163郵箱,在實(shí)際開發(fā)中需要換為公司的或項(xiàng)目專用郵箱;
(注意:此種方式有缺陷,即為不能從外部進(jìn)行靈活配置,只能寫死配置文件,在實(shí)際使用上應(yīng)該配置為數(shù)據(jù)字典,可以在外部直接進(jìn)行靈活配置)
yml:
##Email配置 email: host-name: smtp.163.com #服務(wù)地址,可以直接在web端登錄,找到smtp服務(wù)看到,163郵箱默認(rèn)開放25端口,可暫時(shí)不設(shè)置 authentication: username: xxx.163.com password: xxx #手動(dòng)的設(shè)置令牌 form: mail: xxx@163.com #發(fā)送方,必須為你設(shè)置的username一致 name: elog #發(fā)送方顯示的名稱,可以隨意設(shè)置 charset: UTF-8 #編碼格式,一般設(shè)置為UTF-8
util:
package com.hisw.rest.utils;
import com.hisw.common.exception.RRException;
import org.apache.commons.mail.HtmlEmail;
/**
* @ClassName EmailCodeUtils
* @Description TODO 郵箱驗(yàn)證碼工具類
* @Author liwenju
* @Date 2019/5/15 14:20
* @Version 1.0
**/
public class EmailCodeUtils {
/**
* 生成6位隨機(jī)驗(yàn)證碼
* @return
*/
public static String getNumber(){
String str = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String code = "";
for(int i= 0;i<6;i++){
int index = (int)(Math.random()*str.length());
code+=str.charAt(index);
}
return code;
}
/**
* 發(fā)送郵箱驗(yàn)證碼
* @param receiverEmail
* @param subject
* @param msg
*/
public static void sendEmailCode(String EMAIL_HOST_NAME,String EMAIL_FORM_MAIL,
String EMAIL_FORM_NAME,String EMAIL_AUTHENTICATION_USERNAME,
String EMAIL_AUTHENTICATION_PASSWORD,String receiverEmail,
String subject,String msg){
try{
HtmlEmail email = new HtmlEmail();
email.setHostName(EMAIL_HOST_NAME);
email.setCharset("utf-8");
email.setFrom(EMAIL_FORM_MAIL,EMAIL_FORM_NAME);
email.setAuthentication(EMAIL_AUTHENTICATION_USERNAME,EMAIL_AUTHENTICATION_PASSWORD);
email.addTo(receiverEmail);
email.setSubject(subject);
email.setMsg(msg);
email.send();
}catch (Exception ex){
throw new Exception("發(fā)送驗(yàn)證碼失敗,原因:"+ex.getMessage());
}
}
}
注意:在靜態(tài)工具類的方法中,不可直接調(diào)用@Value(value="$xxx")來獲取yml的配置文件的參數(shù)值,否則會(huì)獲取不到值。故不在該util類中直獲取。如下所示:
/**
* 獲取郵箱配置
*/
@Value(value = "${email.host-name}")
public String EMAIL_HOST_NAME;
方法示例:
/**
* 獲取郵箱配置
*/
@Value(value = "${email.host-name}")
public String EMAIL_HOST_NAME;
@Value(value = "${email.authentication.username}")
public String EMAIL_AUTHENTICATION_USERNAME;
@Value(value = "${email.authentication.password}")
public String EMAIL_AUTHENTICATION_PASSWORD;
@Value(value = "${email.charset}")
public String EMAIL_CHARSET;
@Value(value = "${email.form.mail}")
public String EMAIL_FORM_MAIL;
@Value(value = "${email.form.name}")
public String EMAIL_FORM_NAME;
@Autowired
private SysUserDao sysUserDao;
@Autowired
private SysUserTokenDao sysUserTokenDao;
@Autowired
private RedisUtils redisUtils;
private Logger logger = LoggerFactory.getLogger(LoginUserServiceImpl.class);
/**
* 驗(yàn)證碼過期時(shí)間60s
*/
private Integer redisExpire = 60 * 1000;
/***
* 根據(jù)郵箱驗(yàn)證用戶
* @param account
* @return
*/
public SysUserEntity queryByEmail(String account){
SysUserEntity sysUserEntity = new SysUserEntity();
sysUserEntity.setEmail(account);
return sysUserDao.selectOne(sysUserEntity);
}
/**
* 判斷該郵箱是否已存在
* @param email
* @return
*/
public Boolean checkEmail(String email){
//首先判斷該用戶是否已存在
if (StringUtils.isNotEmpty(email)){
EntityWrapper<SysUserEntity> userEntityWrapper = new EntityWrapper<>();
userEntityWrapper.eq("email",email);
List<SysUserEntity> sysUserList = sysUserDao.selectList(userEntityWrapper);
//如果已存在該用戶
return sysUserList.size() <= 0;
}
return true;
}
/**
*發(fā)送郵箱驗(yàn)證碼
*
*/
public R sendRegisterEmailCode(String email) {
try {
//驗(yàn)證郵箱規(guī)則
if (!RegexUtils.checkEmail(email)){
throw new RRException("The mailbox does not conform to the specification!");
}
if (!checkEmail(email)){
throw new RRException("This mailbox already exists. Please change the user's email and try again!");
}
String emailCode = EmailCodeUtils.getNumber();
//發(fā)送驗(yàn)證碼
EmailCodeUtils.sendEmailCode(EMAIL_HOST_NAME, EMAIL_FORM_MAIL,
EMAIL_FORM_NAME, EMAIL_AUTHENTICATION_USERNAME,
EMAIL_AUTHENTICATION_PASSWORD, email, EmailTextTemplate.REGISTER_SUBJECT,
EmailTextTemplate.REGISTER_CONTENT + emailCode + EmailTextTemplate.CONTENT_SUFFIX);
logger.info("驗(yàn)證碼發(fā)送成功:{}", email);
//發(fā)送成功,將該驗(yàn)證碼按照規(guī)定格式放入redis
redisUtils.set(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY + email, emailCode, redisExpire);
logger.info("Redis存儲(chǔ)驗(yàn)證碼成功:{}", emailCode);
return R.ok("The verification code has been sent to your mailbox and is valid for 60 seconds.");
} catch (Exception ex) {
return R.error(ex.getMessage());
}
}
/**
*驗(yàn)證驗(yàn)證碼
/
public R checkRegisterEmailCode(String email, String code) {
try {
String redisCode = redisUtils.get(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email);
//判斷是否已過期
if (StringUtils.isEmpty(redisCode)){
return R.error("The E-mail verification code has expired, please try again.");
}
//判斷驗(yàn)證碼是否正確
if (!StringUtils.equals(redisCode,code)){
return R.error("The E-mail verification code is wrong. Please try again.");
}
//驗(yàn)證成功,從redis中移除該key&value
redisUtils.delete(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email);
return R.ok("The E-mail verification code has been verified.");
}catch (Exception ex){
throw new RRException(ex.getMessage());
}
}
說明:R.error (msg)/ throw new RRExcepion(msg)中,msg應(yīng)該以enum或常量的方式組織起來;
在發(fā)送驗(yàn)證碼、校驗(yàn)驗(yàn)證碼時(shí),應(yīng)該有一個(gè)工具類,驗(yàn)證一個(gè)郵箱在特定的短時(shí)間內(nèi)只能發(fā)送或驗(yàn)證幾次驗(yàn)證碼,超過此限制,應(yīng)該拒絕處理請(qǐng)求;
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot實(shí)現(xiàn)短信驗(yàn)證碼校驗(yàn)方法思路詳解
- SpringBoot 集成Kaptcha實(shí)現(xiàn)驗(yàn)證碼功能實(shí)例詳解
- SpringBoot實(shí)現(xiàn)前端驗(yàn)證碼圖片生成和校驗(yàn)
- Springboot實(shí)現(xiàn)驗(yàn)證碼登錄
- SpringBoot發(fā)送郵箱驗(yàn)證碼功能
- springboot實(shí)現(xiàn)郵箱驗(yàn)證碼功能
- SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過期
- SpringBoot登錄驗(yàn)證碼實(shí)現(xiàn)過程詳解
- SpringBoot后端驗(yàn)證碼的實(shí)現(xiàn)示例
相關(guān)文章
SpringBoot讀取資源目錄中JSON文件的方法實(shí)例
最近做項(xiàng)目遇到需要將json類型的配置文件引用到項(xiàng)目中,已經(jīng)將讀取json文件的方法封裝成工具類,下面這篇文章主要給大家介紹了關(guān)于SpringBoot讀取資源目錄中JSON文件的相關(guān)資料,需要的朋友可以參考下2023-04-04
Java TimeoutException:服務(wù)調(diào)用超時(shí)異常的正確解決方案
在現(xiàn)代軟件開發(fā)中,服務(wù)間通信是構(gòu)建分布式系統(tǒng)的基礎(chǔ),然而,網(wǎng)絡(luò)延遲、服務(wù)負(fù)載、資源競(jìng)爭等因素都可能導(dǎo)致服務(wù)調(diào)用超時(shí),TimeoutException是Java中表示服務(wù)調(diào)用超時(shí)的常見異常之一,本文將探討TimeoutException的成因及解決方案,需要的朋友可以參考下2024-12-12
詳解spring boot 以jar的方式啟動(dòng)常用shell腳本
本篇文章主要介紹了詳解spring boot 以jar的方式啟動(dòng)常用shell腳本,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09

