|
@@ -1,15 +1,16 @@
|
|
package com.fjhx.email.service.impl;
|
|
package com.fjhx.email.service.impl;
|
|
|
|
|
|
-import cn.hutool.core.date.DateTime;
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.io.IORuntimeException;
|
|
import cn.hutool.core.io.IORuntimeException;
|
|
import cn.hutool.core.thread.ThreadUtil;
|
|
import cn.hutool.core.thread.ThreadUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.fjhx.email.config.TaskPoolConfig;
|
|
import com.fjhx.email.config.TaskPoolConfig;
|
|
-import com.fjhx.email.config.base.BaseEntity;
|
|
|
|
import com.fjhx.email.config.exception.ServiceException;
|
|
import com.fjhx.email.config.exception.ServiceException;
|
|
-import com.fjhx.email.entity.*;
|
|
|
|
|
|
+import com.fjhx.email.entity.EnterpriseFolder;
|
|
|
|
+import com.fjhx.email.entity.EnterpriseMessage;
|
|
|
|
+import com.fjhx.email.entity.PersonalFolder;
|
|
|
|
+import com.fjhx.email.entity.PersonalMessage;
|
|
import com.fjhx.email.entity.dto.MailFolderInfo;
|
|
import com.fjhx.email.entity.dto.MailFolderInfo;
|
|
import com.fjhx.email.entity.dto.MailInfo;
|
|
import com.fjhx.email.entity.dto.MailInfo;
|
|
import com.fjhx.email.entity.dto.MailSyncInfo;
|
|
import com.fjhx.email.entity.dto.MailSyncInfo;
|
|
@@ -17,6 +18,7 @@ import com.fjhx.email.entity.dto.MailboxInfo;
|
|
import com.fjhx.email.service.*;
|
|
import com.fjhx.email.service.*;
|
|
import com.fjhx.email.utils.EmailUtil;
|
|
import com.fjhx.email.utils.EmailUtil;
|
|
import com.fjhx.email.utils.HxHttpUtil;
|
|
import com.fjhx.email.utils.HxHttpUtil;
|
|
|
|
+import com.sun.mail.imap.IMAPFolder;
|
|
import com.sun.mail.imap.IMAPMessage;
|
|
import com.sun.mail.imap.IMAPMessage;
|
|
import com.sun.mail.imap.IMAPStore;
|
|
import com.sun.mail.imap.IMAPStore;
|
|
import com.sun.mail.util.MailConnectException;
|
|
import com.sun.mail.util.MailConnectException;
|
|
@@ -54,18 +56,12 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
private Executor emailTaskExecutor;
|
|
private Executor emailTaskExecutor;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
- private IPersonalMailboxService personalMailboxService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
private IPersonalFolderService personalFolderService;
|
|
private IPersonalFolderService personalFolderService;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private IPersonalMessageService personalMessageService;
|
|
private IPersonalMessageService personalMessageService;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
- private IEnterpriseMailboxService enterpriseMailboxService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
private IEnterpriseFolderService enterpriseFolderService;
|
|
private IEnterpriseFolderService enterpriseFolderService;
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
@@ -156,7 +152,7 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
// 累计同步次数
|
|
// 累计同步次数
|
|
num++;
|
|
num++;
|
|
|
|
|
|
- // log.info("开始第 {} 伦邮件同步,共同步 {} 个邮箱", num, mailboxSize);
|
|
|
|
|
|
+ log.info("开始第 {} 伦邮件同步,共同步 {} 个邮箱", num, mailboxSize);
|
|
|
|
|
|
// 定义一个线程计数器
|
|
// 定义一个线程计数器
|
|
CountDownLatch countDownLatch = new CountDownLatch(mailboxSize);
|
|
CountDownLatch countDownLatch = new CountDownLatch(mailboxSize);
|
|
@@ -169,9 +165,10 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
try {
|
|
try {
|
|
synchronousMail(mailbox);
|
|
synchronousMail(mailbox);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- log.error("发生未知异常", e);
|
|
|
|
|
|
+ log.error("同步邮件发生未知异常", e);
|
|
|
|
+ } finally {
|
|
|
|
+ countDownLatch.countDown();
|
|
}
|
|
}
|
|
- countDownLatch.countDown();
|
|
|
|
});
|
|
});
|
|
|
|
|
|
}
|
|
}
|
|
@@ -237,7 +234,7 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- Folder folder = store.getFolder(mailFolder.getName());
|
|
|
|
|
|
+ IMAPFolder folder = (IMAPFolder) store.getFolder(mailFolder.getName());
|
|
|
|
|
|
try {
|
|
try {
|
|
// 只读方式打开收件箱
|
|
// 只读方式打开收件箱
|
|
@@ -254,31 +251,17 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- // 如果邮件最后一封和最后一次同步id相同,则代表没有新邮件
|
|
|
|
- IMAPMessage message = (IMAPMessage) messages[messages.length - 1];
|
|
|
|
- int messageNumber = message.getMessageNumber();
|
|
|
|
- Date receivedDate = message.getReceivedDate();
|
|
|
|
-
|
|
|
|
- if (Objects.equals(messageNumber, mailFolder.getLastMessageNumber())) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
// 拉取邮件
|
|
// 拉取邮件
|
|
- List<MailInfo> mailInfoList = getMailInfoList(mailFolder, messages);
|
|
|
|
-
|
|
|
|
- Integer lastMessageNumber = mailFolder.getLastMessageNumber();
|
|
|
|
- Date lastReceivedDate = mailFolder.getLastReceivedDate();
|
|
|
|
|
|
+ List<MailInfo> mailInfoList = getMailInfoList(folder, mailFolder, messages);
|
|
|
|
|
|
- // 保存最后一份邮件id与收件时间
|
|
|
|
- mailFolder.setLastMessageNumber(messageNumber);
|
|
|
|
- mailFolder.setLastReceivedDate(receivedDate);
|
|
|
|
|
|
+ // 保存邮件数据,更新文件夹最后同步邮件时间
|
|
|
|
+ saveMailInfo(mailboxInfo, mailFolder, mailInfoList);
|
|
|
|
|
|
- try {
|
|
|
|
- saveMailInfo(mailboxInfo, mailFolder, mailInfoList);
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- // 回滚
|
|
|
|
- mailFolder.setLastMessageNumber(lastMessageNumber);
|
|
|
|
- mailFolder.setLastReceivedDate(lastReceivedDate);
|
|
|
|
|
|
+ // 更新更新最后一封邮件uid以及接收时间
|
|
|
|
+ if (ObjectUtil.isNotEmpty(mailInfoList)) {
|
|
|
|
+ MailInfo mailInfo = mailInfoList.get(mailInfoList.size() - 1);
|
|
|
|
+ mailFolder.setLastUid(mailInfo.getUid());
|
|
|
|
+ mailFolder.setLastReceivedDate(mailInfo.getReceivedDate());
|
|
}
|
|
}
|
|
|
|
|
|
} finally {
|
|
} finally {
|
|
@@ -330,59 +313,46 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
/**
|
|
/**
|
|
* 拉取邮件
|
|
* 拉取邮件
|
|
*/
|
|
*/
|
|
- private List<MailInfo> getMailInfoList(MailFolderInfo mailFolder, Message[] messages) throws MessagingException {
|
|
|
|
|
|
+ private List<MailInfo> getMailInfoList(IMAPFolder folder, MailFolderInfo mailFolder, Message[] messages) throws MessagingException {
|
|
|
|
|
|
- // 获取最后一次发件id
|
|
|
|
- Integer lastMessageNumber = mailFolder.getLastMessageNumber();
|
|
|
|
- // 获取最后一次收件的发送时间
|
|
|
|
|
|
+ // 上次同步邮件uid
|
|
|
|
+ Long lastUid = mailFolder.getLastUid();
|
|
|
|
+
|
|
|
|
+ // 上次同步邮件接收时间
|
|
Date lastReceivedDate = mailFolder.getLastReceivedDate();
|
|
Date lastReceivedDate = mailFolder.getLastReceivedDate();
|
|
- // 同步时间
|
|
|
|
- DateTime date = DateUtil.offsetDay(new Date(), -MailSyncInfo.initDay);
|
|
|
|
- // 最多只同步 initDay 天数据
|
|
|
|
- if (lastReceivedDate == null || lastReceivedDate.before(date)) {
|
|
|
|
- lastReceivedDate = date;
|
|
|
|
|
|
+
|
|
|
|
+ // 初始化时最多只同步 initDay 天数据
|
|
|
|
+ if (lastReceivedDate == null) {
|
|
|
|
+ lastReceivedDate = DateUtil.offsetDay(new Date(), -MailSyncInfo.initDay);
|
|
}
|
|
}
|
|
|
|
|
|
// 收件列表
|
|
// 收件列表
|
|
List<MailInfo> mailInfoList = new ArrayList<>();
|
|
List<MailInfo> mailInfoList = new ArrayList<>();
|
|
|
|
|
|
- int length = messages.length;
|
|
|
|
- for (int i = length - 1; i >= 0; i--) {
|
|
|
|
|
|
+ for (int i = messages.length - 1; i >= 0; i--) {
|
|
IMAPMessage message = (IMAPMessage) messages[i];
|
|
IMAPMessage message = (IMAPMessage) messages[i];
|
|
- // 邮件发送时间
|
|
|
|
|
|
+
|
|
|
|
+ // 邮件接收时间
|
|
Date receivedDate = message.getReceivedDate();
|
|
Date receivedDate = message.getReceivedDate();
|
|
- int messageNumber = message.getMessageNumber();
|
|
|
|
- // 邮件id
|
|
|
|
- String messageID = message.getMessageID();
|
|
|
|
-
|
|
|
|
- // 最后一封邮件id相同,代表上次同步邮件到这,不继续找之前的邮件了
|
|
|
|
- if (ObjectUtil.isNotEmpty(lastMessageNumber)) {
|
|
|
|
- if (lastMessageNumber.equals(messageNumber)) {
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // 邮件uid
|
|
|
|
+ long uid = folder.getUID(message);
|
|
|
|
|
|
|
|
+ // 最后一封邮件uid相同,代表上次同步邮件到这,不继续找之前的邮件了
|
|
|
|
+ if (lastUid != null && Objects.equals(uid, lastUid)) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
// 收件时间在上次收件时间之前,不继续找之前的邮件了
|
|
// 收件时间在上次收件时间之前,不继续找之前的邮件了
|
|
- if (receivedDate.before(lastReceivedDate)) {
|
|
|
|
|
|
+ if (receivedDate.getTime() < lastReceivedDate.getTime()) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
// 邮件信息
|
|
// 邮件信息
|
|
MailInfo mailInfo = new MailInfo();
|
|
MailInfo mailInfo = new MailInfo();
|
|
- mailInfo.setMessageId(messageID);
|
|
|
|
- mailInfo.setMessageNumber(messageNumber);
|
|
|
|
|
|
+ mailInfo.setUid(folder.getUID(message));
|
|
mailInfo.setSubject(message.getSubject());
|
|
mailInfo.setSubject(message.getSubject());
|
|
mailInfo.setFlags(EmailUtil.getFlags(message.getFlags()));
|
|
mailInfo.setFlags(EmailUtil.getFlags(message.getFlags()));
|
|
- mailInfo.setSendDate(receivedDate);
|
|
|
|
- mailInfo.setReadStatus(0);
|
|
|
|
-
|
|
|
|
- Flags.Flag[] systemFlags = message.getFlags().getSystemFlags();
|
|
|
|
- for (Flags.Flag systemFlag : systemFlags) {
|
|
|
|
- if (systemFlag.equals(Flags.Flag.SEEN)) {
|
|
|
|
- mailInfo.setReadStatus(1);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ mailInfo.setSendDate(message.getSentDate());
|
|
|
|
+ mailInfo.setReceivedDate(receivedDate);
|
|
|
|
|
|
// 保存发件人信息
|
|
// 保存发件人信息
|
|
Address[] addresses = message.getFrom();
|
|
Address[] addresses = message.getFrom();
|
|
@@ -420,84 +390,68 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
// 个人邮箱
|
|
// 个人邮箱
|
|
if (mailboxInfo.getType() == 1) {
|
|
if (mailboxInfo.getType() == 1) {
|
|
|
|
|
|
- // 邮箱是否同步
|
|
|
|
- if (mailboxInfo.getSkip()) {
|
|
|
|
- personalMailboxService.update(q -> q
|
|
|
|
- .eq(BaseEntity::getId, mailboxInfo.getId())
|
|
|
|
- .set(PersonalMailbox::getSyncStatus, mailboxInfo.getSkip() ? 0 : 1)
|
|
|
|
- .set(BaseEntity::getUpdateTime, new Date()));
|
|
|
|
- }
|
|
|
|
|
|
+ if (mailInfoList.size() > 0) {
|
|
|
|
|
|
- PersonalFolder personalFolder = new PersonalFolder();
|
|
|
|
- personalFolder.setId(mailFolder.getId());
|
|
|
|
- personalFolder.setLastMessageNumber(mailFolder.getLastMessageNumber());
|
|
|
|
- personalFolder.setLastReceivedDate(mailFolder.getLastReceivedDate());
|
|
|
|
- personalFolder.setSyncStatus(mailFolder.getSkip() ? 0 : 1);
|
|
|
|
- personalFolderService.updateById(personalFolder);
|
|
|
|
|
|
+ MailInfo lastMailInfo = mailInfoList.get(mailInfoList.size() - 1);
|
|
|
|
+
|
|
|
|
+ PersonalFolder personalFolder = new PersonalFolder();
|
|
|
|
+ personalFolder.setId(mailFolder.getId());
|
|
|
|
+ personalFolder.setLastUid(lastMailInfo.getUid());
|
|
|
|
+ personalFolder.setLastReceivedDate(lastMailInfo.getReceivedDate());
|
|
|
|
+ personalFolderService.updateById(personalFolder);
|
|
|
|
|
|
- if (mailInfoList.size() > 0) {
|
|
|
|
List<PersonalMessage> personalMessageList = mailInfoList.stream().map(mailInfo -> {
|
|
List<PersonalMessage> personalMessageList = mailInfoList.stream().map(mailInfo -> {
|
|
PersonalMessage personalMessage = new PersonalMessage();
|
|
PersonalMessage personalMessage = new PersonalMessage();
|
|
|
|
+ personalMessage.setUid(mailInfo.getUid());
|
|
personalMessage.setMailboxId(mailboxInfo.getId());
|
|
personalMessage.setMailboxId(mailboxInfo.getId());
|
|
personalMessage.setFolderId(mailFolder.getId());
|
|
personalMessage.setFolderId(mailFolder.getId());
|
|
personalMessage.setFolderName(mailFolder.getName());
|
|
personalMessage.setFolderName(mailFolder.getName());
|
|
- personalMessage.setMessageId(mailInfo.getMessageId());
|
|
|
|
- personalMessage.setMessageNumber(mailInfo.getMessageNumber());
|
|
|
|
personalMessage.setSubject(mailInfo.getSubject());
|
|
personalMessage.setSubject(mailInfo.getSubject());
|
|
personalMessage.setFlags(mailInfo.getFlags());
|
|
personalMessage.setFlags(mailInfo.getFlags());
|
|
personalMessage.setFromEmail(mailInfo.getFromEmail());
|
|
personalMessage.setFromEmail(mailInfo.getFromEmail());
|
|
personalMessage.setFromPersonalName(mailInfo.getFromPersonalName());
|
|
personalMessage.setFromPersonalName(mailInfo.getFromPersonalName());
|
|
personalMessage.setFromType(mailInfo.getFromType());
|
|
personalMessage.setFromType(mailInfo.getFromType());
|
|
personalMessage.setSendDate(mailInfo.getSendDate());
|
|
personalMessage.setSendDate(mailInfo.getSendDate());
|
|
- personalMessage.setContentSync(0);
|
|
|
|
- personalMessage.setAddressSync(0);
|
|
|
|
- personalMessage.setAttachmentSync(0);
|
|
|
|
- personalMessage.setReadStatus(mailInfo.getReadStatus());
|
|
|
|
|
|
+ personalMessage.setReceivedDate(mailInfo.getReceivedDate());
|
|
|
|
+ personalMessage.setSyncStatus(0);
|
|
return personalMessage;
|
|
return personalMessage;
|
|
}).collect(Collectors.toList());
|
|
}).collect(Collectors.toList());
|
|
personalMessageService.saveBatch(personalMessageList);
|
|
personalMessageService.saveBatch(personalMessageList);
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
// 企业邮箱
|
|
// 企业邮箱
|
|
else {
|
|
else {
|
|
|
|
|
|
- // 邮箱是否同步
|
|
|
|
- if (mailboxInfo.getSkip()) {
|
|
|
|
- enterpriseMailboxService.update(q -> q.
|
|
|
|
- eq(BaseEntity::getId, mailboxInfo.getId())
|
|
|
|
- .set(EnterpriseMailbox::getSyncStatus, mailboxInfo.getSkip() ? 0 : 1)
|
|
|
|
- .set(BaseEntity::getUpdateTime, new Date()));
|
|
|
|
- }
|
|
|
|
|
|
+ if (mailInfoList.size() > 0) {
|
|
|
|
|
|
- EnterpriseFolder enterpriseFolder = new EnterpriseFolder();
|
|
|
|
- enterpriseFolder.setId(mailFolder.getId());
|
|
|
|
- enterpriseFolder.setLastMessageNumber(mailFolder.getLastMessageNumber());
|
|
|
|
- enterpriseFolder.setLastReceivedDate(mailFolder.getLastReceivedDate());
|
|
|
|
- enterpriseFolder.setSyncStatus(mailFolder.getSkip() ? 0 : 1);
|
|
|
|
- enterpriseFolderService.updateById(enterpriseFolder);
|
|
|
|
|
|
+ MailInfo lastMailInfo = mailInfoList.get(mailInfoList.size() - 1);
|
|
|
|
+
|
|
|
|
+ EnterpriseFolder enterpriseFolder = new EnterpriseFolder();
|
|
|
|
+ enterpriseFolder.setId(mailFolder.getId());
|
|
|
|
+ enterpriseFolder.setLastUid(lastMailInfo.getUid());
|
|
|
|
+ enterpriseFolder.setLastReceivedDate(lastMailInfo.getReceivedDate());
|
|
|
|
+ enterpriseFolderService.updateById(enterpriseFolder);
|
|
|
|
|
|
- if (mailInfoList.size() > 0) {
|
|
|
|
List<EnterpriseMessage> enterpriseMessageList = mailInfoList.stream().map(mailInfo -> {
|
|
List<EnterpriseMessage> enterpriseMessageList = mailInfoList.stream().map(mailInfo -> {
|
|
EnterpriseMessage enterpriseMessage = new EnterpriseMessage();
|
|
EnterpriseMessage enterpriseMessage = new EnterpriseMessage();
|
|
|
|
+ enterpriseMessage.setUid(mailInfo.getUid());
|
|
enterpriseMessage.setMailboxId(mailboxInfo.getId());
|
|
enterpriseMessage.setMailboxId(mailboxInfo.getId());
|
|
enterpriseMessage.setFolderId(mailFolder.getId());
|
|
enterpriseMessage.setFolderId(mailFolder.getId());
|
|
enterpriseMessage.setFolderName(mailFolder.getName());
|
|
enterpriseMessage.setFolderName(mailFolder.getName());
|
|
- enterpriseMessage.setMessageId(mailInfo.getMessageId());
|
|
|
|
- enterpriseMessage.setMessageNumber(mailInfo.getMessageNumber());
|
|
|
|
enterpriseMessage.setSubject(mailInfo.getSubject());
|
|
enterpriseMessage.setSubject(mailInfo.getSubject());
|
|
enterpriseMessage.setFlags(mailInfo.getFlags());
|
|
enterpriseMessage.setFlags(mailInfo.getFlags());
|
|
enterpriseMessage.setFromEmail(mailInfo.getFromEmail());
|
|
enterpriseMessage.setFromEmail(mailInfo.getFromEmail());
|
|
enterpriseMessage.setFromPersonalName(mailInfo.getFromPersonalName());
|
|
enterpriseMessage.setFromPersonalName(mailInfo.getFromPersonalName());
|
|
enterpriseMessage.setFromType(mailInfo.getFromType());
|
|
enterpriseMessage.setFromType(mailInfo.getFromType());
|
|
enterpriseMessage.setSendDate(mailInfo.getSendDate());
|
|
enterpriseMessage.setSendDate(mailInfo.getSendDate());
|
|
- enterpriseMessage.setContentSync(0);
|
|
|
|
- enterpriseMessage.setAddressSync(0);
|
|
|
|
- enterpriseMessage.setAttachmentSync(0);
|
|
|
|
- enterpriseMessage.setReadStatus(mailInfo.getReadStatus());
|
|
|
|
|
|
+ enterpriseMessage.setReceivedDate(mailInfo.getReceivedDate());
|
|
|
|
+ enterpriseMessage.setSyncStatus(0);
|
|
return enterpriseMessage;
|
|
return enterpriseMessage;
|
|
}).collect(Collectors.toList());
|
|
}).collect(Collectors.toList());
|
|
enterpriseMessageService.saveBatch(enterpriseMessageList);
|
|
enterpriseMessageService.saveBatch(enterpriseMessageList);
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -507,7 +461,7 @@ public class CoreServiceImpl implements ApplicationRunner {
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
// 回滚事务
|
|
// 回滚事务
|
|
platformTransactionManager.rollback(transactionStatus);
|
|
platformTransactionManager.rollback(transactionStatus);
|
|
- throw new RuntimeException("保存数据失败");
|
|
|
|
|
|
+ throw new RuntimeException("保存邮件失败");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|