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;

/**
 * 功能描述: 
* 〈邮箱发送验证码〉 * 业务要求:可以修改发件邮箱,所以此处给出的参数存在数据库内的 *
@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 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); } /** * 功能描述:
* 〈验证验证码〉 *
@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 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 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 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 邮箱发送验证码)