24282 преди 2 години
родител
ревизия
6c1a6d7171

+ 6 - 3
src/main/java/com/fjhx/email/entity/EnterpriseFolder.java

@@ -31,12 +31,12 @@ public class EnterpriseFolder extends BaseEntity {
     private String name;
 
     /**
-     * 上次同步邮件number
+     * 上次同步邮件uid
      */
-    private Integer lastMessageNumber;
+    private Long lastUid;
 
     /**
-     * 上次同步邮件发送时间
+     * 上次同步邮件接收时间
      */
     private Date lastReceivedDate;
 
@@ -45,6 +45,9 @@ public class EnterpriseFolder extends BaseEntity {
      */
     private Integer syncStatus;
 
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
     private Integer delFlag;
 
 }

+ 9 - 24
src/main/java/com/fjhx/email/entity/EnterpriseMessage.java

@@ -21,6 +21,11 @@ import java.util.Date;
 public class EnterpriseMessage extends BaseEntity {
 
     /**
+     * 邮件uid
+     */
+    private Long uid;
+
+    /**
      * 邮箱id
      */
     private Long mailboxId;
@@ -36,16 +41,6 @@ public class EnterpriseMessage extends BaseEntity {
     private String folderName;
 
     /**
-     * 邮件id
-     */
-    private String messageId;
-
-    /**
-     * 消息数量
-     */
-    private Integer messageNumber;
-
-    /**
      * 邮件标题
      */
     private String subject;
@@ -76,23 +71,13 @@ public class EnterpriseMessage extends BaseEntity {
     private Date sendDate;
 
     /**
-     * 是否同步正文
-     */
-    private Integer contentSync;
-
-    /**
-     * 是否同步地址信息
-     */
-    private Integer addressSync;
-
-    /**
-     * 是否同步附件
+     * 接收时间
      */
-    private Integer attachmentSync;
+    private Date receivedDate;
 
     /**
-     * 已读状态  1是 0否
+     * 同步状态 1已同步 0未同步
      */
-    private Integer readStatus;
+    private Integer syncStatus;
 
 }

+ 6 - 3
src/main/java/com/fjhx/email/entity/PersonalFolder.java

@@ -31,12 +31,12 @@ public class PersonalFolder extends BaseEntity {
     private String name;
 
     /**
-     * 上次同步邮件id
+     * 上次同步邮件uid
      */
-    private Integer lastMessageNumber;
+    private Long lastUid;
 
     /**
-     * 上次同步邮件发送时间
+     * 上次同步邮件接收时间
      */
     private Date lastReceivedDate;
 
@@ -45,6 +45,9 @@ public class PersonalFolder extends BaseEntity {
      */
     private Integer syncStatus;
 
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
     private Integer delFlag;
 
 }

+ 5 - 0
src/main/java/com/fjhx/email/entity/PersonalMailbox.java

@@ -19,6 +19,11 @@ import lombok.Setter;
 public class PersonalMailbox extends BaseEntity {
 
     /**
+     * 类型:1国内 2国外
+     */
+    private Integer type;
+
+    /**
      * mail账号
      */
     private String mailUser;

+ 10 - 24
src/main/java/com/fjhx/email/entity/PersonalMessage.java

@@ -20,6 +20,12 @@ import java.util.Date;
 @TableName("personal_message")
 public class PersonalMessage extends BaseEntity {
 
+
+    /**
+     * 邮件uid
+     */
+    private Long uid;
+
     /**
      * 邮箱id
      */
@@ -36,16 +42,6 @@ public class PersonalMessage extends BaseEntity {
     private String folderName;
 
     /**
-     * 邮件id
-     */
-    private String messageId;
-
-    /**
-     * 消息数量
-     */
-    private Integer messageNumber;
-
-    /**
      * 邮件标题
      */
     private String subject;
@@ -76,23 +72,13 @@ public class PersonalMessage extends BaseEntity {
     private Date sendDate;
 
     /**
-     * 是否同步正文
-     */
-    private Integer contentSync;
-
-    /**
-     * 是否同步地址信息
-     */
-    private Integer addressSync;
-
-    /**
-     * 是否同步附件
+     * 接收时间
      */
-    private Integer attachmentSync;
+    private Date receivedDate;
 
     /**
-     * 已读状态  1是 0否
+     * 同步状态 1已同步 0未同步
      */
-    private Integer readStatus;
+    private Integer syncStatus;
 
 }

+ 3 - 3
src/main/java/com/fjhx/email/entity/dto/MailFolderInfo.java

@@ -25,12 +25,12 @@ public class MailFolderInfo {
     private Boolean skip;
 
     /**
-     * 上次获取邮件编号
+     * 上次同步邮件uid
      */
-    private Integer lastMessageNumber;
+    private Long lastUid;
 
     /**
-     * 上次获取邮件时间
+     * 上次同步邮件接收时间
      */
     private Date lastReceivedDate;
 

+ 9 - 14
src/main/java/com/fjhx/email/entity/dto/MailInfo.java

@@ -10,14 +10,9 @@ import java.util.Date;
 public class MailInfo {
 
     /**
-     * 邮件id
+     * 邮件uid
      */
-    private String messageId;
-
-    /**
-     * 邮件编号
-     */
-    private Integer messageNumber;
+    private Long uid;
 
     /**
      * 邮件标题
@@ -30,11 +25,6 @@ public class MailInfo {
     private String flags;
 
     /**
-     * 邮件发送时间
-     */
-    private Date sendDate;
-
-    /**
      * 发送邮件
      */
     private String fromEmail;
@@ -50,8 +40,13 @@ public class MailInfo {
     private String fromType;
 
     /**
-     * 已读状态  1是 0否
+     * 邮件发送时间
+     */
+    private Date sendDate;
+
+    /**
+     * 邮件接收时间
      */
-    private Integer readStatus;
+    private Date receivedDate;
 
 }

+ 4 - 4
src/main/java/com/fjhx/email/mapper/xml/MailMapper.xml

@@ -23,7 +23,7 @@
             <id column="folder_id" property="id"/>
             <result column="folder_name" property="name"/>
             <result column="skip" property="skip"/>
-            <result column="last_message_number" property="lastMessageNumber"/>
+            <result column="last_uid" property="lastUid"/>
             <result column="last_received_date" property="lastReceivedDate"/>
 
         </collection>
@@ -42,7 +42,7 @@
         receive_protocol,
         folder_id,
         folder_name,
-        last_message_number,
+        last_uid,
         last_received_date
         from (
         (select 1 type,
@@ -55,7 +55,7 @@
         pm.receive_protocol,
         pf.id folder_id,
         pf.name folder_name,
-        pf.last_message_number,
+        pf.last_uid,
         pf.last_received_date
         from personal_mailbox pm
         inner join personal_folder pf on pm.id = pf.mailbox_id
@@ -81,7 +81,7 @@
         ed.receive_protocol,
         ef.id folder_id,
         ef.name folder_name,
-        ef.last_message_number,
+        ef.last_uid,
         ef.last_received_date
         from enterprise_domain ed
         inner join enterprise_mailbox em on ed.id = em.domain_id

+ 65 - 111
src/main/java/com/fjhx/email/service/impl/CoreServiceImpl.java

@@ -1,15 +1,16 @@
 package com.fjhx.email.service.impl;
 
-import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.IORuntimeException;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
 import com.fjhx.email.config.TaskPoolConfig;
-import com.fjhx.email.config.base.BaseEntity;
 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.MailInfo;
 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.utils.EmailUtil;
 import com.fjhx.email.utils.HxHttpUtil;
+import com.sun.mail.imap.IMAPFolder;
 import com.sun.mail.imap.IMAPMessage;
 import com.sun.mail.imap.IMAPStore;
 import com.sun.mail.util.MailConnectException;
@@ -54,18 +56,12 @@ public class CoreServiceImpl implements ApplicationRunner {
     private Executor emailTaskExecutor;
 
     @Autowired
-    private IPersonalMailboxService personalMailboxService;
-
-    @Autowired
     private IPersonalFolderService personalFolderService;
 
     @Autowired
     private IPersonalMessageService personalMessageService;
 
     @Autowired
-    private IEnterpriseMailboxService enterpriseMailboxService;
-
-    @Autowired
     private IEnterpriseFolderService enterpriseFolderService;
 
     @Autowired
@@ -156,7 +152,7 @@ public class CoreServiceImpl implements ApplicationRunner {
         // 累计同步次数
         num++;
 
-        // log.info("开始第 {} 伦邮件同步,共同步 {} 个邮箱", num, mailboxSize);
+        log.info("开始第 {} 伦邮件同步,共同步 {} 个邮箱", num, mailboxSize);
 
         // 定义一个线程计数器
         CountDownLatch countDownLatch = new CountDownLatch(mailboxSize);
@@ -169,9 +165,10 @@ public class CoreServiceImpl implements ApplicationRunner {
                 try {
                     synchronousMail(mailbox);
                 } catch (Exception e) {
-                    log.error("发生未知异常", e);
+                    log.error("同步邮件发生未知异常", e);
+                } finally {
+                    countDownLatch.countDown();
                 }
-                countDownLatch.countDown();
             });
 
         }
@@ -237,7 +234,7 @@ public class CoreServiceImpl implements ApplicationRunner {
                     continue;
                 }
 
-                Folder folder = store.getFolder(mailFolder.getName());
+                IMAPFolder folder = (IMAPFolder) store.getFolder(mailFolder.getName());
 
                 try {
                     // 只读方式打开收件箱
@@ -254,31 +251,17 @@ public class CoreServiceImpl implements ApplicationRunner {
                         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 {
@@ -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();
-        // 同步时间
-        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<>();
 
-        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];
-            // 邮件发送时间
+
+            // 邮件接收时间
             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;
             }
 
             // 邮件信息
             MailInfo mailInfo = new MailInfo();
-            mailInfo.setMessageId(messageID);
-            mailInfo.setMessageNumber(messageNumber);
+            mailInfo.setUid(folder.getUID(message));
             mailInfo.setSubject(message.getSubject());
             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();
@@ -420,84 +390,68 @@ public class CoreServiceImpl implements ApplicationRunner {
             // 个人邮箱
             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 -> {
                         PersonalMessage personalMessage = new PersonalMessage();
+                        personalMessage.setUid(mailInfo.getUid());
                         personalMessage.setMailboxId(mailboxInfo.getId());
                         personalMessage.setFolderId(mailFolder.getId());
                         personalMessage.setFolderName(mailFolder.getName());
-                        personalMessage.setMessageId(mailInfo.getMessageId());
-                        personalMessage.setMessageNumber(mailInfo.getMessageNumber());
                         personalMessage.setSubject(mailInfo.getSubject());
                         personalMessage.setFlags(mailInfo.getFlags());
                         personalMessage.setFromEmail(mailInfo.getFromEmail());
                         personalMessage.setFromPersonalName(mailInfo.getFromPersonalName());
                         personalMessage.setFromType(mailInfo.getFromType());
                         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;
                     }).collect(Collectors.toList());
                     personalMessageService.saveBatch(personalMessageList);
+
                 }
 
             }
             // 企业邮箱
             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 -> {
                         EnterpriseMessage enterpriseMessage = new EnterpriseMessage();
+                        enterpriseMessage.setUid(mailInfo.getUid());
                         enterpriseMessage.setMailboxId(mailboxInfo.getId());
                         enterpriseMessage.setFolderId(mailFolder.getId());
                         enterpriseMessage.setFolderName(mailFolder.getName());
-                        enterpriseMessage.setMessageId(mailInfo.getMessageId());
-                        enterpriseMessage.setMessageNumber(mailInfo.getMessageNumber());
                         enterpriseMessage.setSubject(mailInfo.getSubject());
                         enterpriseMessage.setFlags(mailInfo.getFlags());
                         enterpriseMessage.setFromEmail(mailInfo.getFromEmail());
                         enterpriseMessage.setFromPersonalName(mailInfo.getFromPersonalName());
                         enterpriseMessage.setFromType(mailInfo.getFromType());
                         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;
                     }).collect(Collectors.toList());
                     enterpriseMessageService.saveBatch(enterpriseMessageList);
+
                 }
 
             }
@@ -507,7 +461,7 @@ public class CoreServiceImpl implements ApplicationRunner {
         } catch (Exception e) {
             // 回滚事务
             platformTransactionManager.rollback(transactionStatus);
-            throw new RuntimeException("保存数据失败");
+            throw new RuntimeException("保存邮件失败");
         }
     }
 

+ 89 - 98
src/main/java/com/fjhx/email/service/impl/MailServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.email.config.base.BaseEntity;
 import com.fjhx.email.config.exception.ServiceException;
 import com.fjhx.email.entity.*;
 import com.fjhx.email.entity.dto.GetMessagePageDto;
@@ -33,6 +34,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.concurrent.*;
 import java.util.stream.Collectors;
@@ -121,47 +123,40 @@ public class MailServiceImpl implements IMailService {
     @Override
     public MessageDetailVo getMessageDetail(GetMessagePageDto dto) {
         Long messageId = dto.getMessageId();
-
-        Integer contentSync;
-        Integer addressSync;
-        Integer attachmentSync;
-
-        Integer messageNumber;
+        Integer type = dto.getType();
 
         String folderName;
         Long mailboxId;
+        Integer syncStatus;
+        Long uid;
 
-        if (dto.getType().equals(1)) {
+        if (type.equals(1)) {
             PersonalMessage personalMessage = personalMessageService.getById(messageId);
             if (personalMessage == null) {
                 throw new ServiceException("没有找到邮箱");
             }
-            messageNumber = personalMessage.getMessageNumber();
-            contentSync = personalMessage.getContentSync();
-            addressSync = personalMessage.getAddressSync();
-            attachmentSync = personalMessage.getAttachmentSync();
 
             folderName = personalMessage.getFolderName();
+            syncStatus = personalMessage.getSyncStatus();
             mailboxId = personalMessage.getMailboxId();
+            uid = personalMessage.getUid();
         } else {
             EnterpriseMessage enterpriseMessage = enterpriseMessageService.getById(messageId);
             if (enterpriseMessage == null) {
                 throw new ServiceException("没有找到邮箱");
             }
-            messageNumber = enterpriseMessage.getMessageNumber();
-            contentSync = enterpriseMessage.getContentSync();
-            addressSync = enterpriseMessage.getAddressSync();
-            attachmentSync = enterpriseMessage.getAttachmentSync();
 
             folderName = enterpriseMessage.getFolderName();
+            syncStatus = enterpriseMessage.getSyncStatus();
             mailboxId = enterpriseMessage.getMailboxId();
+            uid = enterpriseMessage.getUid();
         }
 
         MessageDetailVo messageDetailVo = new MessageDetailVo();
 
         // 正文附件已同步
-        if (contentSync == 1 && addressSync == 1 && attachmentSync == 1) {
-            if (dto.getType().equals(1)) {
+        if (syncStatus.equals(1)) {
+            if (type.equals(1)) {
                 setPersonalMessageDetailVo(messageDetailVo, messageId);
             } else {
                 setEnterpriseMessageDetailVo(messageDetailVo, messageId);
@@ -170,13 +165,17 @@ public class MailServiceImpl implements IMailService {
         // 未同步
         else {
 
-            MailboxInfo mailboxInfo = getMailboxInfo(dto.getType(), mailboxId);
+            MailboxInfo mailboxInfo = getMailboxInfo(type, mailboxId);
 
             IMAPStore imapStore = EmailUtil.getIMAPStore(mailboxInfo);
             IMAPFolder folder = (IMAPFolder) imapStore.getFolder(folderName);
             folder.open(Folder.READ_ONLY);
-            IMAPMessage message = (IMAPMessage) folder.getMessage(messageNumber);
 
+            IMAPMessage message = (IMAPMessage) folder.getMessageByUID(uid);
+
+            if (message == null) {
+                throw new ServiceException("没有找到邮箱详情,邮件可能已被删除");
+            }
 
             List<CompletableFuture<MessageDetailVo.MessageAttachment>> list = new ArrayList<>();
 
@@ -184,8 +183,8 @@ public class MailServiceImpl implements IMailService {
 
                 getMessageAndAttachment(messageDetailVo, message, messageId, list);
 
-                List<MessageDetailVo.MessageAttachment> messageAttachmentList = list.stream()
-                        .map(CompletableFuture::join).collect(Collectors.toList());
+                List<MessageDetailVo.MessageAttachment> messageAttachmentList =
+                        list.stream().map(CompletableFuture::join).collect(Collectors.toList());
 
                 messageDetailVo.setMessageAttachmentList(messageAttachmentList);
 
@@ -196,9 +195,7 @@ public class MailServiceImpl implements IMailService {
 
             CompletableFuture.allOf(attachmentFuture, addressFuture).join();
 
-            new Thread(() ->
-                    saveMessageDetail(contentSync, addressSync, attachmentSync, messageId, messageDetailVo, dto.getType())
-            ).start();
+            new Thread(() -> saveMessageDetail(messageId, messageDetailVo, type)).start();
 
         }
 
@@ -209,88 +206,81 @@ public class MailServiceImpl implements IMailService {
         return messageDetailVo;
     }
 
-    private void saveMessageDetail(Integer contentSync, Integer addressSync, Integer attachmentSync,
-                                   Long messageId, MessageDetailVo messageDetailVo, Integer type) {
+    private void saveMessageDetail(Long messageId, MessageDetailVo messageDetailVo, Integer type) {
 
         TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
 
         try {
             if (type == 1) {
-                if (contentSync == 0) {
-                    PersonalMessageContent personalMessageContent = new PersonalMessageContent();
-                    personalMessageContent.setMessageId(messageId);
-                    personalMessageContent.setContent(messageDetailVo.getContent());
-                    personalMessageContent.setMimeType(messageDetailVo.getMimeType());
-                    personalMessageContentService.save(personalMessageContent);
-                }
-                if (addressSync == 0) {
-                    List<MessageDetailVo.MessageAddress> messageAddressList = messageDetailVo.getMessageAddressList();
-                    List<PersonalMessageAddress> personalMessageContentService = messageAddressList.stream().map(item -> {
-                        PersonalMessageAddress personalMessageAddress = new PersonalMessageAddress();
-                        personalMessageAddress.setMessageId(messageId);
-                        personalMessageAddress.setPersonalName(item.getPersonalName());
-                        personalMessageAddress.setType(item.getType());
-                        personalMessageAddress.setEmail(item.getEmail());
-                        return personalMessageAddress;
-                    }).collect(Collectors.toList());
-                    personalMessageAddressService.saveBatch(personalMessageContentService);
-                }
-                if (attachmentSync == 0) {
-                    List<MessageDetailVo.MessageAttachment> messageAttachmentList = messageDetailVo.getMessageAttachmentList();
-
-                    List<PersonalMessageAttachment> messageAttachments = messageAttachmentList.stream().map(item -> {
-                        PersonalMessageAttachment personalMessageAttachment = new PersonalMessageAttachment();
-                        personalMessageAttachment.setName(item.getName());
-                        personalMessageAttachment.setUrl(item.getUrl());
-                        personalMessageAttachment.setMessageId(messageId);
-                        return personalMessageAttachment;
-                    }).collect(Collectors.toList());
-                    personalMessageAttachmentService.saveBatch(messageAttachments);
-                }
-                personalMessageService.update(q -> q.eq(PersonalMessage::getId, messageId)
-                        .set(PersonalMessage::getAddressSync, 1)
-                        .set(PersonalMessage::getContentSync, 1)
-                        .set(PersonalMessage::getAttachmentSync, 1)
-                        .set(PersonalMessage::getReadStatus, 1)
+
+                PersonalMessageContent personalMessageContent = new PersonalMessageContent();
+                personalMessageContent.setMessageId(messageId);
+                personalMessageContent.setContent(messageDetailVo.getContent());
+                personalMessageContent.setMimeType(messageDetailVo.getMimeType());
+                personalMessageContentService.save(personalMessageContent);
+
+                List<MessageDetailVo.MessageAddress> messageAddressList = messageDetailVo.getMessageAddressList();
+                List<PersonalMessageAddress> personalMessageContentService = messageAddressList.stream().map(item -> {
+                    PersonalMessageAddress personalMessageAddress = new PersonalMessageAddress();
+                    personalMessageAddress.setMessageId(messageId);
+                    personalMessageAddress.setPersonalName(item.getPersonalName());
+                    personalMessageAddress.setType(item.getType());
+                    personalMessageAddress.setEmail(item.getEmail());
+                    return personalMessageAddress;
+                }).collect(Collectors.toList());
+                personalMessageAddressService.saveBatch(personalMessageContentService);
+
+                List<MessageDetailVo.MessageAttachment> messageAttachmentList = messageDetailVo.getMessageAttachmentList();
+                List<PersonalMessageAttachment> messageAttachments = messageAttachmentList.stream().map(item -> {
+                    PersonalMessageAttachment personalMessageAttachment = new PersonalMessageAttachment();
+                    personalMessageAttachment.setName(item.getName());
+                    personalMessageAttachment.setUrl(item.getUrl());
+                    personalMessageAttachment.setMessageId(messageId);
+                    return personalMessageAttachment;
+                }).collect(Collectors.toList());
+                personalMessageAttachmentService.saveBatch(messageAttachments);
+
+                personalMessageService.update(q -> q
+                        .eq(PersonalMessage::getId, messageId)
+                        .set(PersonalMessage::getSyncStatus, 1)
+                        .set(BaseEntity::getUpdateTime, new Date())
                 );
 
             } else {
-                if (contentSync == 0) {
-                    EnterpriseMessageContent enterpriseMessageContent = new EnterpriseMessageContent();
-                    enterpriseMessageContent.setMessageId(messageId);
-                    enterpriseMessageContent.setContent(messageDetailVo.getContent());
-                    enterpriseMessageContent.setMimeType(messageDetailVo.getMimeType());
-                    enterpriseMessageContentService.save(enterpriseMessageContent);
-                }
-                if (addressSync == 0) {
-                    List<MessageDetailVo.MessageAddress> messageAddressList = messageDetailVo.getMessageAddressList();
-                    List<EnterpriseMessageAddress> enterpriseMessageAddressList = messageAddressList.stream().map(item -> {
-                        EnterpriseMessageAddress enterpriseMessageAddress = new EnterpriseMessageAddress();
-                        enterpriseMessageAddress.setMessageId(messageId);
-                        enterpriseMessageAddress.setPersonalName(item.getPersonalName());
-                        enterpriseMessageAddress.setType(item.getType());
-                        enterpriseMessageAddress.setEmail(item.getEmail());
-                        return enterpriseMessageAddress;
-                    }).collect(Collectors.toList());
-                    enterpriseMessageAddressService.saveBatch(enterpriseMessageAddressList);
-                }
-                if (attachmentSync == 0) {
-                    List<MessageDetailVo.MessageAttachment> messageAttachmentList = messageDetailVo.getMessageAttachmentList();
-                    List<EnterpriseMessageAttachment> messageAttachments = messageAttachmentList.stream().map(item -> {
-                        EnterpriseMessageAttachment enterpriseMessageAttachment = new EnterpriseMessageAttachment();
-                        enterpriseMessageAttachment.setName(item.getName());
-                        enterpriseMessageAttachment.setUrl(item.getUrl());
-                        enterpriseMessageAttachment.setMessageId(messageId);
-                        return enterpriseMessageAttachment;
-                    }).collect(Collectors.toList());
-                    enterpriseMessageAttachmentService.saveBatch(messageAttachments);
-                }
-                enterpriseMessageService.update(q -> q.eq(EnterpriseMessage::getId, messageId)
-                        .set(EnterpriseMessage::getAddressSync, 1)
-                        .set(EnterpriseMessage::getContentSync, 1)
-                        .set(EnterpriseMessage::getAttachmentSync, 1)
-                        .set(EnterpriseMessage::getReadStatus, 1)
+
+                EnterpriseMessageContent enterpriseMessageContent = new EnterpriseMessageContent();
+                enterpriseMessageContent.setMessageId(messageId);
+                enterpriseMessageContent.setContent(messageDetailVo.getContent());
+                enterpriseMessageContent.setMimeType(messageDetailVo.getMimeType());
+                enterpriseMessageContentService.save(enterpriseMessageContent);
+
+                List<MessageDetailVo.MessageAddress> messageAddressList = messageDetailVo.getMessageAddressList();
+                List<EnterpriseMessageAddress> enterpriseMessageAddressList = messageAddressList.stream().map(item -> {
+                    EnterpriseMessageAddress enterpriseMessageAddress = new EnterpriseMessageAddress();
+                    enterpriseMessageAddress.setMessageId(messageId);
+                    enterpriseMessageAddress.setPersonalName(item.getPersonalName());
+                    enterpriseMessageAddress.setType(item.getType());
+                    enterpriseMessageAddress.setEmail(item.getEmail());
+                    return enterpriseMessageAddress;
+                }).collect(Collectors.toList());
+                enterpriseMessageAddressService.saveBatch(enterpriseMessageAddressList);
+
+                List<MessageDetailVo.MessageAttachment> messageAttachmentList = messageDetailVo.getMessageAttachmentList();
+                List<EnterpriseMessageAttachment> messageAttachments = messageAttachmentList.stream().map(item -> {
+                    EnterpriseMessageAttachment enterpriseMessageAttachment = new EnterpriseMessageAttachment();
+                    enterpriseMessageAttachment.setName(item.getName());
+                    enterpriseMessageAttachment.setUrl(item.getUrl());
+                    enterpriseMessageAttachment.setMessageId(messageId);
+                    return enterpriseMessageAttachment;
+                }).collect(Collectors.toList());
+                enterpriseMessageAttachmentService.saveBatch(messageAttachments);
+
+                enterpriseMessageService.update(q -> q
+                        .eq(EnterpriseMessage::getId, messageId)
+                        .set(EnterpriseMessage::getSyncStatus, 1)
+                        .set(BaseEntity::getUpdateTime, new Date())
                 );
+
             }
 
             // 提交事务
@@ -426,8 +416,9 @@ public class MailServiceImpl implements IMailService {
                         completableFutureList.add(CompletableFuture.supplyAsync(() -> getMessageAttachment(bodyPart), executorService));
 
                     } else {
-                        if (!contentType.equals("text/html; charset=UTF-8"))
+                        if (!contentType.equals("text/html; charset=UTF-8")) {
                             log.error("未知文件格式:{} ,邮件id:{},待解析", contentType, messageId);
+                        }
                     }
                 }