SpringBoot中怎么使用郵箱發(fā)送驗證碼實現(xiàn)注冊功能

本篇文章給大家分享的是有關(guān)SpringBoot中怎么使用郵箱發(fā)送驗證碼實現(xiàn)注冊功能,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)服務(wù)項目包括西湖網(wǎng)站建設(shè)、西湖網(wǎng)站制作、西湖網(wǎng)頁制作以及西湖網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西湖網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西湖省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

依賴:

<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的各項參數(shù),其中hostname、host、username、passsword(注意:此處的密碼并不是登錄的密碼,而是郵箱開啟smtp服務(wù)的令牌);我這里使用SpringBoot的yml配置文件,可以通過切換不同的環(huán)境:local/dev/test/pro/prod等等環(huán)境實現(xiàn)靈活配置,該配置為自定義配置;

我此處使用的是本人的163郵箱,在實際開發(fā)中需要換為公司的或項目專用郵箱;(注意:此種方式有缺陷,即為不能從外部進(jìn)行靈活配置,只能寫死配置文件,在實際使用上應(yīng)該配置為數(shù)據(jù)字典,可以在外部直接進(jìn)行靈活配置)

yml:

##Email配置email: host-name: smtp.163.com #服務(wù)地址,可以直接在web端登錄,找到smtp服務(wù)看到,163郵箱默認(rèn)開放25端口,可暫時不設(shè)置 authentication:  username: xxx.163.com  password: xxx #手動的設(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 郵箱驗證碼工具類 * @Author liwenju * @Date 2019/5/15 14:20 * @Version 1.0 **/public class EmailCodeUtils {  /**   * 生成6位隨機(jī)驗證碼   * @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ā)送郵箱驗證碼   * @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ā)送驗證碼失敗,原因:"+ex.getMessage());    }  }}

注意:在靜態(tài)工具類的方法中,不可直接調(diào)用@Value(value="$xxx")來獲取yml的配置文件的參數(shù)值,否則會獲取不到值。故不在該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;@Autowiredprivate SysUserDao sysUserDao;@Autowiredprivate SysUserTokenDao sysUserTokenDao;@Autowiredprivate redisUtils redisUtils;private Logger logger = LoggerFactory.getLogger(LoginUserServiceImpl.class);/** * 驗證碼過期時間60s */private Integer redisExpire = 60 * 1000;/*** * 根據(jù)郵箱驗證用戶 * @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ā)送郵箱驗證碼 * */public R sendRegisterEmailCode(String email) {  try {    //驗證郵箱規(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ā)送驗證碼    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("驗證碼發(fā)送成功:{}", email);    //發(fā)送成功,將該驗證碼按照規(guī)定格式放入redis    redisUtils.set(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY + email, emailCode, redisExpire);    logger.info("Redis存儲驗證碼成功:{}", 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());  }}/** *驗證驗證碼 / 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.");    }    //判斷驗證碼是否正確    if (!StringUtils.equals(redisCode,code)){      return R.error("The E-mail verification code is wrong. Please try again.");    }    //驗證成功,從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īng)該有一個工具類,驗證一個郵箱在特定的短時間內(nèi)只能發(fā)送或驗證幾次驗證碼,超過此限制,應(yīng)該拒絕處理請求;

以上就是SpringBoot中怎么使用郵箱發(fā)送驗證碼實現(xiàn)注冊功能,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱:SpringBoot中怎么使用郵箱發(fā)送驗證碼實現(xiàn)注冊功能
URL地址:http://bm7419.com/article48/pcggep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)做網(wǎng)站、品牌網(wǎng)站設(shè)計、標(biāo)簽優(yōu)化、定制開發(fā)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司