java实现发送邮件认证以及邮箱找回密码

本项目是前端点击企业认证,后端进行发送邮件认证,具体实现代码如下:

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();
    }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java发送电子邮件可以使用JavaMail API。以下是一个简单的示例代码,演示如何使用JavaMail发送电子邮件: 首先,需要导入JavaMail和相关的依赖库。你可以从JavaMail官方网站下载它们,或者使用Maven/Gradle等构建工具进行引入。 ```java import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class EmailSender { public static void main(String[] args) { // 邮件发送者的邮箱账号和密码 String senderEmail = "your_sender_email@example.com"; String senderPassword = "your_sender_password"; // 邮件接收者的邮箱地址 String recipientEmail = "recipient@example.com"; // 邮件主题和内容 String emailSubject = "Hello from JavaMail"; String emailContent = "This is a test email sent from JavaMail."; // 配置发送邮件的属性 Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.example.com"); // 邮件服务器主机名 props.put("mail.smtp.port", "587"); // 邮件服务器端口号 // 创建Session对象,并根据配置信息创建认证器 Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmail, senderPassword); } }); try { // 创建MimeMessage对象 Message message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(senderEmail)); // 设置收件人 message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail)); // 设置邮件主题 message.setSubject(emailSubject); // 设置邮件正文 message.setText(emailContent); // 发送邮件 Transport.send(message); System.out.println("Email sent successfully."); } catch (MessagingException e) { e.printStackTrace(); } } } ``` 在代码中,你需要替换以下内容: - `your_sender_email@example.com`:发送者的电子邮箱地址。 - `your_sender_password`:发送者的电子邮箱密码。 - `recipient@example.com`:接收者的电子邮箱地址。 - `smtp.example.com`:SMTP服务器主机名。根据你使用的电子邮箱提供商不同,主机名可能会有所不同。 请确保已经安装并正确配置了JavaMail API,以及正确填写了邮件发送和接收的相关信息。运行代码后,如果一切正常,你将看到输出信息"Email sent successfully.",表示邮件已成功发送。 这只是一个简单的示例,实际使用中可能需要更多的配置和处理,例如添加附件、HTML格式的邮件内容等。你可以根据自己的需求进行扩展和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java--成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值