本项目是前端点击企业认证,后端进行发送邮件认证,具体实现代码如下:
package com.yh.producer.controller;
import java.io.UnsupportedEncodingException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;import javax.servlet.http.HttpServletRequest;
import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson.JSON;
 import com.google.gson.Gson;
 import com.yh.producer.entity.TblEnterpriseLogin;
 import com.yh.producer.page.Page;
 import com.yh.producer.service.TblEnterpriseLoginService;
 import com.yh.producer.util.CommonFunction;
 import com.yh.producer.util.EmailUtil;
 import com.yh.producer.util.GenerateIdUtil;
 import com.yh.producer.util.JsonUtils;@RestController
 @CrossOrigin(origins = "*", maxAge = 3600)
 @RequestMapping(value = "/tblEnterpriseLogin")
 public class TblEnterpriseLoginController {
     @Autowired
     private JdbcTemplate jdbcTemplate;
     @Autowired
     private TblEnterpriseLoginService tblEnterpriseLoginService;    private static Map<String, String> emailSecurityCode = new HashMap<String, String>();
     
     private Map<String, Integer> enterpriseLoginTimeMap = new HashMap<String, Integer>(); 
    /**
      * 退出,更新最新登录时间
      * @param accountNumber
      * @return
      */
     @RequestMapping(value = "/quit")
     public String quit(String accountNumber) {
         Map<String, Object> map = new HashMap<String, Object>();
         TblEnterpriseLogin tblEnterpriseLogin = new TblEnterpriseLogin();
         tblEnterpriseLogin.setAccountNumber(accountNumber);
         SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
         tblEnterpriseLogin.setLastLoginTime(sdf.format(new Date()));
         int result = tblEnterpriseLoginService.updateEnterpriseLogin(tblEnterpriseLogin);
         map.put("result", String.valueOf(result));
         return new Gson().toJson(map);
     }    /**
      * 修改密码
      * @param accountNumber:账号
      * @param oldPassword:当前密码
      * @param newPassword:新密码
      * @return 0-修改失败、1-修改成功、2-当前密码错误
      */
     @RequestMapping(value = "/changePassword")
     public String changePassword(String accountNumber, String oldPassword, String newPassword) {
         Map<String, Object> map = new HashMap<String, Object>();
         int result = tblEnterpriseLoginService.changePassword(accountNumber, oldPassword, newPassword);
         map.put("result", String.valueOf(result));
         return new Gson().toJson(map);
     }    /**
      * 忘记密码:发送邮件验证码
      * @param email 邮箱地址
      * @return
      */
     @RequestMapping(value = "/sendMobilePhoneSecurityCode")
     public String sendMobilePhoneSecurityCode(String mobilePhone) {
         System.out.println(">>>>>>>>>>>> 开始发送忘记密码邮件,邮件地址:" + mobilePhone);
         Map<String, Object> map = new HashMap<String, Object>();
         String email = mobilePhone;
         TblEnterpriseLogin tblEnterpriseLogin = tblEnterpriseLoginService.queryByEmail(email);
         if (tblEnterpriseLogin == null) {
             System.out.println(">>>>>>>>>>>> " + email + ">邮件对应用户不存在!");
             map.put("result", "0");
         } else {
             System.out.println(">>>>>>>>>>>> 开始发送忘记密码邮件,邮件对应用户信息:" + tblEnterpriseLogin.toString());
             if (!"2".equals(tblEnterpriseLogin.getEmailIdentif())) { // 邮箱没有验证
                 map.put("result", "0");
                 return new Gson().toJson(map);
             }
             if ("2".equals(tblEnterpriseLogin.getEmailIdentif())) {
                 String securityCode = EmailUtil.getRandomNum(4);
                 // 需要判断当前邮箱账户是否已经超出当天发送次数或者距离上次发送邮件不足1分钟
                 Map<String, Object> canSendMap = isCanSendEmail(email);
                 if (null != canSendMap) {
                     boolean isCan = (boolean) canSendMap.get("isCan");
                     if (!isCan) {
                         System.out.println("【单个邮箱每日次数限制】email=" + email + ", 无法发送验证码 提示前端");
                         map.put("result", "2");
                         return new Gson().toJson(map);
                     }; // 无法发送验证码 提示前端
                 } else {
                     System.out.println("【单个邮箱每日次数限制】" + email + ":获取验证码发送情况异常");
                     map.put("result", "2");
                     return new Gson().toJson(map);
                 }
 //                String isSuccess = EmailUtil.sendEmailSSl("忘记密码-验证码", "您好,您的邮箱验证码是:" + securityCode + ",请妥善保管!", email);                String result="忘记密码-验证码"+"|Y|"+"您好,您的邮箱验证码是:" + securityCode + ",请妥善保管!"+"|Y|"+email;
                 emailSecurityCode.put(email, securityCode); // 设置当前用户的邮箱验证码
                 Integer insertNum = saveSendEmailLog((String) canSendMap.get("id"), email);
                 System.out.println("【单个邮箱每日次数限制】初始化OR更新邮箱[" + email + "]单日发送次数记录数insertNum=" + insertNum);
                 System.out.println(email + "已发送邮箱验证码!验证码:" + securityCode);
                 return new Gson().toJson(result);
             }
         }
         return new Gson().toJson(map);
     }    /**
      * 邮箱验证码验证
      * @param email        邮箱账户
      * @param securityCode 验证码
      * @return 0-验证码验证失败、1-验证码验证成功
      */
     @RequestMapping(value = "/mobilePhoneSecurity")
     public String mobilePhoneSecurity(String mobilePhone, String securityCode) {
         Map<String, Object> map = new HashMap<String, Object>();
         String emailCode = emailSecurityCode.get(mobilePhone);
         if (securityCode.equals(emailCode)) {
             map.put("result", "1");
         } else {
             map.put("result", "0");
         }
         return new Gson().toJson(map);
     }    /**
      * 忘记密码
      * @param accountNumber
      * @param newPassword
      * @return 0-密码重置失败、1-密码重置成功
      */
     @RequestMapping(value = "/forgetPassword")
     public String forgetPassword(String mobilePhone, String newPassword) {
         Map<String, Object> map = new HashMap<String, Object>();
         int result = tblEnterpriseLoginService.forgetPassword(mobilePhone, newPassword);
         map.put("result", String.valueOf(result));
         return new Gson().toJson(map);
     }    /**
      * 发送认证邮件
      * @param accountNumber
      * @param comEmail
      * @return
      */
     @RequestMapping(value = "/sendEmail", method = RequestMethod.POST)
     public String sendEmail(@RequestParam(value = "accountNumber") String accountNumber,
             @RequestParam(value = "comEmail") String comEmail, @RequestParam(value = "url") String url) {
         System.out.println("accountNumber:" + accountNumber + "comEmail:" + comEmail);
         String newUrl = "http://" + url + "/accountInformation/checkEmail.html";
         // 需要判断当前邮箱账户是否已经超出当天发送次数或者距离上次发送邮件不足1分钟
         Map<String, Object> canSendMap = isCanSendEmail(comEmail);
         if (null == canSendMap) return "2";
         String mapMail="";
         try {
             System.out.println(canSendMap.get("isCan"));
             boolean isCan = (boolean) canSendMap.get("isCan");
             if (!isCan) {
                 System.out.println("【单个邮箱每日次数限制】无法发送验证码 提示前端");
                 return "2";
             } // 无法发送验证码 提示前端
             mapMail = EmailUtil.sendCompanyEmailToString(newUrl, accountNumber, comEmail);
         } catch (Exception e) {
             e.printStackTrace();
         }        TblEnterpriseLogin tblEnterpriseLogin = new TblEnterpriseLogin();
         try {
             // 更新发送邮件的日志表信息
             Integer insertNum = saveSendEmailLog((String) canSendMap.get("id"), comEmail);
             System.out.println("【单个邮箱每日次数限制】初始化OR更新邮箱[" + comEmail + "]单日发送次数记录数insertNum=" + insertNum);
             Base64 base64 = new Base64();
             tblEnterpriseLogin.setAccountNumber(new String(base64.decode(accountNumber), "UTF-8"));
             System.out.println(tblEnterpriseLogin.getAccountNumber());
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
         tblEnterpriseLogin.setEmail(comEmail);
         tblEnterpriseLoginService.updateEnterpriseLogin(tblEnterpriseLogin);
         String data = JsonUtils.objectToJson(mapMail);
         return data;
     }    /**
      * 认证邮箱
      * @param request
      * @param response
      * @return
      */
     @RequestMapping(value = "/checkEmail", method = RequestMethod.GET)
     public String checkEmail(String accountNumber, String time) {
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("result", "");
         return new Gson().toJson(map);
     }    /**
      * 验证手机号码是否认证存在
      * @param mobilePhone
      * @return
      */
     @RequestMapping(value = "/selectPhone", method = RequestMethod.POST)
     public String selectPhone(@RequestParam(value = "mobilePhone") String mobilePhone) {
         Map<String, Object> map = new HashMap<String, Object>();
         int result = tblEnterpriseLoginService.selectPhone(mobilePhone);
         map.put("result", result);
         return new Gson().toJson(map);
     }
  
     
     /**
      * 根据邮箱账户校验是否可以发送邮件
      * @param email 邮箱账户
      * @return 是否可以发送邮件
      */
     public Map<String, Object> isCanSendEmail(String email) {
         Map<String, Object> resultMap = new HashMap<String, Object>();
         // 1.查询当前账户今天的邮件记录
         String local6Date = CommonFunction.getLocalDate();
         String sql = "select * from tbl_email_log_info e where e.email='" + email + "' and e.create_tm like '" + local6Date + "%'";
         System.out.println("【单个邮箱每日次数限制】查询当前账户今天的邮件记录sql=\n" + sql);
         List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
         if (null == list || list.size() == 0) {
             resultMap.put("isCan", true); // 是否可以发送邮件
             resultMap.put("id", "");
             return resultMap;
         }
         // 2.当日已经发送的次数
         Integer sendCnt = (Integer) list.get(0).get("send_cnt");
         if (sendCnt >= 20) {
             System.out.println("【单个邮箱每日次数限制】" + email + "该邮箱今日发送邮件次数超限!!!");
             resultMap.put("isCan", false); // 是否可以发送邮件
             return resultMap;
         }
         // 3.距离上次发送时间差
         try {
             String lastSendTm = (String) list.get(0).get("last_send_tm");
             String now = CommonFunction.getLocalTime14();
             if (StringUtils.isNotBlank(lastSendTm)) {
                 Date last = new SimpleDateFormat("yyyyMMddHHmmss").parse(lastSendTm);
                 Date nowTm = new SimpleDateFormat("yyyyMMddHHmmss").parse(now);
                 long lastSed = last.getTime() / 1000;
                 long nowSed = nowTm.getTime() / 1000;
                 if ((nowSed - lastSed) <= 60) {
                     System.out.println("【单个邮箱每日次数限制】" + email + "该邮箱距离上次发送记录未过1分钟!!!");
                     resultMap.put("isCan", false); // 是否可以发送邮件
                     resultMap.put("id", null == list.get(0).get("id") ? "" : list.get(0).get("id"));
                 } else {
                     resultMap.put("isCan", true); // 是否可以发送邮件
                     resultMap.put("id", null == list.get(0).get("id") ? "" : list.get(0).get("id"));
                 }
                 return resultMap;
             }
         } catch (Exception e) {
             return null;
         }
         return null;
     }
     
     /**
      * 根据数据主键、邮箱账户更新当日邮件发送次数
      * @param id 数据主键
      * @param email 邮箱账户
      * @return
      */
     public Integer saveSendEmailLog(String id, String email) {
         if (StringUtils.isNotBlank(id)) {
             System.out.println("【单个邮箱每日次数限制】根据数据主键、邮箱账户“更新”当日邮件发送次数!id=" + id + ", email=" + email);
             String sql = "update tbl_email_log_info set last_send_tm='" + CommonFunction.getLocalTime14()
                     + "', send_cnt=send_cnt+1, last_upd_tm='" + CommonFunction.getLocalTime14() + "' where id='" + id + "'";
             return jdbcTemplate.update(sql);
         } else {
             String pimKey = GenerateIdUtil.createRandomCharData(8);
             System.out.println("【单个邮箱每日次数限制】“初始化”当日邮件发送次数为1!pimKey=" + pimKey + ", email=" + email);
             String localTime14 = CommonFunction.getLocalTime14();
             String sql = "insert into tbl_email_log_info (id, email, last_send_tm, send_cnt, create_tm) "
                     + " values ('" + pimKey + "', '" + email + "', '" + localTime14 + "', 1, '" + localTime14 + "')";
             return jdbcTemplate.update(sql);
         }
     }}
、
/**
      * 根据邮箱账户校验是否可以发送邮件
      * @param email 邮箱账户
      * @return 是否可以发送邮件
      */
     public Map<String, Object> isCanSendEmail(String email) {
         Map<String, Object> resultMap = new HashMap<String, Object>();
         // 1.查询当前账户今天的邮件记录
         String local6Date = CommonFunction.getLocalDate();
         String sql = "select * from tbl_email_log_info e where e.email='" + email + "' and e.create_tm like '" + local6Date + "%'";
         System.out.println("【单个邮箱每日次数限制】查询当前账户今天的邮件记录sql=\n" + sql);
         List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
         if (null == list || list.size() == 0) {
             resultMap.put("isCan", true); // 是否可以发送邮件
             resultMap.put("id", "");
             return resultMap;
         }
         // 2.当日已经发送的次数
         Integer sendCnt = (Integer) list.get(0).get("send_cnt");
         if (sendCnt >= 20) {
             System.out.println("【单个邮箱每日次数限制】" + email + "该邮箱今日发送邮件次数超限!!!");
             resultMap.put("isCan", false); // 是否可以发送邮件
             return resultMap;
         }
         // 3.距离上次发送时间差
         try {
             String lastSendTm = (String) list.get(0).get("last_send_tm");
             String now = CommonFunction.getLocalTime14();
             if (StringUtils.isNotBlank(lastSendTm)) {
                 Date last = new SimpleDateFormat("yyyyMMddHHmmss").parse(lastSendTm);
                 Date nowTm = new SimpleDateFormat("yyyyMMddHHmmss").parse(now);
                 long lastSed = last.getTime() / 1000;
                 long nowSed = nowTm.getTime() / 1000;
                 if ((nowSed - lastSed) <= 60) {
                     System.out.println("【单个邮箱每日次数限制】" + email + "该邮箱距离上次发送记录未过1分钟!!!");
                     resultMap.put("isCan", false); // 是否可以发送邮件
                     resultMap.put("id", null == list.get(0).get("id") ? "" : list.get(0).get("id"));
                 } else {
                     resultMap.put("isCan", true); // 是否可以发送邮件
                     resultMap.put("id", null == list.get(0).get("id") ? "" : list.get(0).get("id"));
                 }
                 return resultMap;
             }
         } catch (Exception e) {
             return null;
         }
         return null;
     } 
/***
      * 拼接后返回 不发送
      * @param url
      * @param accountNumber
      * @param email
      * @return
      */
     public static String sendCompanyEmailToString(String url, String accountNumber, String email) {        String title = "*******企业邮箱认证(请在24小时内验证)";
         long time = System.currentTimeMillis();
         StringBuffer sb = new StringBuffer();
         sb.append("<a href=\"");
         sb.append(url);
         sb.append("?accountNumber=");
         sb.append(accountNumber);
         sb.append("&time=");
         sb.append(String.valueOf(time));
         sb.append("\">点此认证企业");
         String result=title+"|Y|"+sb+"|Y|"+email;
         return result;
     } 
/**
      * 根据数据主键、邮箱账户更新当日邮件发送次数
      * @param id 数据主键
      * @param email 邮箱账户
      * @return
      */
     public Integer saveSendEmailLog(String id, String email) {
         if (StringUtils.isNotBlank(id)) {
             System.out.println("【单个邮箱每日次数限制】根据数据主键、邮箱账户“更新”当日邮件发送次数!id=" + id + ", email=" + email);
             String sql = "update tbl_email_log_info set last_send_tm='" + CommonFunction.getLocalTime14()
                     + "', send_cnt=send_cnt+1, last_upd_tm='" + CommonFunction.getLocalTime14() + "' where id='" + id + "'";
             return jdbcTemplate.update(sql);
         } else {
             String pimKey = GenerateIdUtil.createRandomCharData(8);
             System.out.println("【单个邮箱每日次数限制】“初始化”当日邮件发送次数为1!pimKey=" + pimKey + ", email=" + email);
             String localTime14 = CommonFunction.getLocalTime14();
             String sql = "insert into tbl_email_log_info (id, email, last_send_tm, send_cnt, create_tm) "
                     + " values ('" + pimKey + "', '" + email + "', '" + localTime14 + "', 1, '" + localTime14 + "')";
             return jdbcTemplate.update(sql);
         }
     }/**
      * 一个obj对象转换为json格式
      *@descript
      *@param obj
      *@return
      */
     public static String objectToJson(Object obj) {
         StringBuilder json = new StringBuilder();
         if (obj == null) {
             json.append("\"\"");
         } else if (obj instanceof Number) {
             json.append(numberToJson((Number) obj));
         } else if (obj instanceof Boolean) {
             json.append(booleanToJson((Boolean) obj));
         } else if (obj instanceof String) {
             json.append("\"").append(stringToJson(obj.toString())).append("\"");
         } else if (obj instanceof Object[]) {
             json.append(arrayToJson((Object[]) obj));
         } else if (obj instanceof List) {
             json.append(listToJson((List<?>) obj));
         } else if (obj instanceof Map) {
             json.append(mapToJson((Map<?, ?>) obj));
         } else if (obj instanceof Set) {
             json.append(setToJson((Set<?>) obj));
         } else {
             json.append(beanToJson(obj));
         }
         return json.toString();
     }
    
     public static String numberToJson(Number number) {
         return number.toString();
     }
    
     public static String booleanToJson(Boolean bool) {
         return bool.toString();
     } 
 
@Override
     public TblEnterpriseLogin queryByEmail(String email) {
         TblEnterpriseLoginExample example = new TblEnterpriseLoginExample();
         example.createCriteria().andEmailEqualTo(email);
         List<TblEnterpriseLogin> list = tblEnterpriseLoginMapper.selectByExample(example);
         if (list.size() > 0) {
             return list.get(0);
         } else {
             return null;
         }
     } 
/**
      * 根据输入的字符长度返回随机的纯数字字符串
      * @param length 随机的纯数字字符串长度
      * @return
      */
     public static String getRandomNum(Integer length) {
         String sources = "0123456789";
         Random rand = new Random();
         StringBuffer randomCode = new StringBuffer();
         for (int j = 0; j < length; j++) {
             randomCode.append(sources.charAt(rand.nextInt(9)) + "");
         }
         return randomCode.toString();
     }