package com.yc.crm.mail.action; import com.sun.mail.imap.IMAPStore; import com.yc.action.mail.EmailConfigUtils; import com.yc.crm.mail.entity.T482102Entity; import com.yc.crm.mail.service.MailAccountIfc; import com.yc.crm.mail.service.MailIfc; import com.yc.crm.mail.util.AllBackMsg; import com.yc.entity.DataSourceEntity; import com.yc.multiData.MultiDataSource; import com.yc.multiData.SpObserver; import com.yc.utils.SessionKey; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.mail.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; /** * @BelongsProject: eCoWorksV3 * @BelongsPackage: com.yc.crm.action * @author: xinyb * @CreateTime: 2024-07-19 17:33 * @Description: 个人邮箱配置 */ @CrossOrigin @RestController @RequestMapping("/crm/mail/account") public class MailAccount { @Autowired MailAccountIfc mailAccountIfc; @Autowired MailIfc mailIfc; /** * 添加邮箱配置信息 * * @param account * @param request * @param response * @return */ @PostMapping("/addAccount.do") public AllBackMsg addAccount(@RequestBody T482102Entity account, HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { if (StringUtils.isBlank(account.getEmail())) { msg.setFail("请输入邮箱账号"); return msg; } if (account.getMailType().equals(0) || account.getMailType().equals(1)) { if (StringUtils.isBlank(account.getPassword())) { msg.setFail("请输入邮箱密码"); return msg; } account.setReceiveEmail(account.getEmail()); account.setReceivePassword(account.getPassword()); account.setSmtpEmail(account.getEmail()); account.setSmtpPassword(account.getPassword()); } if (account.getMailType().equals(1) || account.getMailType().equals(2)) { if (StringUtils.isBlank(account.getReceiveProtocol())) { msg.setFail("请选择协议类型"); return msg; } if (StringUtils.isBlank(account.getReceiveHost())) { msg.setFail("请输入收邮件服务器"); return msg; } if (account.getReceivePort().equals(0)) { msg.setFail("请输入收邮件服务器端口"); return msg; } if (StringUtils.isBlank(account.getSmtpHost())) { msg.setFail("请输入发邮件服务器"); return msg; } if (account.getSmtpPort().equals(0)) { msg.setFail("请输入发邮件服务器端口"); return msg; } if (account.getMailType().equals(2)) { if (StringUtils.isBlank(account.getReceiveEmail())) { msg.setFail("请输入收件账号"); return msg; } if (StringUtils.isBlank(account.getReceivePassword())) { msg.setFail("请输入收件密码"); return msg; } if (StringUtils.isBlank(account.getSmtpEmail())) { msg.setFail("请输入发件账号"); return msg; } if (StringUtils.isBlank(account.getSmtpPassword())) { msg.setFail("请输入发件密码"); return msg; } } } HttpSession session = request.getSession(); String companyId = (String) session.getAttribute(SessionKey.COMPANY_ID); String companyName = (String) session.getAttribute(SessionKey.COMPANY_NAME); String userCode = (String) session.getAttribute(SessionKey.USERCODE); String userName = (String) session.getAttribute(SessionKey.USER_NAME); account.setCompanyId(companyId); account.setCompanyName(companyName); account.setUserCode(userCode); account.setUserName(userName); if (account.getMailType().equals(0)) { //初始配置 getMailConfigProperties(account); } DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); //邮件检测 String error = emailDetection(account); if (StringUtils.isNotBlank(error)) { account.setMailStatus("异常"); } mailAccountIfc.addEmailAccount(account);//添加新的邮箱配置 Map map = new HashMap<>(); if (StringUtils.isBlank(error)) { map.put("companyId", companyId); map.put("companyName", companyName); map.put("userCode", userCode); map.put("userName", userName); map.put("email", account.getEmail()); msg.setSuccess("已保存", map); } else { map.put("mailStatus", "异常"); map.put("error", error); msg.setSuccess("执行成功", map); } } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 添加别名邮箱 * * @param account * @param request * @param response * @return */ @GetMapping("/addAliasEmail.do") public AllBackMsg addAliasEmail(String aliasEmail, Integer accountId, HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { if (StringUtils.isBlank(aliasEmail)) { msg.setFail("请输入别名邮箱"); return msg; } if (accountId.equals(0)) { msg.setFail("邮箱账号Id不能为空"); return msg; } HttpSession session = request.getSession(); String userCode = (String) session.getAttribute(SessionKey.USERCODE); if (StringUtils.isBlank(userCode)) { msg.setFail("登录用户已过期,请检查"); return msg; } DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); T482102Entity t482102Entity = mailAccountIfc.getAccountInfo(userCode, accountId); if (t482102Entity.getMailType().equals(0) || t482102Entity.getMailType().equals(1)) { t482102Entity.setEmail(aliasEmail); t482102Entity.setReceiveEmail(aliasEmail); t482102Entity.setSmtpEmail(aliasEmail); } //邮箱检测 String error = emailDetection(t482102Entity); Map map = new HashMap<>(); if (StringUtils.isBlank(error)) { mailAccountIfc.updateAliasEmail(aliasEmail, accountId); map.put("userCode", userCode); map.put("aliasEmail", aliasEmail); map.put("accountId", accountId); msg.setSuccess("已保存", map); } else { map.put("mailStatus", "异常"); map.put("error", error); msg.setSuccess("执行成功", map); } } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 更新邮箱配置信息 * * @param account * @param request * @param response * @return */ @PostMapping("/updateAccount.do") public AllBackMsg updateAccount(@RequestBody T482102Entity account, HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { if (account.getAccountId() == 0) { msg.setFail("获取不到邮箱配置ID,请检查"); return msg; } if (StringUtils.isBlank(account.getEmail())) { msg.setFail("请输入邮箱账号"); return msg; } if (account.getMailType().equals(0)) { account.setMailType(1); } if (account.getMailType().equals(1)) { if (StringUtils.isBlank(account.getPassword())) { msg.setFail("请输入邮箱密码"); return msg; } account.setReceiveEmail(account.getEmail()); account.setReceivePassword(account.getPassword()); account.setSmtpEmail(account.getEmail()); account.setSmtpPassword(account.getPassword()); } else if (account.getMailType().equals(2)) { if (StringUtils.isBlank(account.getReceiveEmail())) { msg.setFail("请输入收件账号"); return msg; } if (StringUtils.isBlank(account.getReceivePassword())) { msg.setFail("请输入收件密码"); return msg; } if (StringUtils.isBlank(account.getSmtpEmail())) { msg.setFail("请输入发件账号"); return msg; } if (StringUtils.isBlank(account.getSmtpPassword())) { msg.setFail("请输入发件密码"); return msg; } } if (StringUtils.isBlank(account.getReceiveHost())) { msg.setFail("请输入收邮件服务器"); return msg; } if (account.getReceivePort().equals(0)) { msg.setFail("请输入收邮件服务器端口"); return msg; } if (StringUtils.isBlank(account.getSmtpHost())) { msg.setFail("请输入发邮件服务器"); return msg; } if (account.getSmtpPort().equals(0)) { msg.setFail("请输入发邮件服务器端口"); return msg; } HttpSession session = request.getSession(); String userCode = (String) session.getAttribute(SessionKey.USERCODE); String userName = (String) session.getAttribute(SessionKey.USER_NAME); if (StringUtils.isBlank(userCode)) { msg.setFail("登录用户已过期,请检查"); return msg; } account.setUserCode(userCode); DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); mailAccountIfc.updateEmailAccount(account); String error = emailDetection(account); Map map = new HashMap<>(); if (StringUtils.isBlank(error)) { map.put("userCode", userCode); map.put("userName", userName); map.put("email", account.getEmail()); msg.setSuccess("已更新", map); } else { //异常处理 mailAccountIfc.updateMailStatus("异常", account.getAccountId()); map.put("mailStatus", "异常"); map.put("error", error); msg.setSuccess("执行成功", map); } } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 删除邮箱配置信息 * * @param account * @param request * @param response * @return */ @PostMapping("/deleteAccount.do") public AllBackMsg deleteAccount(@RequestParam(defaultValue = "0") Integer accountId, HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { if (accountId == 0) { msg.setFail("邮箱编号ID获取不到"); return msg; } HttpSession session = request.getSession(); String userCode = (String) session.getAttribute(SessionKey.USERCODE); if (StringUtils.isBlank(userCode)) { msg.setFail("登录用户已过期,请检查"); return msg; } DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); Integer cont = mailAccountIfc.deleteEmailAccount(userCode, accountId); if (cont > 0) { msg.setOk("已删除"); } } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 查询邮箱配置列表 * * @param search 搜索 * @param request * @param response * @return */ @GetMapping("/getAccountList.do") public AllBackMsg getAccountList(HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { HttpSession session = request.getSession(); String userCode = (String) session.getAttribute(SessionKey.USERCODE); DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); List t482102Entities = mailAccountIfc.getAccount(userCode); if (t482102Entities.size() > 0) { msg.setSuccess("执行成功", t482102Entities); } else { msg.setFail("未找到配置信息,0条数据"); } } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 查询个人邮箱信息 * * @param search 搜索 * @param request * @param response * @return */ @GetMapping("/getAccount.do") public AllBackMsg getAccount(String mail, HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { if (StringUtils.isBlank(mail)) { msg.setFail("参数 邮件账号 不能为空"); return msg; } HttpSession session = request.getSession(); String userCode = (String) session.getAttribute(SessionKey.USERCODE); DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); T482102Entity t482102Entities = mailAccountIfc.getAccountInfo(userCode, mail); if (StringUtils.isNotBlank(t482102Entities.getEmail())) { msg.setSuccess("执行成功", t482102Entities); } else { msg.setFail("未找到配置信息"); } } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 检测绑定是否有效 * * @param email * @param request * @param response * @return */ @GetMapping("/isEmailValid.do") public AllBackMsg isEmailValid(String email, HttpServletRequest request, HttpServletResponse response) { AllBackMsg msg = new AllBackMsg(); try { HttpSession session = request.getSession(); String userCode = (String) session.getAttribute(SessionKey.USERCODE); if (StringUtils.isBlank(userCode)) { msg.setFail("登录用户已过期,请检查"); return msg; } if (StringUtils.isBlank(email)) { msg.setFail("检测绑定邮箱不能为空"); return msg; } DataSourceEntity dataSource = MultiDataSource.getDataSourceMap(request);//获取数据源 SpObserver.setDBtoInstance("_" + dataSource.getDbId()); //根据当前用户查询绑定的邮箱信息 T482102Entity emailEntity = mailAccountIfc.getAccountInfo(userCode, email);//返回邮箱的账号信息 if (emailEntity == null || StringUtils.isBlank(emailEntity.getEmail())) { msg.setFail("找不到邮箱:" + email + "配置信息请完善。"); return msg; } String error = emailDetection(emailEntity); Map map = new HashMap<>(); if (StringUtils.isBlank(error)) { // map.put("code", "0"); map.put("email", emailEntity.getEmail()); map.put("protocol", emailEntity.getReceiveProtocol()); map.put("receiveHost", emailEntity.getReceiveHost()); map.put("receiveSSL", emailEntity.isReceiveSSL()); map.put("receivePort", emailEntity.getReceivePort()); map.put("smtpHost", emailEntity.getSmtpHost()); map.put("smtpSSL", emailEntity.isSmtpSSL()); map.put("smtpPort", emailEntity.getSmtpPort()); map.put("proxyFlag", emailEntity.isProxyFlag()); map.put("biSyncFlag", emailEntity.isBiSyncFlag()); map.put("mailStatus", emailEntity.getMailStatus()); msg.setSuccess("执行成功", map); } else { //异常处理 mailAccountIfc.updateMailStatus("异常", emailEntity.getAccountId()); // map.put("code", "-1"); map.put("mailStatus", "异常"); map.put("error", error); msg.setSuccess("执行成功", map); } } catch (MessagingException e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } catch (Exception e) { msg.setFail(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); } finally { SpObserver.setDBtoInstance(); } return msg; } /** * 邮箱检测 * * @param emailEntity * @return * @throws MessagingException */ private String emailDetection(T482102Entity emailEntity) throws MessagingException { String errorMsg = ""; try { Properties props = new Properties(); props.put("mail.store.protocol", "imaps");//emailEntity.getReceiveProtocol()); // IMAP over SSL props.put("mail.imaps.host", emailEntity.getReceiveHost()); props.put("mail.imaps.port", emailEntity.getReceivePort()); props.put("mail.imaps.starttls.enable", "true");//// IMAP 协议设置 STARTTLS props.put("mail.smtp.host", emailEntity.getSmtpHost()); // 替换为你的SMTP服务器 props.put("mail.smtp.port", emailEntity.getSmtpPort()); // 或者你使用的端口 props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true");//启用tls props.put("mail.smtp.ssl.enable", emailEntity.isSmtpSSL() + "");//启用SSL HashMap IAM = new HashMap(); //带上IMAP ID信息,由key和value组成,例如name,version,vendor,support-email等。 IAM.put("name", emailEntity.getReceiveEmail()); IAM.put("version", emailEntity.getDocVersion() + ""); IAM.put("vendor", emailEntity.getCompanyName()); IAM.put("support-email", emailEntity.getEmail()); //创建会话 Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(emailEntity.getReceiveEmail(), emailEntity.getReceivePassword()); } }); //存储对象 IMAPStore store = (IMAPStore) session.getStore(emailEntity.getReceiveProtocol());//imap协议或pop3协议类型(推荐你使用IMAP协议来存取服务器上的邮件。) //连接 store.connect(emailEntity.getReceiveHost(), emailEntity.getReceiveEmail(), emailEntity.getReceivePassword()); store.id(IAM);//163邮箱需要,不然会报:A3 NO SELECT Unsafe Login. Please contact kefu@188.com for help Folder folder = null; // 获得收件箱 folder = store.getFolder("INBOX"); // 以读写模式打开收件箱 folder.open(Folder.READ_WRITE); folder.close(false); store.close(); // Session mailSession = Session.getInstance(props, new Authenticator() { // @Override // protected PasswordAuthentication getPasswordAuthentication() { // return new PasswordAuthentication(emailEntity.getEmail(), emailEntity.getPassword()); // } // }); Transport transport = session.getTransport(); transport.connect(); transport.close(); } catch (MessagingException e) { errorMsg = e.getCause() != null ? e.getCause().getMessage() : e.getMessage(); } catch (Exception e) { errorMsg = e.getCause() != null ? e.getCause().getMessage() : e.getMessage(); } return errorMsg; } private T482102Entity getMailConfigProperties(T482102Entity t482102) { try { String email = t482102.getEmail(); int index = email.lastIndexOf("@"); String emailSuffix = email.substring(index + 1).toLowerCase();//邮箱后缀 String port = ""; t482102.setReceiveHost(EmailConfigUtils.getMailConfig("mail.imap.host." + emailSuffix)); t482102.setSmtpHost(EmailConfigUtils.getMailConfig("mail.smtp.host." + emailSuffix)); port = EmailConfigUtils.getMailConfig("mail.imap.port." + emailSuffix); if (StringUtils.isNotBlank(port)) { t482102.setReceivePort(Integer.parseInt(port)); } port = EmailConfigUtils.getMailConfig("mail.smtp.port." + emailSuffix); if (StringUtils.isNotBlank(port)) { t482102.setSmtpPort(Integer.parseInt(port)); } } catch (Exception e) { return t482102; } return t482102; } }