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("验证码错误");
    }
原文地址:https://www.cnblogs.com/yutf/p/13177452.html