Эх сурвалжийг харах

功能修改 添加是否有附件 邮件状态字段 邮件状态改为拉分页时同步 添加取消已读功能

ControlDream 1 жил өмнө
parent
commit
681317678a

+ 15 - 0
src/main/java/com/fjhx/email/controller/MailController.java

@@ -176,4 +176,19 @@ public class MailController {
         return R.ok();
     }
 
+    /**
+     * 取消已读
+     */
+    @PostMapping("/cancelSeen/{host}/{user}/{password}")
+    public R cancelSeen(@PathVariable("host") String host, @PathVariable("user") String user,
+                     @PathVariable("password") String password, @RequestBody SetSeenDto dto) {
+        try {
+            mailService.cancelSeen(host, user, password, dto);
+        } catch (MessagingException e) {
+            log.error("取消已读失败:", e);
+            throw new ServiceException("取消已读失败:{}", e.getMessage());
+        }
+        return R.ok();
+    }
+
 }

+ 1 - 2
src/main/java/com/fjhx/email/entity/EnterpriseMessage.java

@@ -1,7 +1,6 @@
 package com.fjhx.email.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.fjhx.email.config.base.BaseEntity;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -18,7 +17,7 @@ import java.util.Date;
 @Getter
 @Setter
 @TableName("enterprise_message")
