zoukankan      html  css  js  c++  java
  • java 邮箱发送验证码

    接着验证码记录  ,此次写的是邮箱验证码;本文工具类是参考别人的,然后根据自己业务调整的,此处只是记录,非原创(距离开发有段时间了,所以原创地址没有了,在此向原创表示歉意)

    1、使用场景

      根据用户邮箱进行验证码接收和验证

    2、步骤

      2.1、前端输入邮箱,点击发送验证码,

      2.2、服务器校验用户邮箱是否正确,如果正确:发送验证码,

      2.3、用户邮箱收到验证码后,前端输入调用服务器接口,

      2.4、服务器校验验证码,返回校验结果

     注:一般验证码验证是整和在业务中的,所以前端传验证码时可能会传入其他业务参数,然后服务端验证验证码后,进行业务处理,修改密码邮箱等等,这需要具体业务具体分析

     另:需要引入的包,本文不在给出,可根据引入包自行导入

      发送邮件的邮箱开通过程此处不再给出,可自行百度

    工具类

    package com.*******.util.email;
    
    
    import org.apache.commons.mail.EmailException;
    import org.apache.commons.mail.HtmlEmail;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    /**
     * 功能描述: <br>
     * 〈邮箱发送验证码〉
     * 业务要求:可以修改发件邮箱,所以此处给出的参数存在数据库内的
     * @return:
     * @since: 1.0.0
     * @Author:
     * @Date:
     */
    public class EmailUtil {
    
        //为了保证参数没有存入数据库的也可以使用,此处并未删除参数变量
        //标题
        private static String TITLE="邮箱验证";
        //验证码
        private static String CONTENT="验证码";
        //发送邮箱的SMTP服务器
        //邮箱的SMTP服务器,一般123邮箱的是smtp.123.com,qq邮箱为smtp.qq.com
        //设置邮箱的SMTP服务器,登录相对应的邮箱官网,去拿就行了
        private static String HOSTNAME="smtp.163.com";
        //发送信息的字符类型
        private static String CHARSET="utf-8";
        //发送邮箱
        private static String SENDEMAIL="*******@163.com";
        //发送人用户名
        private static String USERNAME="***集团";
        //授权用户名和授权码,申请开通
        private static String AUTHENTICATION_NAME="******@163.com";
        private static String USERNAME_PWD="*****";
        //集合——保存验证码的集合
        private static Map<String, SendEmailDO> emailMap=new ConcurrentHashMap<>();
        //过期时间
        private static final long expiredTime=1000*10*60;
    
        /**
         *发送验证码
          * @param receiveEmail
         * @param dto
         *@return ()
         *@throws
         *@author yutf
         *@date 2020/5/23
         *
         */
        public static void sendEmail(String receiveEmail, EmailSettingDO dto) throws EmailException {
    
            //创建一个HtmlEmail实例对象
            HtmlEmail email=new HtmlEmail();
    
            //邮箱的SMTP服务器,一般123邮箱的是smtp.123.com,qq邮箱为smtp.qq.com
            //设置邮箱的SMTP服务器,登录相对应的邮箱官网,去拿就行了
           // email.setHostName(HOSTNAME);
            email.setHostName(dto.getHostName());
    
            //设置发送的字符类型
            email.setCharset(CHARSET);
    
            //设置收件人
            email.addTo(receiveEmail);
    
            //发送人的邮箱为自己的,用户名可以随便填
            //email.setFrom(SENDEMAIL,USERNAME);
            email.setFrom(dto.getSendMail(),dto.getUserName());
    
            //设置发送人的邮箱和用户名和授权码(授权码是自己设置的)
            //email.setAuthentication(AUTHENTICATION_NAME,USERNAME_PWD);
            email.setAuthentication(dto.getAuthenticationName(),dto.getUserNamePwd());
    
            //设置发送主题
            //email.setSubject(TITLE);
            email.setSubject(dto.getTitle());
            //生成验证码
            String code = String.valueOf(new Random().nextInt(899999) + 100000);
            //设置发送内容
            //email.setMsg(CONTENT+code);
            email.setMsg(dto.getContent()+":"+code);
    
            //进行发送
            email.send();
    
            //保存验证码
            SendEmailDO sendEmailDO=new SendEmailDO();
            sendEmailDO.setCode(code);
            sendEmailDO.setSendTime(System.currentTimeMillis());
            emailMap.put(receiveEmail,sendEmailDO);
        }
    
        /**
         * 功能描述: <br>
         * 〈验证验证码〉
    
         * @return:
         * @since: 1.0.0
         * @Author:
         * @Date:
         */
        public static boolean verifyCode(String email,String code ){
            //清理集合中过期的验证码
            cleanEmailMap();
            //如果集合中存在符合条件的验证码则返回true,否则false
            if(emailMap.containsKey(email)){
               if(emailMap.get(email).getCode().equals(code)){
                   return true;
               }
            }
            return false;
        }
    
        /**
         *清理验证码集合
          * @param
         *@return ()
         *@throws
         *@author yutf
         *@date 2020/5/23
         *
         */
        public static void cleanEmailMap() {
            //如果集合不为空
           if(!emailMap.isEmpty()){
               //循环集合;当前时间-验证码创建时间大于过期时间则清理验证码
               for (Map.Entry<String, SendEmailDO> stringSendEmailDOEntry : emailMap.entrySet()) {
                   if((System.currentTimeMillis()-stringSendEmailDOEntry.getValue().getSendTime())>expiredTime){
                       emailMap.remove(stringSendEmailDOEntry.getKey());
                   }
               }
           }
        }
    
        public static void main(String[] args) throws EmailException {
            String verifyCode = String
                    .valueOf(new Random().nextInt(899999) + 100000);//生成短信验证码
            System.out.println(verifyCode);
            //sendEmail("*******@qq.com","23443");
        }
    
    
    }

    实体类

    package com.******.util.email;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * Author tyf
     * Date  2019-12-19
     */
    @ApiModel(value = "邮箱设置实体")
    @Data
    public class EmailSettingDO implements Serializable {
        private static final long serialVersionUID = 1L;
        @ApiModelProperty(value = "主键(数据库自增)",name ="id",example = "1",notes = "自增主键在新增时无需传入")
        private long id;
        @ApiModelProperty(value = "主机名",name ="hostName")
        private String hostName;
        @ApiModelProperty(value = "邮箱地址",name ="sendMail")
        private String sendMail;
        @ApiModelProperty(value = "用户名",name ="userName")
        private String userName;
        @ApiModelProperty(value = "密码",name ="userNamePwd")
        private String userNamePwd;
        @ApiModelProperty(value = "授权名",name ="authenticationName")
        private String authenticationName;
        @ApiModelProperty(value = "标题",name ="title")
        private String title;
        @ApiModelProperty(value = "内容",name ="content")
        private String content;
    }

    map 保存实体

    package com.*******.util.email;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    @Data
    public class SendEmailDO implements Serializable {
    
        private String code;
    
        private Long sendTime;//如果使用localDateTime  请参考  上一边  验证码
    
    }

    此处根据自己的业务将相应的代码给出作为大家参考——主要是业务应用,不会吧相关所有代码给出

    /**
         * 获取邮箱验证码
         * @param email
         * @return
         */
        @GetMapping("/sendEmailCode")
        @ApiOperation(value = "获取邮箱验证码")
        R sendEmailCode( String email) throws Exception {//此处报异常是因为应用了全局异常拦截,不建议如此使用,建议try  catch 拦截 输出错误
            List<EmailSettingDO> list = emailSettingService.list(new HashMap<>());//此处查询邮箱设置参数
            if(list!=null&&!list.isEmpty()){
                EmailSettingDO emailSettingDO = list.get(0);
                EmailUtil.sendEmail(email,emailSettingDO);
                return R.ok();
            }
            return R.error();
    
        }
    
        /**
         * 修改邮箱
         * @param params
         * @return
         */
        @PutMapping("/updateEmail")
        @ApiOperation(value = "修改邮箱")
        R updateEmail( @RequestBody Map<String, Object> params) throws Exception {
            String code=params.get("code").toString();
            String email=params.get("email").toString();
            boolean b = EmailUtil.verifyCode(email, code);
            if(b){
                UserDO user =new UserDO();
                user.setUserId(getUser().getId());
                user.setEmail(email);
                user.setGmtModified(getCurrentTime());
                return R.operate(userService.updateUserInfo(user) > 0);
            }
            return R.error("验证码错误");
        }
  • 相关阅读:
    [JAVA] 运行 java HelloWorld 命令,提示“错误: 找不到或无法加载主类
    「Ubuntu」 终端更新时,报错
    【MATLAB】 运行Simulink时出现报错
    Ubuntu提示boot内存不足
    python+unittest+requests实现接口自动化的方法
    Python + Requests + Unittest接口自动化测试实例分析
    七.测试执行的log读取
    五.DDT测试驱动
    操作json文件
    四.爬取拉勾网实例
  • 原文地址:https://www.cnblogs.com/yutf/p/13177452.html
Copyright © 2011-2022 走看看