24282 2 years ago
parent
commit
cff24618af

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

@@ -46,11 +46,6 @@ public class EnterpriseMessage extends BaseEntity {
     private String subject;
 
     /**
-     * 邮件标记
-     */
-    private String flags;
-
-    /**
      * 发件人email
      */
     private String fromEmail;

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

@@ -47,11 +47,6 @@ public class PersonalMessage extends BaseEntity {
     private String subject;
 
     /**
-     * 邮件标记
-     */
-    private String flags;
-
-    /**
      * 发件人email
      */
     private String fromEmail;

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

@@ -20,11 +20,6 @@ public class MailInfo {
     private String subject;
 
     /**
-     * 邮件标签
-     */
-    private String flags;
-
-    /**
      * 发送邮件
      */
     private String fromEmail;

+ 10 - 5
src/main/java/com/fjhx/email/entity/vo/MessageVo.java

@@ -25,11 +25,6 @@ public class MessageVo {
     private String subject;
 
     /**
-     * 邮件标记
-     */
-    private String flags;
-
-    /**
      * 发件人email
      */
     private String fromEmail;
@@ -49,4 +44,14 @@ public class MessageVo {
      */
     private Date sendDate;
 
+    /**
+     * 标签
+     */
+    private String flags;
+
+    /**
+     * 邮件uid
+     */
+    private Long uid;
+
 }

+ 0 - 3
src/main/java/com/fjhx/email/service/impl/CoreServiceImpl.java

@@ -354,7 +354,6 @@ public class CoreServiceImpl implements ApplicationRunner {
             MailInfo mailInfo = new MailInfo();
             mailInfo.setUid(folder.getUID(message));
             mailInfo.setSubject(message.getSubject());
-            mailInfo.setFlags(EmailUtil.getFlags(message.getFlags()));
             mailInfo.setSendDate(message.getSentDate());
             mailInfo.setReceivedDate(receivedDate);
 
@@ -417,7 +416,6 @@ public class CoreServiceImpl implements ApplicationRunner {
                     personalMessage.setFolderId(mailFolder.getId());
                     personalMessage.setFolderName(mailFolder.getName());
                     personalMessage.setSubject(mailInfo.getSubject());
-                    personalMessage.setFlags(mailInfo.getFlags());
                     personalMessage.setFromEmail(mailInfo.getFromEmail());
                     personalMessage.setFromPersonalName(mailInfo.getFromPersonalName());
                     personalMessage.setFromType(mailInfo.getFromType());
@@ -444,7 +442,6 @@ public class CoreServiceImpl implements ApplicationRunner {
                         enterpriseMessage.setFolderId(mailFolder.getId());
                         enterpriseMessage.setFolderName(mailFolder.getName());
                         enterpriseMessage.setSubject(mailInfo.getSubject());
-                        enterpriseMessage.setFlags(mailInfo.getFlags());
                         enterpriseMessage.setFromEmail(mailInfo.getFromEmail());
                         enterpriseMessage.setFromPersonalName(mailInfo.getFromPersonalName());
                         enterpriseMessage.setFromType(mailInfo.getFromType());

+ 58 - 9
src/main/java/com/fjhx/email/service/impl/MailServiceImpl.java

@@ -84,6 +84,10 @@ public class MailServiceImpl implements IMailService {
     private TransactionDefinition transactionDefinition;
     @Autowired
     private PlatformTransactionManager platformTransactionManager;
+    @Autowired
+    private IPersonalFolderService personalFolderService;
+    @Autowired
+    private IEnterpriseFolderService enterpriseFolderService;
 
     @Override
     public List<MailboxInfo> getMailboxInfoListByUserId(List<Long> userIdList) {
@@ -94,22 +98,60 @@ public class MailServiceImpl implements IMailService {
         return mailMapper.getMailboxInfoListByUserId(userIdList, MailSyncInfo.mailType);
     }
 
+    @SneakyThrows
     @Override
     public PageWrapper<MessageVo> getMessagePage(GetMessagePageDto dto) {
 
+        PageWrapper<MessageVo> wrapper;
+        IMAPFolder folder;
+
         if (dto.getType().equals(1)) {
             Page<PersonalMessage> page = personalMessageService.page(dto, q -> q
                     .eq(PersonalMessage::getFolderId, dto.getFolderId())
                     .orderByDesc(PersonalMessage::getSendDate)
             );
-            return new PageWrapper<>(page, MessageVo.class);
+            wrapper = new PageWrapper<>(page, MessageVo.class);
+            if (page.getSize() == 0) {
+                return wrapper;
+            }
+
+            PersonalFolder personalFolder = personalFolderService.getById(dto.getFolderId());
+            if (personalFolder == null) {
+                throw new ServiceException("文件夹已被删除");
+            }
+
+            MailboxInfo mailboxInfo = getMailboxInfo(1, personalFolder.getMailboxId());
+            IMAPStore imapStore = EmailUtil.getIMAPStore(mailboxInfo);
+            folder = (IMAPFolder) imapStore.getFolder(personalFolder.getName());
+        } else {
+            Page<EnterpriseMessage> page = enterpriseMessageService.page(dto, q -> q
+                    .eq(EnterpriseMessage::getFolderId, dto.getFolderId())
+                    .orderByDesc(EnterpriseMessage::getSendDate)
+            );
+            wrapper = new PageWrapper<>(page, MessageVo.class);
+            if (page.getSize() == 0) {
+                return wrapper;
+            }
+
+            EnterpriseFolder enterpriseFolder = enterpriseFolderService.getById(dto.getFolderId());
+            if (enterpriseFolder == null) {
+                throw new ServiceException("文件夹已被删除");
+            }
+
+            MailboxInfo mailboxInfo = getMailboxInfo(2, enterpriseFolder.getMailboxId());
+            IMAPStore imapStore = EmailUtil.getIMAPStore(mailboxInfo);
+            folder = (IMAPFolder) imapStore.getFolder(enterpriseFolder.getName());
+        }
+
+        folder.open(Folder.READ_ONLY);
+        for (MessageVo messageVo : wrapper.getRows()) {
+            Long uid = messageVo.getUid();
+            Message message = folder.getMessageByUID(uid);
+            String flags = EmailUtil.getFlags(message.getFlags());
+            messageVo.setFlags(flags);
         }
 
-        Page<EnterpriseMessage> page = enterpriseMessageService.page(dto, q -> q
-                .eq(EnterpriseMessage::getFolderId, dto.getFolderId())
-                .orderByDesc(EnterpriseMessage::getSendDate)
-        );
-        return new PageWrapper<>(page, MessageVo.class);
+        return wrapper;
     }
 
     @SneakyThrows
@@ -162,7 +204,7 @@ public class MailServiceImpl implements IMailService {
 
             IMAPStore imapStore = EmailUtil.getIMAPStore(mailboxInfo);
             IMAPFolder folder = (IMAPFolder) imapStore.getFolder(folderName);
-            folder.open(Folder.READ_ONLY);
+            folder.open(Folder.READ_WRITE);
 
             IMAPMessage message = (IMAPMessage) folder.getMessageByUID(uid);
 
@@ -170,6 +212,12 @@ public class MailServiceImpl implements IMailService {
                 throw new ServiceException("没有找到邮件详情,此邮件可能已被删除");
             }
 
+            Flags flags = message.getFlags();
+            if (!flags.contains(Flags.Flag.SEEN)) {
+                flags.add(Flags.Flag.SEEN);
+            }
+            message.setFlags(flags, true);
+
             List<CompletableFuture<MessageDetailVo.MessageAttachment>> list = new ArrayList<>();
 
             CompletableFuture<Void> attachmentFuture = CompletableFuture.runAsync(() -> {
@@ -190,6 +238,9 @@ public class MailServiceImpl implements IMailService {
 
             new Thread(() -> saveMessageDetail(messageId, messageDetailVo, type)).start();
 
+            if (folder.isOpen()) {
+                folder.close();
+            }
         }
 
         // copy一份数据,防止多线程下把文件路径前缀保存到数据库中
@@ -291,7 +342,6 @@ public class MailServiceImpl implements IMailService {
     private MailboxInfo getMailboxInfo(Integer type, Long mailboxId) {
         MailboxInfo mailboxInfo = new MailboxInfo();
 
-
         if (type.equals(1)) {
             PersonalMailbox personalMailbox = personalMailboxService.getById(mailboxId);
             mailboxInfo.setReceiveHost(personalMailbox.getReceiveHost());
@@ -311,7 +361,6 @@ public class MailServiceImpl implements IMailService {
         return mailboxInfo;
     }
 
-
     private void setPersonalMessageDetailVo(MessageDetailVo vo, Long messageId) {
         List<PersonalMessageAddress> addressList = personalMessageAddressService.list(
                 q -> q.eq(PersonalMessageAddress::getMessageId, messageId));

+ 54 - 56
src/main/java/com/fjhx/email/utils/EmailUtil.java

@@ -46,6 +46,20 @@ public class EmailUtil {
     //     System.out.println();
     // }
 
+    // public static void main(String[] args) throws Exception {
+    //     ObsFile attachment = new ObsFile();
+    //     attachment.setFileUrl("https://os.winfaster.cn/fjhx/saas/GrandStar/2023/03/08/png/3092592f2d614d83854fad5e4c107143.png");
+    //     attachment.setFileName("board-1.png");
+    //     SendDto.Address address = new SendDto.Address();
+    //     address.setAddress("2428241269@qq.com");
+    //     SendDto sendDto = new SendDto();
+    //     sendDto.setTo(Collections.singletonList(address));
+    //     sendDto.setFileList(Collections.singletonList(attachment));
+    //     sendDto.setSubject("测试标题");
+    //     sendDto.setContent("测试内容");
+    //     sendMail("imap.qq.com", "2428241269@qq.com", "kdypajdrwfhtdihb", sendDto);
+    // }
+
     /**
      * 获取imapStore
      * 993
@@ -83,36 +97,36 @@ public class EmailUtil {
         return mailAddressList;
     }
 
-    private static void addMailAddressList(List<MessageDetailVo.MessageAddress> mailAddressList, Address[] addresses, Integer type) {
-        if (addresses == null) {
-            return;
+    /**
+     * 获取标签
+     */
+    public static String getFlags(Flags flags) {
+        if (flags == null) {
+            return StringPool.EMPTY;
         }
-        for (Address address : addresses) {
-            InternetAddress internetAddress = (InternetAddress) address;
 
-            MessageDetailVo.MessageAddress mailAddress = new MessageDetailVo.MessageAddress();
-            mailAddress.setType(type);
-            mailAddress.setEmail(internetAddress.getAddress());
-            mailAddress.setPersonalName(internetAddress.getPersonal());
-            mailAddressList.add(mailAddress);
+        Flags.Flag[] systemFlags = flags.getSystemFlags();
+        if (systemFlags.length == 0) {
+            return StringPool.EMPTY;
         }
-    }
 
-    //
-    // public static void main(String[] args) throws Exception {
-    //     ObsFile attachment = new ObsFile();
-    //     attachment.setFileUrl("https://os.winfaster.cn/fjhx/saas/GrandStar/2023/03/08/png/3092592f2d614d83854fad5e4c107143.png");
-    //     attachment.setFileName("board-1.png");
-    //     SendDto.Address address = new SendDto.Address();
-    //     address.setAddress("2428241269@qq.com");
-    //     SendDto sendDto = new SendDto();
-    //     sendDto.setTo(Collections.singletonList(address));
-    //     sendDto.setFileList(Collections.singletonList(attachment));
-    //     sendDto.setSubject("测试标题");
-    //     sendDto.setContent("测试内容");
-    //     sendMail("imap.qq.com", "2428241269@qq.com", "kdypajdrwfhtdihb", sendDto);
-    // }
+        StringJoiner stringJoiner = new StringJoiner(",");
+        for (Flags.Flag systemFlag : systemFlags) {
+            stringJoiner.add(MailFlagEnum.getType(systemFlag));
+        }
+        return stringJoiner.toString();
+    }
 
+    /**
+     * 获取邮箱文件夹
+     */
+    public static List<String> getFolderNameList(IMAPStore imapStore) throws MessagingException {
+        IMAPFolder folder = (IMAPFolder) imapStore.getDefaultFolder();
+        Folder[] folders = folder.list();
+        List<String> mailFolderList = new ArrayList<>();
+        addMailFolderList(mailFolderList, folders);
+        return mailFolderList;
+    }
 
     /**
      * 发送邮件
@@ -201,6 +215,21 @@ public class EmailUtil {
         transport.close();
     }
 
+    private static void addMailAddressList(List<MessageDetailVo.MessageAddress> mailAddressList, Address[] addresses, Integer type) {
+        if (addresses == null) {
+            return;
+        }
+        for (Address address : addresses) {
+            InternetAddress internetAddress = (InternetAddress) address;
+
+            MessageDetailVo.MessageAddress mailAddress = new MessageDetailVo.MessageAddress();
+            mailAddress.setType(type);
+            mailAddress.setEmail(internetAddress.getAddress());
+            mailAddress.setPersonalName(internetAddress.getPersonal());
+            mailAddressList.add(mailAddress);
+        }
+    }
+
     private static InternetAddress[] getAddresses(List<SendDto.Address> addressList) throws UnsupportedEncodingException {
         InternetAddress[] internetAddresses = new InternetAddress[addressList.size()];
         for (int i = 0; i < addressList.size(); i++) {
@@ -212,37 +241,6 @@ public class EmailUtil {
         return internetAddresses;
     }
 
-    /**
-     * 获取标签
-     */
-    public static String getFlags(Flags flags) {
-        if (flags == null) {
-            return StringPool.EMPTY;
-        }
-
-        Flags.Flag[] systemFlags = flags.getSystemFlags();
-        if (systemFlags.length == 0) {
-            return StringPool.EMPTY;
-        }
-
-        StringJoiner stringJoiner = new StringJoiner(",");
-        for (Flags.Flag systemFlag : systemFlags) {
-            stringJoiner.add(MailFlagEnum.getType(systemFlag));
-        }
-        return stringJoiner.toString();
-    }
-
-    /**
-     * 获取邮箱文件夹
-     */
-    public static List<String> getFolderNameList(IMAPStore imapStore) throws MessagingException {
-        IMAPFolder folder = (IMAPFolder) imapStore.getDefaultFolder();
-        Folder[] folders = folder.list();
-        List<String> mailFolderList = new ArrayList<>();
-        addMailFolderList(mailFolderList, folders);
-        return mailFolderList;
-    }
-
     private static void addMailFolderList(List<String> mailFolderList, Folder[] folders) throws MessagingException {
         for (Folder folder : folders) {
             int type = folder.getType();