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<String, Object> map = new HashMap<>();
|
if (StringUtils.isBlank(error)) {
|
map.put("code", 0);
|
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("code", -1);
|
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<String, Object> map = new HashMap<>();
|
if (StringUtils.isBlank(error)) {
|
mailAccountIfc.updateAliasEmail(aliasEmail, accountId);
|
map.put("code", 0);
|
map.put("userCode", userCode);
|
map.put("aliasEmail", aliasEmail);
|
map.put("accountId", accountId);
|
msg.setSuccess("已保存", map);
|
} else {
|
map.put("code", -1);
|
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<String, Object> map = new HashMap<>();
|
if (StringUtils.isBlank(error)) {
|
map.put("code", 0);
|
map.put("userCode", userCode);
|
map.put("userName", userName);
|
map.put("email", account.getEmail());
|
msg.setSuccess("已更新", map);
|
} else {
|
//异常处理
|
mailAccountIfc.updateMailStatus("异常", account.getAccountId());
|
map.put("code", -1);
|
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<T482102Entity> 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<String, Object> 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", "正常");
|
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();
|
|
Transport transport = session.getTransport();
|
transport.connect();
|
transport.close();
|
mailAccountIfc.updateMailStatus("正常", emailEntity.getAccountId());
|
} 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;
|
}
|
}
|