-public class EnterpriseMessage extends BaseEntity {
+public class EnterpriseMessage extends MyMessage {
 
     /**
      * 邮件uid

+ 86 - 0
src/main/java/com/fjhx/email/entity/MyMessage.java

@@ -0,0 +1,86 @@
+package com.fjhx.email.entity;
+
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 邮件
+ */
+@Getter
+@Setter
+public class MyMessage extends BaseEntity {
+
+    /**
+     * 邮件uid
+     */
+    private Long uid;
+
+    /**
+     * 邮箱id
+     */
+    private Long mailboxId;
+
+    /**
+     * 文件夹id
+     */
+    private Long folderId;
+
+    /**
+     * 文件夹名称
+     */
+    private String folderName;
+
+    /**
+     * 邮件标题
+     */
+    private String subject;
+
+    /**
+     * 发件人email
+     */
+    private String fromEmail;
+
+    /**
+     * 发件人名称
+     */
+    private String fromPersonalName;
+
+    /**
+     * 发件时间
+     */
+    private Date sendDate;
+
+    /**
+     * 接收时间
+     */
+    private Date receivedDate;
+
+    /**
+     * 同步状态 1已同步 0未同步
+     */
+    private Integer syncStatus;
+
+    /**
+     * 删除
+     */
+    private Integer delFlag;
+
+    /**
+     * 标签
+     */
+    private String flags;
+
+    /**
+     * 收件人列表
+     */
+    private String recipients;
+
+    /**
+     * 是否有附件
+     */
+    private Integer isAttachments;
+
+}

+ 1 - 2
src/main/java/com/fjhx/email/entity/PersonalMessage.java

@@ -1,7 +1,6 @@
 package com.fjhx.email.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.fjhx.email.config.base.BaseEntity;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -18,7 +17,7 @@ import java.util.Date;
 @Getter
 @Setter
 @TableName("personal_message")
-public class PersonalMessage extends BaseEntity {
+public class PersonalMessage extends MyMessage {
 
 
     /**

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

@@ -39,4 +39,19 @@ public class MailInfo {
      */
     private Date receivedDate;
 
+    /**
+     * 标签
+     */
+    private String flags;
+
+    /**
+     * 收件人列表
+     */
+    private String recipients;
+
+    /**
+     * 是否有附件
+     */
+    private Integer isAttachments;
+
 }

+ 6 - 1
src/main/java/com/fjhx/email/entity/dto/SetSeenDto.java

@@ -10,11 +10,16 @@ import java.util.List;
 public class SetSeenDto {
 
     /**
-     * 1个人邮箱 2企业邮箱
+     * 文件夹名称
      */
     private String folderName;
 
     /**
+     * 1个人邮箱 2企业邮箱
+     */
+    private Integer type;
+
+    /**
      * uid
      */
     private List<Long> uidList;

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

@@ -34,6 +34,11 @@ public class MessageDetailVo {
      */
     private String mimeType;
 
+    /**
+     * 发件人email
+     */
+    private String fromEmail;
+
     @Getter
     @Setter
     public static class MessageAddress {

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

@@ -54,4 +54,14 @@ public class MessageVo {
      */
     private Long uid;
 
+    /**
+     * 邮件数统计
+     */
+    private Integer count;
+
+    /**
+     * 文件夹id
+     */
+    private Long folderId;
+
 }

+ 7 - 0
src/main/java/com/fjhx/email/mapper/EnterpriseMessageMapper.java

@@ -1,7 +1,11 @@
 package com.fjhx.email.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.email.entity.EnterpriseMessage;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -11,6 +15,9 @@ import com.fjhx.email.entity.EnterpriseMessage;
  * @author zlj
  * @since 2023-04-06
  */
+@Mapper
 public interface EnterpriseMessageMapper extends BaseMapper<EnterpriseMessage> {
 
+    Page<EnterpriseMessage> getPage(@Param("page") Page<EnterpriseMessage> page, @Param("ew") QueryWrapper<EnterpriseMessage> wrapper);
+
 }

+ 6 - 0
src/main/java/com/fjhx/email/mapper/MailMapper.java

@@ -1,12 +1,18 @@
 package com.fjhx.email.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fjhx.email.entity.dto.MailboxInfo;
+import com.fjhx.email.entity.vo.MessageVo;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
+@Mapper
 public interface MailMapper {
 
     List<MailboxInfo> getMailboxInfoListByUserId(@Param("userIdList") List<Long> userIdList, @Param("mailType") Integer mailType);
 
+    List<MessageVo>getUnreadMessageCount(@Param("ew")QueryWrapper<Object> ew);
+
 }

+ 8 - 0
src/main/java/com/fjhx/email/mapper/PersonalMessageMapper.java

@@ -1,7 +1,11 @@
 package com.fjhx.email.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.email.entity.PersonalMessage;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -11,6 +15,10 @@ import com.fjhx.email.entity.PersonalMessage;
  * @author zlj
  * @since 2023-04-06
  */
+@Mapper
 public interface PersonalMessageMapper extends BaseMapper<PersonalMessage> {
 
+    Page<PersonalMessage> getPage(@Param("page") Page<PersonalMessage> page, @Param("ew") QueryWrapper<PersonalMessage> wrapper);
+
+
 }

+ 8 - 0
src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageMapper.xml

@@ -2,4 +2,12 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.email.mapper.EnterpriseMessageMapper">
 
+    <select id="getPage" resultType="com.fjhx.email.entity.EnterpriseMessage">
+        SELECT
+            *
+        FROM
+            enterprise_message em
+                LEFT OUTER JOIN enterprise_message_content emc ON emc.message_id = em.id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

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

@@ -106,5 +106,33 @@
         ) t
         ORDER BY t.id, t.folder_id DESC
     </select>
+    <select id="getUnreadMessageCount" resultType="com.fjhx.email.entity.vo.MessageVo">
+        SELECT
+            *
+        FROM
+            (
+                SELECT
+                    folder_id,
+                    mailbox_id,
+                    flags,
+                    COUNT( id ) as `count`
+                FROM
+                    enterprise_message
+                where 	 ( not FIND_IN_SET('6',flags)  )
+                GROUP BY
+                    folder_id UNION ALL
+                SELECT
+                    folder_id,
+                    mailbox_id,
+                    flags,
+                    COUNT( id )  as `count`
+                FROM
+                    personal_message
+                    where 	 ( not FIND_IN_SET('6',flags)  )
+                GROUP BY
+                    folder_id
+            ) AS m
+            ${ew.customSqlSegment}
+    </select>
 
 </mapper>

+ 8 - 0
src/main/java/com/fjhx/email/mapper/xml/PersonalMessageMapper.xml

@@ -2,4 +2,12 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.email.mapper.PersonalMessageMapper">
 
+    <select id="getPage" resultType="com.fjhx.email.entity.PersonalMessage">
+        SELECT
+            *
+        FROM
+            personal_message pm
+                LEFT OUTER JOIN enterprise_message_content pmc ON pmc.message_id = pm.id
+        ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 4 - 0
src/main/java/com/fjhx/email/service/IMailService.java

@@ -37,4 +37,8 @@ public interface IMailService {
      */
     void setSeen(String host, String user, String password, SetSeenDto dto) throws MessagingException;
 
+    /**
+     * 取消已读
+     */
+    void cancelSeen(String host, String user, String password, SetSeenDto dto) throws MessagingException;
 }

+ 53 - 1
src/main/java/com/fjhx/email/service/impl/CoreServiceImpl.java

@@ -32,6 +32,8 @@ import org.springframework.transaction.TransactionStatus;
 
 import javax.mail.*;
 import javax.mail.internet.InternetAddress;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -306,6 +308,7 @@ public class CoreServiceImpl implements ApplicationRunner {
             // 邮件
             IMAPMessage message = (IMAPMessage) messages[i];
 
+
             // 邮件接收时间
             Date receivedDate;
             try {
@@ -334,12 +337,15 @@ public class CoreServiceImpl implements ApplicationRunner {
             mailInfo.setSendDate(message.getSentDate());
             mailInfo.setReceivedDate(receivedDate);
 
+            //赋值标签信息
+            mailInfo.setFlags(ImapUtil.getFlags(message.getFlags()));
+
             // 保存发件人信息
             InternetAddress sender = (InternetAddress) message.getSender();
             if (sender != null) {
                 mailInfo.setFromEmail(sender.getAddress());
                 mailInfo.setFromPersonalName(sender.getPersonal());
-            }else {
+            } else {
                 Address[] from = message.getFrom();
                 if (ObjectUtil.isNotEmpty(from)) {
                     InternetAddress formItem = (InternetAddress) from[0];
@@ -348,6 +354,24 @@ public class CoreServiceImpl implements ApplicationRunner {
                 }
             }
 
+            //保存收件人信息
+            ArrayList<String> recipientArr = new ArrayList<>();
+            for (Address recipient : message.getRecipients(Message.RecipientType.TO)) {
+                InternetAddress internetAddress = (InternetAddress) recipient;
+                String address = internetAddress.getAddress();
+                recipientArr.add(address);
+            }
+            String recipients = recipientArr.stream().collect(Collectors.joining(","));
+            mailInfo.setRecipients(recipients);
+
+            //赋值是否有附件
+            try {
+                int isAttachments = getIsAttachments(message, false) ? 1 : 0;
+                mailInfo.setIsAttachments(isAttachments);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+
             // 添加到邮件列表
             mailInfoList.add(0, mailInfo);
 
@@ -360,6 +384,28 @@ public class CoreServiceImpl implements ApplicationRunner {
     }
 
     /**
+     * 判断是否有附件
+     *
+     * @return
+     */
+    public static boolean getIsAttachments(Part part, Boolean status) throws MessagingException, IOException {
+        if (part.isMimeType("text/plain")) {
+        } else if (part.isMimeType("text/html")) {
+        } else if (part.isMimeType("multipart/*")) {
+            Multipart mp = (Multipart) part.getContent();
+            for (int i = 0; i < mp.getCount(); i++) {
+                status = (status || getIsAttachments(mp.getBodyPart(i), status));
+            }
+        } else if (part.isMimeType("message/rfc822")) {
+            status = (status || getIsAttachments((Part) part.getContent(), status));
+        } else {
+            Object obj = part.getContent();
+            status = (status || (obj instanceof InputStream));
+        }
+        return status;
+    }
+
+    /**
      * 保存邮件数据,更新文件夹最后同步邮件时间
      */
     private void saveMailInfo(MailboxInfo mailboxInfo, MailFolderInfo mailFolder, List<MailInfo> mailInfoList) {
@@ -394,6 +440,9 @@ public class CoreServiceImpl implements ApplicationRunner {
                     personalMessage.setReceivedDate(mailInfo.getReceivedDate());
                     personalMessage.setSyncStatus(0);
                     personalMessage.setDelFlag(0);
+                    personalMessage.setFlags(mailInfo.getFlags());
+                    personalMessage.setRecipients(mailInfo.getRecipients());
+                    personalMessage.setIsAttachments(mailInfo.getIsAttachments());
                     return personalMessage;
                 }).collect(Collectors.toList());
                 personalMessageService.saveBatch(personalMessageList);
@@ -421,6 +470,9 @@ public class CoreServiceImpl implements ApplicationRunner {
                     enterpriseMessage.setReceivedDate(mailInfo.getReceivedDate());
                     enterpriseMessage.setSyncStatus(0);
                     enterpriseMessage.setDelFlag(0);
+                    enterpriseMessage.setFlags(mailInfo.getFlags());
+                    enterpriseMessage.setRecipients(mailInfo.getRecipients());
+                    enterpriseMessage.setIsAttachments(mailInfo.getIsAttachments());
                     return enterpriseMessage;
                 }).collect(Collectors.toList());
                 enterpriseMessageService.saveBatch(enterpriseMessageList);

+ 266 - 70
src/main/java/com/fjhx/email/service/impl/MailServiceImpl.java

@@ -2,8 +2,9 @@ package com.fjhx.email.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.email.config.base.BaseEntity;
 import com.fjhx.email.config.exception.ServiceException;
@@ -14,7 +15,9 @@ import com.fjhx.email.entity.dto.MailboxInfo;
 import com.fjhx.email.entity.dto.SetSeenDto;
 import com.fjhx.email.entity.vo.MessageDetailVo;
 import com.fjhx.email.entity.vo.MessageVo;
+import com.fjhx.email.mapper.EnterpriseMessageMapper;
 import com.fjhx.email.mapper.MailMapper;
+import com.fjhx.email.mapper.PersonalMessageMapper;
 import com.fjhx.email.service.*;
 import com.fjhx.email.utils.ObsFileUtil;
 import com.fjhx.email.utils.PageWrapper;
@@ -35,11 +38,9 @@ import org.springframework.transaction.TransactionStatus;
 import javax.mail.*;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -90,6 +91,10 @@ public class MailServiceImpl implements IMailService {
     private IPersonalFolderService personalFolderService;
     @Autowired
     private IEnterpriseFolderService enterpriseFolderService;
+    @Autowired
+    private EnterpriseMessageMapper enterpriseMessageMapper;
+    @Autowired
+    private PersonalMessageMapper personalMessageMapper;
 
     @Override
     public List<MailboxInfo> getMailboxInfoListByUserId(List<Long> userIdList, Integer mailType) {
@@ -104,15 +109,25 @@ public class MailServiceImpl implements IMailService {
     public PageWrapper<MessageVo> getMessagePage(GetMessagePageDto dto) {
 
         PageWrapper<MessageVo> pageWrapper;
-        IMAPStore imapStore;
-        IMAPFolder folder;
+//        IMAPStore imapStore;
+//        IMAPFolder folder;
 
         // 个人邮箱
         if (dto.getType().equals(1)) {
-            Page<PersonalMessage> page = personalMessageService.page(dto, q -> q
-                    .eq(PersonalMessage::getFolderId, dto.getFolderId())
-                    .orderByDesc(PersonalMessage::getSendDate)
+            QueryWrapper<PersonalMessage> wrapper = Wrappers.query();
+            wrapper.eq("pm.folder_id", dto.getFolderId());
+            wrapper.and(ObjectUtil.isNotEmpty(dto.getKeyword()), q1 -> q1
+                    .like("pm.from_email", dto.getKeyword())
+                    .or().like("pm.from_personal_name", dto.getKeyword())
+                    .or().like("pm.subject", dto.getKeyword())
+                    .or().like("pmc.content", dto.getKeyword())
             );
+            wrapper.orderByDesc("pm.send_date");
+            Page<PersonalMessage> page = personalMessageMapper.getPage(dto.getPage(), wrapper);
+//            Page<PersonalMessage> page = personalMessageService.page(dto, q -> q
+//                    .eq(PersonalMessage::getFolderId, dto.getFolderId())
+//                    .orderByDesc(PersonalMessage::getSendDate)
+//            );
 
             pageWrapper = new PageWrapper<>(page, MessageVo.class);
 
@@ -125,21 +140,31 @@ public class MailServiceImpl implements IMailService {
                 throw new ServiceException("文件夹已被删除");
             }
 
-            MailboxInfo mailboxInfo = getMailboxInfo(1, personalFolder.getMailboxId());
-            imapStore = ImapUtil.getStore(
-                    mailboxInfo.getReceiveHost(),
-                    mailboxInfo.getMailUser(),
-                    mailboxInfo.getMailPassword()
-            );
-            folder = (IMAPFolder) imapStore.getFolder(personalFolder.getName());
+//            MailboxInfo mailboxInfo = getMailboxInfo(1, personalFolder.getMailboxId());
+//            imapStore = ImapUtil.getStore(
+//                    mailboxInfo.getReceiveHost(),
+//                    mailboxInfo.getMailUser(),
+//                    mailboxInfo.getMailPassword()
+//            );
+//            folder = (IMAPFolder) imapStore.getFolder(personalFolder.getName());
         }
 
         // 企业邮箱
         else {
-            Page<EnterpriseMessage> page = enterpriseMessageService.page(dto, q -> q
-                    .eq(EnterpriseMessage::getFolderId, dto.getFolderId())
-                    .orderByDesc(EnterpriseMessage::getSendDate)
+            QueryWrapper<EnterpriseMessage> wrapper = Wrappers.query();
+            wrapper.eq("em.folder_id", dto.getFolderId());
+            wrapper.and(ObjectUtil.isNotEmpty(dto.getKeyword()), q1 -> q1
+                    .like("em.from_email", dto.getKeyword())
+                    .or().like("em.from_personal_name", dto.getKeyword())
+                    .or().like("em.subject", dto.getKeyword())
+                    .or().like("emc.content", dto.getKeyword())
             );
+            wrapper.orderByDesc("em.send_date");
+            Page<EnterpriseMessage> page = enterpriseMessageMapper.getPage(dto.getPage(), wrapper);
+//            Page<EnterpriseMessage> page = enterpriseMessageService.page(dto, q -> q
+//                    .eq(EnterpriseMessage::getFolderId, dto.getFolderId())
+//                    .orderByDesc(EnterpriseMessage::getSendDate)
+//            );
 
             pageWrapper = new PageWrapper<>(page, MessageVo.class);
 
@@ -152,38 +177,38 @@ public class MailServiceImpl implements IMailService {
                 throw new ServiceException("文件夹已被删除");
             }
 
-            MailboxInfo mailboxInfo = getMailboxInfo(2, enterpriseFolder.getMailboxId());
-            imapStore = ImapUtil.getStore(
-                    mailboxInfo.getReceiveHost(),
-                    mailboxInfo.getMailUser(),
-                    mailboxInfo.getMailPassword()
-            );
-            folder = (IMAPFolder) imapStore.getFolder(enterpriseFolder.getName());
+//            MailboxInfo mailboxInfo = getMailboxInfo(2, enterpriseFolder.getMailboxId());
+//            imapStore = ImapUtil.getStore(
+//                    mailboxInfo.getReceiveHost(),
+//                    mailboxInfo.getMailUser(),
+//                    mailboxInfo.getMailPassword()
+//            );
+//            folder = (IMAPFolder) imapStore.getFolder(enterpriseFolder.getName());
         }
 
-        folder.open(Folder.READ_ONLY);
-
-        ArrayList<CompletableFuture<Void>> futureList = new ArrayList<>();
-        for (MessageVo messageVo : pageWrapper.getRows()) {
-            CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
-                Long uid = messageVo.getUid();
-                try {
-                    Message message = folder.getMessageByUID(uid);
-                    if (message != null) {
-                        String flags = ImapUtil.getFlags(message.getFlags());
-                        messageVo.setFlags(flags);
-                    }
-                } catch (MessagingException e) {
-                    throw new ServiceException("获取邮件是否已读失败");
-                }
-            }, executor);
-            futureList.add(completableFuture);
-        }
-
-        futureList.forEach(CompletableFuture::join);
-
-        ImapUtil.closeFolder(folder);
-        ImapUtil.closeStore(imapStore);
+//        folder.open(Folder.READ_ONLY);
+
+//        ArrayList<CompletableFuture<Void>> futureList = new ArrayList<>();
+//        for (MessageVo messageVo : pageWrapper.getRows()) {
+//            CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
+//                Long uid = messageVo.getUid();
+//                try {
+//                    Message message = folder.getMessageByUID(uid);
+//                    if (message != null) {
+//                        String flags = ImapUtil.getFlags(message.getFlags());
+//                        messageVo.setFlags(flags);
+//                    }
+//                } catch (MessagingException e) {
+//                    throw new ServiceException("获取邮件是否已读失败");
+//                }
+//            }, executor);
+//            futureList.add(completableFuture);
+//        }
+//
+//        futureList.forEach(CompletableFuture::join);
+//
+//        ImapUtil.closeFolder(folder);
+//        ImapUtil.closeStore(imapStore);
 
         return pageWrapper;
     }
@@ -199,12 +224,17 @@ public class MailServiceImpl implements IMailService {
         String folderName;
         Long uid;
 
+        //发件人地址
+        String fromEmail;
+
         if (type.equals(1)) {
             PersonalMessage personalMessage = personalMessageService.getById(messageId);
             if (personalMessage == null) {
                 throw new ServiceException("没有找到邮箱");
             }
 
+            fromEmail = personalMessage.getFromEmail();
+
             mailboxId = personalMessage.getMailboxId();
             syncStatus = personalMessage.getSyncStatus();
             folderName = personalMessage.getFolderName();
@@ -215,14 +245,65 @@ public class MailServiceImpl implements IMailService {
                 throw new ServiceException("没有找到邮箱");
             }
 
+            fromEmail = enterpriseMessage.getFromEmail();
+
             mailboxId = enterpriseMessage.getMailboxId();
             syncStatus = enterpriseMessage.getSyncStatus();
             folderName = enterpriseMessage.getFolderName();
             uid = enterpriseMessage.getUid();
         }
 
+
+        //设置已读
+        CompletableFuture.runAsync(() -> {
+            MailboxInfo mailboxInfo = getMailboxInfo(type, mailboxId);
+            IMAPStore store = null;
+            IMAPFolder folder = null;
+            try {
+                store = ImapUtil.getStore(
+                        mailboxInfo.getReceiveHost(),
+                        mailboxInfo.getMailUser(),
+                        mailboxInfo.getMailPassword()
+                );
+                folder = (IMAPFolder) store.getFolder(folderName);
+                folder.open(Folder.READ_WRITE);
+                IMAPMessage message = (IMAPMessage) folder.getMessageByUID(uid);
+
+                if (message == null) {
+                    return;
+                }
+
+                // 设置已读
+                ImapUtil.setSeen(message);
+                String flags = ImapUtil.getFlags(message.getFlags());
+                if (type.equals(1)) {
+                    PersonalMessage personalMessage = personalMessageService.getById(messageId);
+                    if (personalMessage != null) {
+                        personalMessage.setFlags(flags);
+                        personalMessageService.updateById(personalMessage);
+                    }
+                } else {
+                    EnterpriseMessage enterpriseMessage = enterpriseMessageService.getById(messageId);
+                    if (enterpriseMessage != null) {
+                        enterpriseMessage.setFlags(flags);
+                        enterpriseMessageService.updateById(enterpriseMessage);
+                    }
+                }
+            } catch (Exception e) {
+                log.error("修改已读异常" + e.getMessage());
+            } finally {
+                try {
+                    ImapUtil.closeFolder(folder);
+                    ImapUtil.closeStore(store);
+                } catch (Exception e) {
+                    log.error("关闭链接失败");
+                }
+            }
+        });
+
         MessageDetailVo messageDetailVo = new MessageDetailVo();
         messageDetailVo.setMessageId(messageId);
+        messageDetailVo.setFromEmail(fromEmail);
 
         // 已同步
         if (syncStatus.equals(1)) {
@@ -319,27 +400,69 @@ public class MailServiceImpl implements IMailService {
     @Override
     public void setUnreadMessageCount(List<MailboxInfo> mailboxInfoList) {
 
-        for (MailboxInfo mailboxInfo : mailboxInfoList) {
+        List<Long> mailboxInfoIds = mailboxInfoList.stream().map(MailboxInfo::getId).collect(Collectors.toList());
+        List<MessageVo> unreadMessageCount = mailMapper.getUnreadMessageCount(Wrappers.query()
+                .in("m.mailbox_id", mailboxInfoIds)
+        );
+        Map<Long, MessageVo> unreadMessageCountMap = unreadMessageCount.stream().collect(Collectors.toMap(MessageVo::getFolderId, Function.identity()));
 
-            IMAPStore store = ImapUtil.getStore(
-                    mailboxInfo.getReceiveHost(),
-                    mailboxInfo.getMailUser(),
-                    mailboxInfo.getMailPassword()
-            );
+
+        for (MailboxInfo mailboxInfo : mailboxInfoList) {
 
             for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
-                String name = mailFolderInfo.getName();
-                if (StrUtil.equalsAnyIgnoreCase(name, "inbox")) {
-                    IMAPFolder folder = (IMAPFolder) store.getFolder(name);
-                    folder.open(Folder.READ_WRITE);
-                    int unreadMessageCount = folder.getUnreadMessageCount();
-                    mailFolderInfo.setUnreadMessageCount(unreadMessageCount);
-                    ImapUtil.closeFolder(folder);
-                    break;
-                }
+                MessageVo messageVo = unreadMessageCountMap.get(mailFolderInfo.getId());
+                int count = ObjectUtil.isEmpty(messageVo) ? 0 : messageVo.getCount();
+                mailFolderInfo.setUnreadMessageCount(count);
             }
 
-            ImapUtil.closeStore(store);
+//            IMAPStore store = ImapUtil.getStore(
+//                    mailboxInfo.getReceiveHost(),
+//                    mailboxInfo.getMailUser(),
+//                    mailboxInfo.getMailPassword()
+//            );
+//
+//            for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
+//                String name = mailFolderInfo.getName();
+//                if (StrUtil.equalsAnyIgnoreCase(name, "inbox")) {
+//                    IMAPFolder folder = (IMAPFolder) store.getFolder(name);
+//                    folder.open(Folder.READ_WRITE);
+//                    int unreadMessageCount = folder.getUnreadMessageCount();
+//                    mailFolderInfo.setUnreadMessageCount(unreadMessageCount);
+//                    ImapUtil.closeFolder(folder);
+//                    break;
+//                }
+//            }
+//
+//            ImapUtil.closeStore(store);
+
+//            if (Objects.equals(mailboxInfo.getType(), 1)) {
+//                //个人邮箱
+//                Map<Long, List<PersonalMessage>> personalMessageMap = personalMessageService.mapKGroup(PersonalMessage::getFolderId, q -> q
+//                        .eq(PersonalMessage::getMailboxId, mailboxInfo.getId())
+//                        .and(q1 -> q1
+//                                .isNull(PersonalMessage::getFlags)
+//                                .or().eq(PersonalMessage::getFlags, "")
+//                        )
+//                );
+//                MessageVo messageVo = unreadMessageCountMap.get(mailboxInfo.getId());
+//                for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
+//                    List<PersonalMessage> personalMessages = personalMessageMap.getOrDefault(mailFolderInfo.getId(), new ArrayList<>());
+//                    mailFolderInfo.setUnreadMessageCount(personalMessages.size());
+//                }
+//            } else {
+//                //企业邮箱
+//                Map<Long, List<EnterpriseMessage>> enterpriseMessageMap = enterpriseMessageService.mapKGroup(EnterpriseMessage::getFolderId, q -> q
+//                        .eq(EnterpriseMessage::getMailboxId, mailboxInfo.getId())
+//                        .and(q1 -> q1
+//                                .isNull(EnterpriseMessage::getFlags)
+//                                .or().eq(EnterpriseMessage::getFlags, "")
+//                        )
+//                );
+//                for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
+//                    List<EnterpriseMessage> personalMessages = enterpriseMessageMap.getOrDefault(mailFolderInfo.getId(), new ArrayList<>());
+//                    mailFolderInfo.setUnreadMessageCount(personalMessages.size());
+//                }
+//            }
         }
 
     }
@@ -359,10 +482,83 @@ public class MailServiceImpl implements IMailService {
 
         Message[] messages = folder.getMessagesByUID(uids);
 
-        Flags flags = new Flags();
-        flags.add(Flags.Flag.SEEN);
+        for (Message message : messages) {
+            Flags flags = message.getFlags();
+            flags.add(Flags.Flag.SEEN);
+            message.setFlags(flags, true);
+
+            long uid = folder.getUID(message);
+            if (dto.getType() == 1) {
+                //个人邮箱
+                personalMessageService.update(q -> q
+                        .eq(PersonalMessage::getUid, uid)
+                        .set(PersonalMessage::getFlags, ImapUtil.getFlags(flags))
+                );
+            } else {
+                //企业邮箱
+                enterpriseMessageService.update(q -> q
+                        .eq(EnterpriseMessage::getUid, uid)
+                        .set(EnterpriseMessage::getFlags, ImapUtil.getFlags(flags))
+                );
+            }
+        }
+
+
+//        Flags flags = new Flags();
+//        flags.add(Flags.Flag.SEEN);
+//
+//        folder.setFlags(messages, flags, true);
+//
+//        if(dto.getType()==1){
+//            //个人邮箱
+//            personalMessageService.update(q->q
+//                    .in(PersonalMessage::getUid,uids)
+//                    .set(PersonalMessage::getFlags, ImapUtil.getFlags(flags))
+//            );
+//        }else{
+//            //企业邮箱
+//            enterpriseMessageService.update(q->q
+//                    .in(EnterpriseMessage::getUid,uids)
+//                    .set(EnterpriseMessage::getFlags, ImapUtil.getFlags(flags))
+//            );
+//        }
+    }
+
+    @Override
+    public void cancelSeen(String host, String user, String password, SetSeenDto dto) throws MessagingException {
+        IMAPStore store = ImapUtil.getStore(host, user, password);
+        IMAPFolder folder = (IMAPFolder) store.getFolder(dto.getFolderName());
+        folder.open(Folder.READ_WRITE);
+
+        List<Long> uidList = dto.getUidList();
+
+        long[] uids = new long[uidList.size()];
+        for (int i = 0; i < uidList.size(); i++) {
+            uids[i] = uidList.get(i);
+        }
+
+        Message[] messages = folder.getMessagesByUID(uids);
+
+        for (Message message : messages) {
+            Flags flags = message.getFlags();
+            flags.remove(Flags.Flag.SEEN);
+            message.setFlags(flags, true);
 
-        folder.setFlags(messages, flags, true);
+            long uid = folder.getUID(message);
+            if (dto.getType() == 1) {
+                //个人邮箱
+                personalMessageService.update(q -> q
+                        .eq(PersonalMessage::getUid, uid)
+                        .set(PersonalMessage::getFlags, ImapUtil.getFlags(flags))
+                );
+            } else {
+                //企业邮箱
+                enterpriseMessageService.update(q -> q
+                        .eq(EnterpriseMessage::getUid, uid)
+                        .set(EnterpriseMessage::getFlags, ImapUtil.getFlags(flags))
+                );
+            }
+        }
     }
 
     /**
@@ -574,7 +770,7 @@ public class MailServiceImpl implements IMailService {
             }
 
             @Override
-            public void unknown(Part part) throws MessagingException, IOException {
+            public void unknown(Part part) throws MessagingException {
                 log.error("id为 {} 的邮件存在未知类型:{}", vo.getMessageId(), part.getContentType());
             }