SpringBoot使用邮箱发送验证码实现注册功能
本文为大家分享了SpringBoot使用邮箱发送验证码实现注册功能实例,供大家参考,具体内容如下
这里有两种方式:
使用ApacheCommon包中开源的email组件,通过实例化HtmlEmail()对象,可通过配置外置字典、或yml等配置文件实现灵活配置;
依赖:
org.apache.commons commons-email 1.5
使用SpringBootStarteremail组件;
依赖:
org.springframework.boot spring-boot-starter-mail
我这里是采用的第一种方式,简单易懂;
首先需要配置Email的各项参数,其中hostname、host、username、passsword(注意:此处的密码并不是登录的密码,而是邮箱开启smtp服务的令牌);
我这里使用SpringBoot的yml配置文件,可以通过切换不同的环境:local/dev/test/pro/prod等等环境实现灵活配置,该配置为自定义配置;
我此处使用的是本人的163邮箱,在实际开发中需要换为公司的或项目专用邮箱;
(注意:此种方式有缺陷,即为不能从外部进行灵活配置,只能写死配置文件,在实际使用上应该配置为数据字典,可以在外部直接进行灵活配置)
yml:
##Email配置 email: host-name:smtp.163.com#服务地址,可以直接在web端登录,找到smtp服务看到,163邮箱默认开放25端口,可暂时不设置 authentication: username:xxx.163.com password:xxx#手动的设置令牌 form: mail:xxx@163.com#发送方,必须为你设置的username一致 name:elog#发送方显示的名称,可以随意设置 charset:UTF-8#编码格式,一般设置为UTF-8
util:
packagecom.hisw.rest.utils; importcom.hisw.common.exception.RRException; importorg.apache.commons.mail.HtmlEmail; /** *@ClassNameEmailCodeUtils *@DescriptionTODO邮箱验证码工具类 *@Authorliwenju *@Date2019/5/1514:20 *@Version1.0 **/ publicclassEmailCodeUtils{ /** *生成6位随机验证码 *@return */ publicstaticStringgetNumber(){ Stringstr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Stringcode=""; for(inti=0;i<6;i++){ intindex=(int)(Math.random()*str.length()); code+=str.charAt(index); } returncode; } /** *发送邮箱验证码 *@paramreceiverEmail *@paramsubject *@parammsg */ publicstaticvoidsendEmailCode(StringEMAIL_HOST_NAME,StringEMAIL_FORM_MAIL, StringEMAIL_FORM_NAME,StringEMAIL_AUTHENTICATION_USERNAME, StringEMAIL_AUTHENTICATION_PASSWORD,StringreceiverEmail, Stringsubject,Stringmsg){ try{ HtmlEmailemail=newHtmlEmail(); 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(Exceptionex){ thrownewException("发送验证码失败,原因:"+ex.getMessage()); } } }
注意:在静态工具类的方法中,不可直接调用@Value(value="$xxx")来获取yml的配置文件的参数值,否则会获取不到值。故不在该util类中直获取。如下所示:
/** *获取邮箱配置 */ @Value(value="${email.host-name}") publicStringEMAIL_HOST_NAME;
方法示例:
/** *获取邮箱配置 */ @Value(value="${email.host-name}") publicStringEMAIL_HOST_NAME; @Value(value="${email.authentication.username}") publicStringEMAIL_AUTHENTICATION_USERNAME; @Value(value="${email.authentication.password}") publicStringEMAIL_AUTHENTICATION_PASSWORD; @Value(value="${email.charset}") publicStringEMAIL_CHARSET; @Value(value="${email.form.mail}") publicStringEMAIL_FORM_MAIL; @Value(value="${email.form.name}") publicStringEMAIL_FORM_NAME; @Autowired privateSysUserDaosysUserDao; @Autowired privateSysUserTokenDaosysUserTokenDao; @Autowired privateRedisUtilsredisUtils; privateLoggerlogger=LoggerFactory.getLogger(LoginUserServiceImpl.class); /** *验证码过期时间60s */ privateIntegerredisExpire=60*1000; /*** *根据邮箱验证用户 *@paramaccount *@return */ publicSysUserEntityqueryByEmail(Stringaccount){ SysUserEntitysysUserEntity=newSysUserEntity(); sysUserEntity.setEmail(account); returnsysUserDao.selectOne(sysUserEntity); } /** *判断该邮箱是否已存在 *@paramemail *@return */ publicBooleancheckEmail(Stringemail){ //首先判断该用户是否已存在 if(StringUtils.isNotEmpty(email)){ EntityWrapperuserEntityWrapper=newEntityWrapper<>(); userEntityWrapper.eq("email",email); List sysUserList=sysUserDao.selectList(userEntityWrapper); //如果已存在该用户 returnsysUserList.size()<=0; } returntrue; } /** *发送邮箱验证码 * */ publicRsendRegisterEmailCode(Stringemail){ try{ //验证邮箱规则 if(!RegexUtils.checkEmail(email)){ thrownewRRException("Themailboxdoesnotconformtothespecification!"); } if(!checkEmail(email)){ thrownewRRException("Thismailboxalreadyexists.Pleasechangetheuser'semailandtryagain!"); } StringemailCode=EmailCodeUtils.getNumber(); //发送验证码 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("验证码发送成功:{}",email); //发送成功,将该验证码按照规定格式放入redis redisUtils.set(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email,emailCode,redisExpire); logger.info("Redis存储验证码成功:{}",emailCode); returnR.ok("Theverificationcodehasbeensenttoyourmailboxandisvalidfor60seconds."); }catch(Exceptionex){ returnR.error(ex.getMessage()); } } /** *验证验证码 / publicRcheckRegisterEmailCode(Stringemail,Stringcode){ try{ StringredisCode=redisUtils.get(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email); //判断是否已过期 if(StringUtils.isEmpty(redisCode)){ returnR.error("TheE-mailverificationcodehasexpired,pleasetryagain."); } //判断验证码是否正确 if(!StringUtils.equals(redisCode,code)){ returnR.error("TheE-mailverificationcodeiswrong.Pleasetryagain."); } //验证成功,从redis中移除该key&value redisUtils.delete(RestRedisConstant.REST_ELOG_REGISTER_EMAIL_CODE_KEY+email); returnR.ok("TheE-mailverificationcodehasbeenverified."); }catch(Exceptionex){ thrownewRRException(ex.getMessage()); } }
说明:R.error(msg)/thrownewRRExcepion(msg)中,msg应该以enum或常量的方式组织起来;
在发送验证码、校验验证码时,应该有一个工具类,验证一个邮箱在特定的短时间内只能发送或验证几次验证码,超过此限制,应该拒绝处理请求;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。