|
@@ -52,6 +52,11 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
@Autowired
|
|
|
private Executor executor;
|
|
|
|
|
|
+ /**
|
|
|
+ * 每页获取多少封邮件
|
|
|
+ */
|
|
|
+ private static final int SIZE = 50;
|
|
|
+
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public EmailInfo binding(BindingVo bindingVo) {
|
|
@@ -126,13 +131,13 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
String email = bindingVo.getEmail();
|
|
|
int pages = bindingVo.getPages();
|
|
|
|
|
|
- MessageVo messageVo = EmailEngineUtil.getMessageList(email, bindingVo.getPath(), 1);
|
|
|
+ MessageVo messageVo = EmailEngineUtil.getMessageList(email, bindingVo.getPath(), 0, 1);
|
|
|
|
|
|
ProgressVo progressVo = new ProgressVo();
|
|
|
progressVo.setEmail(email);
|
|
|
+ progressVo.setTotalMessageCount(messageVo.getTotal() > pages * SIZE ? pages * SIZE : messageVo.getTotal());
|
|
|
progressVo.setCompleteMessageCount(0);
|
|
|
progressVo.setPercentage(0);
|
|
|
- progressVo.setTotalMessageCount(messageVo.getTotal() > pages * 10 ? pages * 10 : messageVo.getTotal());
|
|
|
RedisCache.set(RedisConstant.PROGRESS_KEY + email, progressVo);
|
|
|
}
|
|
|
|
|
@@ -141,93 +146,68 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
*/
|
|
|
private void asyncReadEmail(Long emailInfoId, BindingVo bindingVo, Integer pageFlag) {
|
|
|
String email = bindingVo.getEmail();
|
|
|
- int pages = bindingVo.getPages();
|
|
|
String mailbox = bindingVo.getPath();
|
|
|
+ int pages = bindingVo.getPages();
|
|
|
|
|
|
executor.execute(() -> {
|
|
|
- ThreadUtil.sleep(3000);
|
|
|
int page = pageFlag;
|
|
|
try {
|
|
|
-
|
|
|
- // 记录上次消息id,防止循环查询分页过程中接收到了新邮件,出现邮件重复问题
|
|
|
- List<String> lastMessageIdList = new ArrayList<>();
|
|
|
-
|
|
|
while (page < pages) {
|
|
|
- int tempPage = page;
|
|
|
-
|
|
|
+ ThreadUtil.sleep(3000);
|
|
|
// 分页获取文件夹邮件
|
|
|
- MessageVo result = EmailEngineUtil.getMessageList(email, mailbox, tempPage);
|
|
|
-
|
|
|
+ MessageVo result = EmailEngineUtil.getMessageList(email, mailbox, page, SIZE);
|
|
|
+ // 邮件信息
|
|
|
List<MessageVo.MessagesDTO> messagesDTOList = result.getMessages();
|
|
|
-
|
|
|
- if (messagesDTOList.size() > 0) {
|
|
|
-
|
|
|
- // 批量保存邮件信息
|
|
|
- List<EmailMessage> emailMessageList = this.saveBatchMessage(emailInfoId, email, lastMessageIdList, messagesDTOList);
|
|
|
-
|
|
|
- // 更新同步邮件进度
|
|
|
- this.synchronizationProgress(email, messagesDTOList);
|
|
|
-
|
|
|
- // 记录上次保存的邮件id
|
|
|
- lastMessageIdList.clear();
|
|
|
- for (EmailMessage emailMessage : emailMessageList) {
|
|
|
- lastMessageIdList.add(emailMessage.getMessageId());
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
+ // 批量保存邮件信息
|
|
|
+ this.saveBatchMessage(emailInfoId, email, messagesDTOList);
|
|
|
+ // 更新同步邮件进度
|
|
|
+ this.synchronizationProgress(email, messagesDTOList);
|
|
|
page++;
|
|
|
-
|
|
|
- ThreadUtil.sleep(3000);
|
|
|
}
|
|
|
-
|
|
|
} catch (EmailEngineException e) {
|
|
|
- log.error("下载失败,等待5分钟");
|
|
|
- ThreadUtil.sleep(1000 * 60 * 5);
|
|
|
-
|
|
|
+ log.error("下载失败,等待10分钟");
|
|
|
+ ThreadUtil.sleep(1000 * 60 * 10);
|
|
|
asyncReadEmail(emailInfoId, bindingVo, page);
|
|
|
} catch (Exception e) {
|
|
|
- log.error("未知原因同步文件夹失败:{}", email, e);
|
|
|
+ log.error("未知原因同步邮件失败:{}", email, e);
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
+ String redisKey = RedisConstant.PROGRESS_KEY + email;
|
|
|
+ ProgressVo progressVo = RedisCache.get(redisKey);
|
|
|
+ progressVo.setPercentage(100);
|
|
|
+ RedisCache.set(redisKey, progressVo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 批量保存邮件信息
|
|
|
*/
|
|
|
- private List<EmailMessage> saveBatchMessage(Long emailInfoId, String email, List<String> lastMessageId, List<MessageVo.MessagesDTO> messageList) {
|
|
|
+ private void saveBatchMessage(Long emailInfoId, String email, List<MessageVo.MessagesDTO> messagesDTOList) {
|
|
|
+
|
|
|
List<EmailMessage> emailMessageList = new ArrayList<>();
|
|
|
- List<EmailMessageSend> emailMessageSendList = new ArrayList<>();
|
|
|
List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
|
|
|
|
|
|
- for (MessageVo.MessagesDTO messagesDTO : messageList) {
|
|
|
+ for (MessageVo.MessagesDTO messagesDTO : messagesDTOList) {
|
|
|
+ EmailMessage message = this.createMessage(emailInfoId, email, messagesDTO);
|
|
|
+ emailMessageList.add(message);
|
|
|
|
|
|
- // 已添加过的邮件则跳过
|
|
|
- if (lastMessageId.contains(messagesDTO.getId())) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
|
|
|
|
|
|
- // 生成邮件实体
|
|
|
- EmailMessage emailMessage = this.createMessage(emailInfoId, email, messagesDTO);
|
|
|
- emailMessageList.add(emailMessage);
|
|
|
-
|
|
|
- // 添加推送信息
|
|
|
- this.addMessageSend(emailMessageSendList, messagesDTO);
|
|
|
+ if (attachments != null && attachments.size() > 0) {
|
|
|
+ for (MessageVo.MessagesDTO.AttachmentsDTO attachment : attachments) {
|
|
|
+ emailMessageAttachmentList.add(this.createMessageAttachment(message, attachment));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 下载并添加附件信息
|
|
|
- this.addMessageAttachment(email, emailMessageAttachmentList, messagesDTO);
|
|
|
}
|
|
|
|
|
|
// 保存邮件
|
|
|
- emailMessageService.saveBatch(emailMessageList);
|
|
|
- // 保存推送人信息
|
|
|
- emailMessageSendService.saveBatch(emailMessageSendList);
|
|
|
- // 保存附件信息
|
|
|
- emailMessageAttachmentService.saveBatch(emailMessageAttachmentList);
|
|
|
+ emailMessageService.saveOrUpdateBatch(emailMessageList);
|
|
|
+
|
|
|
+ // 保存邮箱附件
|
|
|
+ emailMessageAttachmentService.saveOrUpdateBatch(emailMessageAttachmentList);
|
|
|
|
|
|
- return emailMessageList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -243,6 +223,7 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
emailMessage.setFlagged(messagesDTO.getFlagged());
|
|
|
emailMessage.setSubject(messagesDTO.getSubject());
|
|
|
emailMessage.setFromDate(messagesDTO.getDate());
|
|
|
+ emailMessage.setContentSync(false);
|
|
|
|
|
|
// 发件人
|
|
|
MessageVo.MessagesDTO.ToDTO from = messagesDTO.getFrom();
|
|
@@ -251,17 +232,28 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
emailMessage.setFromAddress(from.getAddress());
|
|
|
}
|
|
|
|
|
|
- // 正文内容
|
|
|
- // MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(email, messagesDTO.getId());
|
|
|
- // MessageDetailVo.TextDTO text = messageDetail.getText();
|
|
|
- // if (ObjectUtils.isNotEmpty(text)) {
|
|
|
- // emailMessage.setHtmlContent(text.getHtml());
|
|
|
- // }
|
|
|
-
|
|
|
return emailMessage;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 生成附件实体
|
|
|
+ */
|
|
|
+ private EmailMessageAttachment createMessageAttachment(EmailMessage message, MessageVo.MessagesDTO.AttachmentsDTO attachment) {
|
|
|
+ String newFileName = attachment.getId() + "." + FileUtil.getSuffix(attachment.getFilename());
|
|
|
+
|
|
|
+ EmailMessageAttachment emailMessageAttachment = new EmailMessageAttachment();
|
|
|
+ emailMessageAttachment.setAttachmentId(attachment.getId());
|
|
|
+ emailMessageAttachment.setMessageId(message.getMessageId());
|
|
|
+ emailMessageAttachment.setEmail(message.getEmail());
|
|
|
+ emailMessageAttachment.setName(attachment.getFilename());
|
|
|
+ emailMessageAttachment.setSize(attachment.getEncodedSize());
|
|
|
+ emailMessageAttachment.setPath(message.getEmail() + "\\" + newFileName);
|
|
|
+ emailMessageAttachment.setIsDownload(false);
|
|
|
+
|
|
|
+ return emailMessageAttachment;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 添加推送信息
|
|
|
*/
|
|
|
private void addMessageSend(List<EmailMessageSend> emailMessageSendList, MessageVo.MessagesDTO messagesDTO) {
|
|
@@ -318,10 +310,10 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
String newFileName = attachmentId + "." + FileUtil.getSuffix(attachment.getFilename());
|
|
|
|
|
|
EmailMessageAttachment emailMessageAttachment = new EmailMessageAttachment();
|
|
|
+ emailMessageAttachment.setAttachmentId(attachmentId);
|
|
|
emailMessageAttachment.setMessageId(messagesDTO.getId());
|
|
|
emailMessageAttachment.setName(attachment.getFilename());
|
|
|
emailMessageAttachment.setPath(email + "\\" + newFileName);
|
|
|
- emailMessageAttachment.setAttachmentId(attachmentId);
|
|
|
emailMessageAttachment.setSize(attachment.getEncodedSize());
|
|
|
emailMessageAttachmentList.add(emailMessageAttachment);
|
|
|
|
|
@@ -342,11 +334,13 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
* 同步邮件进度
|
|
|
*/
|
|
|
private void synchronizationProgress(String email, List<MessageVo.MessagesDTO> messagesDTOList) {
|
|
|
- ProgressVo progressVo = RedisCache.get(RedisConstant.PROGRESS_KEY + email);
|
|
|
+ String redisKey = RedisConstant.PROGRESS_KEY + email;
|
|
|
+ ProgressVo progressVo = RedisCache.get(redisKey);
|
|
|
int completeMessageCount = progressVo.getCompleteMessageCount() + messagesDTOList.size();
|
|
|
+
|
|
|
progressVo.setCompleteMessageCount(completeMessageCount);
|
|
|
progressVo.setPercentage(100 * completeMessageCount / progressVo.getTotalMessageCount());
|
|
|
- RedisCache.set(RedisConstant.PROGRESS_KEY + email, progressVo);
|
|
|
+ RedisCache.set(redisKey, progressVo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -358,12 +352,8 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
|
|
|
EmailInfo emailInfo;
|
|
|
try {
|
|
|
- emailInfo = RetryUtil.execute(() -> {
|
|
|
- EmailInfo tempEmailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery()
|
|
|
- .eq(EmailInfo::getEmail, account));
|
|
|
- Assert.notNull(tempEmailInfo, "未找到邮箱信息");
|
|
|
- return tempEmailInfo;
|
|
|
- });
|
|
|
+ emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, account));
|
|
|
+ Assert.notNull(emailInfo, "未找到邮箱信息");
|
|
|
} catch (Exception e) {
|
|
|
log.error("查找邮箱失败", e);
|
|
|
return;
|
|
@@ -392,8 +382,7 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
*/
|
|
|
private void handleMessageDeletedEvent(ListenerVo listenerVo) {
|
|
|
MessageDeletedEventVo vo = listenerVo.getData().toJavaObject(MessageDeletedEventVo.class);
|
|
|
- emailMessageService.remove(
|
|
|
- Wrappers.<EmailMessage>lambdaQuery().eq(EmailMessage::getMessageId, vo.getId()));
|
|
|
+ emailMessageService.remove(Wrappers.<EmailMessage>lambdaQuery().eq(EmailMessage::getMessageId, vo.getId()));
|
|
|
}
|
|
|
|
|
|
/**
|