24282 2 anni fa
parent
commit
c08788194e

+ 9 - 4
src/main/java/com/fjhx/entity/EmailMessage.java

@@ -29,14 +29,14 @@ public class EmailMessage implements Serializable {
     private String messageId;
 
     /**
-     * 电子邮件
+     * 电子邮件id
      */
-    private String email;
+    private Long emailInfoId;
 
     /**
-     * 电子邮件id
+     * 电子邮件
      */
-    private Long emailInfoId;
+    private String email;
 
     /**
      * 是否未读
@@ -69,6 +69,11 @@ public class EmailMessage implements Serializable {
     private String fromAddress;
 
     /**
+     * 正文是否同步
+     */
+    private Boolean contentSync;
+
+    /**
      * 创建时间
      */
     @TableField(fill = FieldFill.INSERT)

+ 11 - 1
src/main/java/com/fjhx/entity/EmailMessageAttachment.java

@@ -29,11 +29,16 @@ public class EmailMessageAttachment implements Serializable {
     private String attachmentId;
 
     /**
-     * 件id
+     * 件id
      */
     private String messageId;
 
     /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
      * 附件名称
      */
     private String name;
@@ -49,6 +54,11 @@ public class EmailMessageAttachment implements Serializable {
     private String path;
 
     /**
+     * 是否下载
+     */
+    private Boolean isDownload;
+
+    /**
      * 创建时间
      */
     @TableField(fill = FieldFill.INSERT)

+ 64 - 75
src/main/java/com/fjhx/service/impl/AccountServiceImpl.java

@@ -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()));
     }
 
     /**

+ 2 - 11
src/main/java/com/fjhx/utils/EmailEngineUtil.java

@@ -92,20 +92,11 @@ public class EmailEngineUtil {
         delete("v1/account/" + email, new HashMap<>());
     }
 
-    // /**
-    //  * 查看邮箱所有文件夹
-    //  */
-    // public static List<EmailMailboxVo.MailboxesDTO> getMailboxList(String email) {
-    //     String url = "v1/account/" + email + "/mailboxes?counters=true";
-    //     EmailMailboxVo result = get(url, EmailMailboxVo.class);
-    //     return result.getMailboxes();
-    // }
-
     /**
      * 查看文件夹的所有邮件
      */
-    public static MessageVo getMessageList(String email, String path, int page) {
-        String url = "/v1/account/" + email + "/messages?path=" + path + "&page=" + page + "&pageSize=10&documentStore=false";
+    public static MessageVo getMessageList(String email, String path, int page, int size) {
+        String url = "/v1/account/" + email + "/messages?path=" + path + "&page=" + page + "&pageSize=" + size + "&documentStore=true";
         return get(url, MessageVo.class);
     }
 

+ 1 - 3
src/main/java/com/fjhx/utils/RetryUtil.java

@@ -39,13 +39,11 @@ public class RetryUtil {
             log.warn("任务执行失败,已失败{}次,最多允许失败{}次,{}秒后开始重试", executeCount + 1, maxCount, sleep / 1000, e);
             ThreadUtil.sleep(sleep);
             return execute(runnable, ++executeCount, maxCount, sleep);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
         }
     }
 
     public interface RetryRunnable<T> {
-        T run() throws Exception;
+        T run() throws RuntimeException;
     }
 
 }

+ 1 - 0
src/main/java/com/fjhx/vo/MessageDetailVo.java

@@ -20,6 +20,7 @@ public class MessageDetailVo {
 
         @Data
         public static class EncodedSizeDTO {
+
             private Integer html;
             
         }