|
@@ -2,19 +2,19 @@ package com.fjhx.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.io.FileUtil;
|
|
|
+import cn.hutool.core.thread.ThreadUtil;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.fjhx.config.TaskPoolConfig;
|
|
|
-import com.fjhx.constants.SendConstants;
|
|
|
+import com.fjhx.config.redis.RedisCache;
|
|
|
+import com.fjhx.constants.RedisConstant;
|
|
|
+import com.fjhx.constants.SendConstant;
|
|
|
import com.fjhx.entity.*;
|
|
|
import com.fjhx.service.*;
|
|
|
import com.fjhx.utils.EmailEngineUtil;
|
|
|
import com.fjhx.utils.RetryUtil;
|
|
|
-import com.fjhx.vo.BindingVo;
|
|
|
-import com.fjhx.vo.EmailMailboxVo;
|
|
|
-import com.fjhx.vo.MessageDetailVo;
|
|
|
-import com.fjhx.vo.MessageVo;
|
|
|
+import com.fjhx.vo.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
@@ -63,14 +63,19 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
|
|
|
// 添加账号
|
|
|
EmailEngineUtil.createAccount(bindingVo);
|
|
|
- // 保存账号数据
|
|
|
- emailInfo = saveEmailInfo(bindingVo);
|
|
|
+ // 保存账号信息到数据库
|
|
|
+ emailInfo = this.saveEmailInfo(bindingVo);
|
|
|
// 查询邮箱文件夹
|
|
|
List<EmailMailboxVo.MailboxesDTO> mailboxList = EmailEngineUtil.getMailboxList(email);
|
|
|
// 添加邮箱文件夹
|
|
|
- List<EmailMailbox> emailMailboxList = saveEmailMailbox(mailboxList, emailInfo.getId(), email);
|
|
|
+ List<EmailMailbox> emailMailboxList = this.saveEmailMailbox(mailboxList, emailInfo.getId(), email);
|
|
|
+
|
|
|
+ // redis添加同步进度
|
|
|
+ this.synchronizationProgressInitialization(email, mailboxList);
|
|
|
+
|
|
|
// 异步遍历文件夹下的所有邮件
|
|
|
- asyncReadEmail(email, emailMailboxList);
|
|
|
+ this.asyncReadEmail(email, emailMailboxList);
|
|
|
+
|
|
|
return emailInfo;
|
|
|
}
|
|
|
|
|
@@ -107,19 +112,29 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
*/
|
|
|
private void asyncReadEmail(String email, List<EmailMailbox> emailMailboxList) {
|
|
|
executor.execute(() -> {
|
|
|
- // ThreadUtil.sleep(5000);
|
|
|
+ ThreadUtil.sleep(3000);
|
|
|
|
|
|
// 记录上次消息id,防止循环查询分页过程中接收到了新邮件,出现邮件重复问题
|
|
|
List<String> lastMessageIdList = new ArrayList<>();
|
|
|
|
|
|
// 遍历每个邮箱
|
|
|
for (EmailMailbox emailMailbox : emailMailboxList) {
|
|
|
- // 保存邮箱中的邮件
|
|
|
- EmailEngineUtil.handleMessageList(
|
|
|
- email,
|
|
|
- emailMailbox.getPath(),
|
|
|
- messageList -> this.saveBatchMessage(email, lastMessageIdList, emailMailbox, messageList)
|
|
|
- );
|
|
|
+
|
|
|
+ int page = 0;
|
|
|
+ int pages;
|
|
|
+
|
|
|
+ do {
|
|
|
+ MessageVo result = EmailEngineUtil.handleMessageList(email, emailMailbox.getPath(), page);
|
|
|
+ List<MessageVo.MessagesDTO> messagesDTOList = result.getMessages();
|
|
|
+ if (messagesDTOList.size() > 0) {
|
|
|
+ this.saveBatchMessage(email, lastMessageIdList, emailMailbox, messagesDTOList);
|
|
|
+ this.synchronizationProgress(email, messagesDTOList, emailMailbox);
|
|
|
+ }
|
|
|
+
|
|
|
+ pages = result.getPages();
|
|
|
+ page++;
|
|
|
+ } while (page < pages);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
});
|
|
@@ -135,25 +150,27 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
|
|
|
|
|
|
for (MessageVo.MessagesDTO messagesDTO : messageList) {
|
|
|
+ // 已添加过的邮件则跳过
|
|
|
if (lastMessageId.contains(messagesDTO.getId())) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// 生成邮件实体
|
|
|
- EmailMessage emailMessage = createMessage(email, emailMailbox, messagesDTO);
|
|
|
-
|
|
|
+ EmailMessage emailMessage = this.createMessage(email, emailMailbox, messagesDTO);
|
|
|
emailMessageList.add(emailMessage);
|
|
|
|
|
|
// 添加推送信息
|
|
|
- addMessageSend(emailMessageSendList, messagesDTO, emailMessage.getId());
|
|
|
+ this.addMessageSend(emailMessageSendList, messagesDTO, emailMessage.getId());
|
|
|
|
|
|
// 下载并添加附件信息
|
|
|
- addMessageAttachment(email, emailMessageAttachmentList, messagesDTO, emailMessage.getId());
|
|
|
-
|
|
|
+ this.addMessageAttachment(email, emailMessageAttachmentList, messagesDTO, emailMessage.getId());
|
|
|
}
|
|
|
|
|
|
+ // 保存邮件
|
|
|
emailMessageService.saveBatch(emailMessageList);
|
|
|
+ // 保存推送人信息
|
|
|
emailMessageSendService.saveBatch(emailMessageSendList);
|
|
|
+ // 保存附件信息
|
|
|
emailMessageAttachmentService.saveBatch(emailMessageAttachmentList);
|
|
|
|
|
|
lastMessageId.clear();
|
|
@@ -207,7 +224,7 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
emailMessageSend.setEmailMessageId(emailMessageId);
|
|
|
emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageSend.setType(SendConstants.TO);
|
|
|
+ emailMessageSend.setType(SendConstant.TO);
|
|
|
emailMessageSend.setName(toDTO.getName());
|
|
|
emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
emailMessageSendList.add(emailMessageSend);
|
|
@@ -221,7 +238,7 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
emailMessageSend.setEmailMessageId(emailMessageId);
|
|
|
emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageSend.setType(SendConstants.CC);
|
|
|
+ emailMessageSend.setType(SendConstant.CC);
|
|
|
emailMessageSend.setName(toDTO.getName());
|
|
|
emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
emailMessageSendList.add(emailMessageSend);
|
|
@@ -235,7 +252,7 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
emailMessageSend.setEmailMessageId(emailMessageId);
|
|
|
emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageSend.setType(SendConstants.BCC);
|
|
|
+ emailMessageSend.setType(SendConstant.BCC);
|
|
|
emailMessageSend.setName(toDTO.getName());
|
|
|
emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
emailMessageSendList.add(emailMessageSend);
|
|
@@ -279,4 +296,52 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步邮件进度初始化
|
|
|
+ */
|
|
|
+ private void synchronizationProgressInitialization(String email, List<EmailMailboxVo.MailboxesDTO> mailboxList) {
|
|
|
+
|
|
|
+ ProgressVo progressVo = new ProgressVo();
|
|
|
+
|
|
|
+
|
|
|
+ List<ProgressVo.Details> detailsList = BeanUtil.copyToList(mailboxList, ProgressVo.Details.class);
|
|
|
+
|
|
|
+ int totalMessageCount = 0;
|
|
|
+
|
|
|
+ for (ProgressVo.Details detail : detailsList) {
|
|
|
+ detail.setCompleteMessageCount(0);
|
|
|
+ detail.setPercentage(0);
|
|
|
+ totalMessageCount += detail.getMessages();
|
|
|
+ }
|
|
|
+
|
|
|
+ progressVo.setTotalMessageCount(totalMessageCount);
|
|
|
+ progressVo.setCompleteMessageCount(0);
|
|
|
+ progressVo.setPercentage(0);
|
|
|
+ progressVo.setDetailsList(detailsList);
|
|
|
+
|
|
|
+ RedisCache.set(RedisConstant.PROGRESS_KEY + email, progressVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步邮件进度
|
|
|
+ */
|
|
|
+ private void synchronizationProgress(String email, List<MessageVo.MessagesDTO> messagesDTOList, EmailMailbox emailMailbox) {
|
|
|
+
|
|
|
+ ProgressVo progressVo = RedisCache.get(RedisConstant.PROGRESS_KEY + email);
|
|
|
+ int completeMessageCount = progressVo.getCompleteMessageCount() + messagesDTOList.size();
|
|
|
+ progressVo.setCompleteMessageCount(completeMessageCount);
|
|
|
+ progressVo.setPercentage(100 * completeMessageCount / progressVo.getTotalMessageCount());
|
|
|
+
|
|
|
+ for (ProgressVo.Details details : progressVo.getDetailsList()) {
|
|
|
+ if (details.getPath().equals(emailMailbox.getPath())) {
|
|
|
+ int detailsCompleteMessageCount = details.getCompleteMessageCount() + messagesDTOList.size();
|
|
|
+ details.setCompleteMessageCount(detailsCompleteMessageCount);
|
|
|
+ details.setPercentage(100 * detailsCompleteMessageCount / details.getMessages());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ RedisCache.set(RedisConstant.PROGRESS_KEY + email, progressVo);
|
|
|
+ }
|
|
|
}
|