24282 2 gadi atpakaļ
vecāks
revīzija
a0625916c7
53 mainītis faili ar 1431 papildinājumiem un 21 dzēšanām
  1. 12 0
      pom.xml
  2. 1 1
      src/main/java/com/fjhx/email/config/base/BaseSelectDto.java
  3. 2 2
      src/main/java/com/fjhx/email/config/base/BaseService.java
  4. 18 0
      src/main/java/com/fjhx/email/controller/EnterpriseMessageAddressController.java
  5. 18 0
      src/main/java/com/fjhx/email/controller/EnterpriseMessageAttachmentController.java
  6. 18 0
      src/main/java/com/fjhx/email/controller/EnterpriseMessageContentController.java
  7. 37 8
      src/main/java/com/fjhx/email/controller/MailController.java
  8. 18 0
      src/main/java/com/fjhx/email/controller/PersonalMessageAddressController.java
  9. 18 0
      src/main/java/com/fjhx/email/controller/PersonalMessageAttachmentController.java
  10. 18 0
      src/main/java/com/fjhx/email/controller/PersonalMessageContentController.java
  11. 1 1
      src/main/java/com/fjhx/email/entity/EnterpriseDomain.java
  12. 40 0
      src/main/java/com/fjhx/email/entity/EnterpriseMessageAddress.java
  13. 35 0
      src/main/java/com/fjhx/email/entity/EnterpriseMessageAttachment.java
  14. 35 0
      src/main/java/com/fjhx/email/entity/EnterpriseMessageContent.java
  15. 40 0
      src/main/java/com/fjhx/email/entity/PersonalMessageAddress.java
  16. 35 0
      src/main/java/com/fjhx/email/entity/PersonalMessageAttachment.java
  17. 35 0
      src/main/java/com/fjhx/email/entity/PersonalMessageContent.java
  18. 28 0
      src/main/java/com/fjhx/email/entity/dto/GetMessagePageDto.java
  19. 69 0
      src/main/java/com/fjhx/email/entity/vo/MessageDetailVo.java
  20. 57 0
      src/main/java/com/fjhx/email/entity/vo/MessageVo.java
  21. 16 0
      src/main/java/com/fjhx/email/mapper/EnterpriseMessageAddressMapper.java
  22. 16 0
      src/main/java/com/fjhx/email/mapper/EnterpriseMessageAttachmentMapper.java
  23. 16 0
      src/main/java/com/fjhx/email/mapper/EnterpriseMessageContentMapper.java
  24. 16 0
      src/main/java/com/fjhx/email/mapper/PersonalMessageAddressMapper.java
  25. 16 0
      src/main/java/com/fjhx/email/mapper/PersonalMessageAttachmentMapper.java
  26. 16 0
      src/main/java/com/fjhx/email/mapper/PersonalMessageContentMapper.java
  27. 5 0
      src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageAddressMapper.xml
  28. 5 0
      src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageAttachmentMapper.xml
  29. 5 0
      src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageContentMapper.xml
  30. 5 0
      src/main/java/com/fjhx/email/mapper/xml/PersonalMessageAddressMapper.xml
  31. 5 0
      src/main/java/com/fjhx/email/mapper/xml/PersonalMessageAttachmentMapper.xml
  32. 5 0
      src/main/java/com/fjhx/email/mapper/xml/PersonalMessageContentMapper.xml
  33. 16 0
      src/main/java/com/fjhx/email/service/IEnterpriseMessageAddressService.java
  34. 16 0
      src/main/java/com/fjhx/email/service/IEnterpriseMessageAttachmentService.java
  35. 16 0
      src/main/java/com/fjhx/email/service/IEnterpriseMessageContentService.java
  36. 14 0
      src/main/java/com/fjhx/email/service/IMailService.java
  37. 16 0
      src/main/java/com/fjhx/email/service/IPersonalMessageAddressService.java
  38. 16 0
      src/main/java/com/fjhx/email/service/IPersonalMessageAttachmentService.java
  39. 16 0
      src/main/java/com/fjhx/email/service/IPersonalMessageContentService.java
  40. 3 4
      src/main/java/com/fjhx/email/service/impl/CoreServiceImpl.java
  41. 20 0
      src/main/java/com/fjhx/email/service/impl/EnterpriseMessageAddressServiceImpl.java
  42. 20 0
      src/main/java/com/fjhx/email/service/impl/EnterpriseMessageAttachmentServiceImpl.java
  43. 20 0
      src/main/java/com/fjhx/email/service/impl/EnterpriseMessageContentServiceImpl.java
  44. 1 1
      src/main/java/com/fjhx/email/service/impl/EnterpriseMessageServiceImpl.java
  45. 389 1
      src/main/java/com/fjhx/email/service/impl/MailServiceImpl.java
  46. 20 0
      src/main/java/com/fjhx/email/service/impl/PersonalMessageAddressServiceImpl.java
  47. 20 0
      src/main/java/com/fjhx/email/service/impl/PersonalMessageAttachmentServiceImpl.java
  48. 20 0
      src/main/java/com/fjhx/email/service/impl/PersonalMessageContentServiceImpl.java
  49. 33 0
      src/main/java/com/fjhx/email/utils/EmailUtil.java
  50. 105 0
      src/main/java/com/fjhx/email/utils/ObsFileUtil.java
  51. 2 2
      src/main/resources/application-dev.yml
  52. 6 0
      src/main/resources/application.yml
  53. 1 1
      src/test/java/CodeGeneration.java

+ 12 - 0
pom.xml

@@ -80,6 +80,18 @@
             <version>2.0.25</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.huaweicloud</groupId>
+            <artifactId>esdk-obs-java</artifactId>
+            <version>3.19.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okio</groupId>
+            <artifactId>okio</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 1 - 1
src/main/java/com/fjhx/email/config/base/BaseSelectVo.java → src/main/java/com/fjhx/email/config/base/BaseSelectDto.java

@@ -9,7 +9,7 @@ import java.io.Serializable;
 import java.util.Date;
 
 @Data
-public class BaseSelectVo implements Serializable {
+public class BaseSelectDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 

+ 2 - 2
src/main/java/com/fjhx/email/config/base/BaseService.java

@@ -18,8 +18,8 @@ import java.util.stream.Collectors;
 public interface BaseService<T> extends IService<T> {
 
 
-    default Page<T> page(BaseSelectVo baseSelectVo, Consumer<LambdaQueryWrapper<T>> consumer) {
-        return page(baseSelectVo.getPage(), Wrappers.<T>lambdaQuery().func(consumer));
+    default Page<T> page(BaseSelectDto baseSelectDto, Consumer<LambdaQueryWrapper<T>> consumer) {
+        return page(baseSelectDto.getPage(), Wrappers.<T>lambdaQuery().func(consumer));
     }
 
     default long count(Consumer<LambdaQueryWrapper<T>> consumer) {

+ 18 - 0
src/main/java/com/fjhx/email/controller/EnterpriseMessageAddressController.java

@@ -0,0 +1,18 @@
+package com.fjhx.email.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 企业邮件地址 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@RestController
+@RequestMapping("/enterpriseMessageAddress")
+public class EnterpriseMessageAddressController {
+
+}

+ 18 - 0
src/main/java/com/fjhx/email/controller/EnterpriseMessageAttachmentController.java

@@ -0,0 +1,18 @@
+package com.fjhx.email.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 企业邮件附件 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@RestController
+@RequestMapping("/enterpriseMessageAttachment")
+public class EnterpriseMessageAttachmentController {
+
+}

+ 18 - 0
src/main/java/com/fjhx/email/controller/EnterpriseMessageContentController.java

@@ -0,0 +1,18 @@
+package com.fjhx.email.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 企业邮件正文 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@RestController
+@RequestMapping("/enterpriseMessageContent")
+public class EnterpriseMessageContentController {
+
+}

+ 37 - 8
src/main/java/com/fjhx/email/controller/MailController.java

@@ -4,17 +4,18 @@ import cn.hutool.core.io.IORuntimeException;
 import cn.hutool.core.thread.ThreadUtil;
 import com.fjhx.email.config.base.R;
 import com.fjhx.email.config.exception.ServiceException;
+import com.fjhx.email.entity.dto.GetMessagePageDto;
 import com.fjhx.email.entity.dto.MailSyncInfo;
 import com.fjhx.email.entity.dto.MailboxInfo;
+import com.fjhx.email.entity.vo.MessageDetailVo;
+import com.fjhx.email.entity.vo.MessageVo;
 import com.fjhx.email.service.IMailService;
 import com.fjhx.email.utils.HxHttpUtil;
+import com.fjhx.email.utils.PageWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.Collections;
 import java.util.List;
@@ -25,8 +26,6 @@ import java.util.stream.Collectors;
 @RequestMapping("/mailService")
 public class MailController {
 
-    private static final Object syncLock = new Object();
-
     @Autowired
     private IMailService mailService;
 
@@ -36,7 +35,7 @@ public class MailController {
     @Scheduled(cron = "0 0 0/1 * * ?")
     public void checkStart() {
         try {
-            synchronized (syncLock) {
+            synchronized (this) {
                 List<Long> onlineUserIdList = HxHttpUtil.getOnlineUserIdList();
                 MailSyncInfo.mailboxInfoList = mailService.getMailboxInfoListByUserId(onlineUserIdList);
             }
@@ -55,10 +54,13 @@ public class MailController {
         }
     }
 
+    /**
+     * 统计登录用户id
+     */
     @GetMapping("/userLogin/{userId}")
     public R userLogin(@PathVariable("userId") Long userId) {
         try {
-            synchronized (syncLock) {
+            synchronized (this) {
 
                 List<MailboxInfo> mailboxInfoList = mailService.getMailboxInfoListByUserId(Collections.singletonList(userId));
 
@@ -83,5 +85,32 @@ public class MailController {
         return R.ok();
     }
 
+    /**
+     * 获取用户邮箱列表
+     */
+    @GetMapping("/getUserEmailList/{userId}")
+    public R getUserEmailList(@PathVariable("userId") Long userId) {
+        List<MailboxInfo> mailboxInfoList = mailService.getMailboxInfoListByUserId(Collections.singletonList(userId));
+        return R.ok(mailboxInfoList);
+    }
+
+    /**
+     * 获取用户邮箱列表
+     */
+    @PostMapping("/getMessagePage")
+    public R getMessagePage(@RequestBody GetMessagePageDto dto) {
+        PageWrapper<MessageVo> messagePage = mailService.getMessagePage(dto);
+        return R.ok(messagePage);
+    }
+
+    /**
+     * 获取邮件详情
+     */
+    @PostMapping("/getMessageDetail")
+    public R getMessageDetail(@RequestBody GetMessagePageDto dto) {
+        MessageDetailVo vo = mailService.getMessageDetail(dto);
+        return R.ok(vo);
+    }
+
 
 }

+ 18 - 0
src/main/java/com/fjhx/email/controller/PersonalMessageAddressController.java

@@ -0,0 +1,18 @@
+package com.fjhx.email.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 个人邮件地址 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@RestController
+@RequestMapping("/personalMessageAddress")
+public class PersonalMessageAddressController {
+
+}

+ 18 - 0
src/main/java/com/fjhx/email/controller/PersonalMessageAttachmentController.java

@@ -0,0 +1,18 @@
+package com.fjhx.email.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 个人邮件附件 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@RestController
+@RequestMapping("/personalMessageAttachment")
+public class PersonalMessageAttachmentController {
+
+}

+ 18 - 0
src/main/java/com/fjhx/email/controller/PersonalMessageContentController.java

@@ -0,0 +1,18 @@
+package com.fjhx.email.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 个人邮件正文 前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@RestController
+@RequestMapping("/personalMessageContent")
+public class PersonalMessageContentController {
+
+}

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

@@ -36,7 +36,7 @@ public class EnterpriseDomain extends BaseEntity {
     /**
      * 收件端口
      */
-    private Byte receivePort;
+    private Integer receivePort;
 
     /**
      * 收件协议

+ 40 - 0
src/main/java/com/fjhx/email/entity/EnterpriseMessageAddress.java

@@ -0,0 +1,40 @@
+package com.fjhx.email.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 企业邮件地址
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Getter
+@Setter
+@TableName("enterprise_message_address")
+public class EnterpriseMessageAddress extends BaseEntity {
+
+    /**
+     * 邮件主表id
+     */
+    private Long messageId;
+
+    /**
+     * 类型 1收件人(to) 2抄送人(cc) 3密送人(bcc) 4回复人(replyTo)
+     */
+    private Byte type;
+
+    /**
+     * email地址
+     */
+    private String email;
+
+    /**
+     * email名称
+     */
+    private String personalName;
+}

+ 35 - 0
src/main/java/com/fjhx/email/entity/EnterpriseMessageAttachment.java

@@ -0,0 +1,35 @@
+package com.fjhx.email.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 企业邮件附件
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Getter
+@Setter
+@TableName("enterprise_message_attachment")
+public class EnterpriseMessageAttachment extends BaseEntity {
+
+    /**
+     * 邮件主表id
+     */
+    private Long messageId;
+
+    /**
+     * 附件名称
+     */
+    private String name;
+
+    /**
+     * 附件url
+     */
+    private String url;
+}

+ 35 - 0
src/main/java/com/fjhx/email/entity/EnterpriseMessageContent.java

@@ -0,0 +1,35 @@
+package com.fjhx.email.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 企业邮件正文
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Getter
+@Setter
+@TableName("enterprise_message_content")
+public class EnterpriseMessageContent extends BaseEntity {
+
+    /**
+     * 邮件主表id
+     */
+    private Long messageId;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 类型
+     */
+    private String mimeType;
+}

+ 40 - 0
src/main/java/com/fjhx/email/entity/PersonalMessageAddress.java

@@ -0,0 +1,40 @@
+package com.fjhx.email.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 个人邮件地址
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Getter
+@Setter
+@TableName("personal_message_address")
+public class PersonalMessageAddress extends BaseEntity {
+
+    /**
+     * 邮件主表id
+     */
+    private Long messageId;
+
+    /**
+     * 类型 1收件人(to) 2抄送人(cc) 3密送人(bcc) 4回复人(replyTo)
+     */
+    private Integer type;
+
+    /**
+     * email地址
+     */
+    private String email;
+
+    /**
+     * email名称
+     */
+    private String personalName;
+}

+ 35 - 0
src/main/java/com/fjhx/email/entity/PersonalMessageAttachment.java

@@ -0,0 +1,35 @@
+package com.fjhx.email.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 个人邮件附件
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Getter
+@Setter
+@TableName("personal_message_attachment")
+public class PersonalMessageAttachment extends BaseEntity {
+
+    /**
+     * 邮件主表id
+     */
+    private Long messageId;
+
+    /**
+     * 附件名称
+     */
+    private String name;
+
+    /**
+     * 附件url
+     */
+    private String url;
+}

+ 35 - 0
src/main/java/com/fjhx/email/entity/PersonalMessageContent.java

@@ -0,0 +1,35 @@
+package com.fjhx.email.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.email.config.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 个人邮件正文
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Getter
+@Setter
+@TableName("personal_message_content")
+public class PersonalMessageContent extends BaseEntity {
+
+    /**
+     * 邮件主表id
+     */
+    private Long messageId;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 类型
+     */
+    private String mimeType;
+}

+ 28 - 0
src/main/java/com/fjhx/email/entity/dto/GetMessagePageDto.java

@@ -0,0 +1,28 @@
+package com.fjhx.email.entity.dto;
+
+import com.fjhx.email.config.base.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class GetMessagePageDto extends BaseSelectDto {
+
+    /**
+     * 文件夹id
+     */
+    private Long folderId;
+
+    /**
+     * 类型
+     * 1、个人邮箱
+     * 2、企业邮箱
+     */
+    private Integer type;
+
+    /**
+     * 邮件id
+     */
+    private Long messageId;
+
+}

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

@@ -0,0 +1,69 @@
+package com.fjhx.email.entity.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class MessageDetailVo {
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 类型
+     */
+    private String mimeType;
+
+    /**
+     * 邮件关联地址
+     */
+    List<MessageAddress> messageAddressList;
+
+    /**
+     * 附件
+     */
+    List<MessageAttachment> messageAttachmentList;
+
+    @Getter
+    @Setter
+    public static class MessageAddress {
+
+        /**
+         * 类型 1收件人(to) 2抄送人(cc) 3密送人(bcc) 4回复人(replyTo)
+         */
+        private Integer type;
+
+        /**
+         * email地址
+         */
+        private String email;
+
+        /**
+         * email名称
+         */
+        private String personalName;
+
+    }
+
+    @Getter
+    @Setter
+    public static class MessageAttachment {
+
+        /**
+         * 附件名称
+         */
+        private String name;
+
+        /**
+         * 附件url
+         */
+        private String url;
+
+    }
+
+}

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

@@ -0,0 +1,57 @@
+package com.fjhx.email.entity.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+public class MessageVo {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 邮件id
+     */
+    private String messageId;
+
+    /**
+     * 消息数量
+     */
+    private Integer messageNumber;
+
+    /**
+     * 邮件标题
+     */
+    private String subject;
+
+    /**
+     * 邮件标记
+     */
+    private String flags;
+
+    /**
+     * 发件人email
+     */
+    private String fromEmail;
+
+    /**
+     * 发件人名称
+     */
+    private String fromPersonalName;
+
+    /**
+     * 发件类型
+     */
+    private String fromType;
+
+    /**
+     * 发件时间
+     */
+    private Date sendDate;
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/mapper/EnterpriseMessageAddressMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.mapper;
+
+import com.fjhx.email.entity.EnterpriseMessageAddress;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 企业邮件地址 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface EnterpriseMessageAddressMapper extends BaseMapper<EnterpriseMessageAddress> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/mapper/EnterpriseMessageAttachmentMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.mapper;
+
+import com.fjhx.email.entity.EnterpriseMessageAttachment;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 企业邮件附件 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface EnterpriseMessageAttachmentMapper extends BaseMapper<EnterpriseMessageAttachment> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/mapper/EnterpriseMessageContentMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.mapper;
+
+import com.fjhx.email.entity.EnterpriseMessageContent;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 企业邮件正文 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface EnterpriseMessageContentMapper extends BaseMapper<EnterpriseMessageContent> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/mapper/PersonalMessageAddressMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.mapper;
+
+import com.fjhx.email.entity.PersonalMessageAddress;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 个人邮件地址 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface PersonalMessageAddressMapper extends BaseMapper<PersonalMessageAddress> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/mapper/PersonalMessageAttachmentMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.mapper;
+
+import com.fjhx.email.entity.PersonalMessageAttachment;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 个人邮件附件 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface PersonalMessageAttachmentMapper extends BaseMapper<PersonalMessageAttachment> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/mapper/PersonalMessageContentMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.mapper;
+
+import com.fjhx.email.entity.PersonalMessageContent;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 个人邮件正文 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface PersonalMessageContentMapper extends BaseMapper<PersonalMessageContent> {
+
+}

+ 5 - 0
src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageAddressMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.email.mapper.EnterpriseMessageAddressMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageAttachmentMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.email.mapper.EnterpriseMessageAttachmentMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/fjhx/email/mapper/xml/EnterpriseMessageContentMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.email.mapper.EnterpriseMessageContentMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/fjhx/email/mapper/xml/PersonalMessageAddressMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.email.mapper.PersonalMessageAddressMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/fjhx/email/mapper/xml/PersonalMessageAttachmentMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.email.mapper.PersonalMessageAttachmentMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/fjhx/email/mapper/xml/PersonalMessageContentMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.email.mapper.PersonalMessageContentMapper">
+
+</mapper>

+ 16 - 0
src/main/java/com/fjhx/email/service/IEnterpriseMessageAddressService.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.service;
+
+import com.fjhx.email.entity.EnterpriseMessageAddress;
+import com.fjhx.email.config.base.BaseService;
+
+/**
+ * <p>
+ * 企业邮件地址 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface IEnterpriseMessageAddressService extends BaseService<EnterpriseMessageAddress> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/service/IEnterpriseMessageAttachmentService.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.service;
+
+import com.fjhx.email.entity.EnterpriseMessageAttachment;
+import com.fjhx.email.config.base.BaseService;
+
+/**
+ * <p>
+ * 企业邮件附件 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface IEnterpriseMessageAttachmentService extends BaseService<EnterpriseMessageAttachment> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/service/IEnterpriseMessageContentService.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.service;
+
+import com.fjhx.email.entity.EnterpriseMessageContent;
+import com.fjhx.email.config.base.BaseService;
+
+/**
+ * <p>
+ * 企业邮件正文 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface IEnterpriseMessageContentService extends BaseService<EnterpriseMessageContent> {
+
+}

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

@@ -1,6 +1,10 @@
 package com.fjhx.email.service;
 
+import com.fjhx.email.entity.dto.GetMessagePageDto;
 import com.fjhx.email.entity.dto.MailboxInfo;
+import com.fjhx.email.entity.vo.MessageDetailVo;
+import com.fjhx.email.entity.vo.MessageVo;
+import com.fjhx.email.utils.PageWrapper;
 
 import java.util.List;
 
@@ -11,4 +15,14 @@ public interface IMailService {
      */
     List<MailboxInfo> getMailboxInfoListByUserId(List<Long> userIdList);
 
+    /**
+     * 获取用户邮箱列表
+     */
+    PageWrapper<MessageVo> getMessagePage(GetMessagePageDto dto);
+
+    /**
+     * 获取邮件详情
+     */
+    MessageDetailVo getMessageDetail(GetMessagePageDto dto);
+
 }

+ 16 - 0
src/main/java/com/fjhx/email/service/IPersonalMessageAddressService.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.service;
+
+import com.fjhx.email.entity.PersonalMessageAddress;
+import com.fjhx.email.config.base.BaseService;
+
+/**
+ * <p>
+ * 个人邮件地址 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface IPersonalMessageAddressService extends BaseService<PersonalMessageAddress> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/service/IPersonalMessageAttachmentService.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.service;
+
+import com.fjhx.email.entity.PersonalMessageAttachment;
+import com.fjhx.email.config.base.BaseService;
+
+/**
+ * <p>
+ * 个人邮件附件 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface IPersonalMessageAttachmentService extends BaseService<PersonalMessageAttachment> {
+
+}

+ 16 - 0
src/main/java/com/fjhx/email/service/IPersonalMessageContentService.java

@@ -0,0 +1,16 @@
+package com.fjhx.email.service;
+
+import com.fjhx.email.entity.PersonalMessageContent;
+import com.fjhx.email.config.base.BaseService;
+
+/**
+ * <p>
+ * 个人邮件正文 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+public interface IPersonalMessageContentService extends BaseService<PersonalMessageContent> {
+
+}

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

@@ -99,8 +99,7 @@ public class CoreServiceImpl implements ApplicationRunner {
 
         try {
             List<Long> onlineUserIdList = HxHttpUtil.getOnlineUserIdList();
-            List<MailboxInfo> mailboxInfoListByUserId = mailService.getMailboxInfoListByUserId(onlineUserIdList);
-            MailSyncInfo.mailboxInfoList = mailboxInfoListByUserId;
+            MailSyncInfo.mailboxInfoList = mailService.getMailboxInfoListByUserId(onlineUserIdList);
         } catch (IORuntimeException e) {
             log.error("获取主服务在线用户超时");
             ThreadUtil.sleep(1000 * 5);
@@ -108,12 +107,12 @@ public class CoreServiceImpl implements ApplicationRunner {
             return;
         } catch (ServiceException e) {
             log.error("主服务返回信息错误:{}", e.getMessage());
-            ThreadUtil.sleep(1000 * 5);
+            ThreadUtil.sleep(1000 * 30);
             run(args);
             return;
         } catch (Exception e) {
             log.error("解析错误", e);
-            ThreadUtil.sleep(1000 * 5);
+            ThreadUtil.sleep(1000 * 30);
             run(args);
             return;
         }

+ 20 - 0
src/main/java/com/fjhx/email/service/impl/EnterpriseMessageAddressServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.email.service.impl;
+
+import com.fjhx.email.entity.EnterpriseMessageAddress;
+import com.fjhx.email.mapper.EnterpriseMessageAddressMapper;
+import com.fjhx.email.service.IEnterpriseMessageAddressService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 企业邮件地址 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Service
+public class EnterpriseMessageAddressServiceImpl extends ServiceImpl<EnterpriseMessageAddressMapper, EnterpriseMessageAddress> implements IEnterpriseMessageAddressService {
+
+}

+ 20 - 0
src/main/java/com/fjhx/email/service/impl/EnterpriseMessageAttachmentServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.email.service.impl;
+
+import com.fjhx.email.entity.EnterpriseMessageAttachment;
+import com.fjhx.email.mapper.EnterpriseMessageAttachmentMapper;
+import com.fjhx.email.service.IEnterpriseMessageAttachmentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 企业邮件附件 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Service
+public class EnterpriseMessageAttachmentServiceImpl extends ServiceImpl<EnterpriseMessageAttachmentMapper, EnterpriseMessageAttachment> implements IEnterpriseMessageAttachmentService {
+
+}

+ 20 - 0
src/main/java/com/fjhx/email/service/impl/EnterpriseMessageContentServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.email.service.impl;
+
+import com.fjhx.email.entity.EnterpriseMessageContent;
+import com.fjhx.email.mapper.EnterpriseMessageContentMapper;
+import com.fjhx.email.service.IEnterpriseMessageContentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 企业邮件正文 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Service
+public class EnterpriseMessageContentServiceImpl extends ServiceImpl<EnterpriseMessageContentMapper, EnterpriseMessageContent> implements IEnterpriseMessageContentService {
+
+}

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

@@ -15,6 +15,6 @@ import org.springframework.stereotype.Service;
  * @since 2023-04-06
  */
 @Service
-public class EnterpriseMessageServiceImpl extends ServiceImpl<EnterpriseMessageMapper, EnterpriseMessage> implements IEnterpriseMessageService {
+public class  EnterpriseMessageServiceImpl extends ServiceImpl<EnterpriseMessageMapper, EnterpriseMessage> implements IEnterpriseMessageService {
 
 }

+ 389 - 1
src/main/java/com/fjhx/email/service/impl/MailServiceImpl.java

@@ -1,23 +1,411 @@
 package com.fjhx.email.service.impl;
 
+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.exception.ServiceException;
+import com.fjhx.email.entity.*;
+import com.fjhx.email.entity.dto.GetMessagePageDto;
 import com.fjhx.email.entity.dto.MailSyncInfo;
 import com.fjhx.email.entity.dto.MailboxInfo;
+import com.fjhx.email.entity.vo.MessageDetailVo;
+import com.fjhx.email.entity.vo.MessageVo;
 import com.fjhx.email.mapper.MailMapper;
-import com.fjhx.email.service.IMailService;
+import com.fjhx.email.service.*;
+import com.fjhx.email.utils.EmailUtil;
+import com.fjhx.email.utils.ObsFileUtil;
+import com.fjhx.email.utils.PageWrapper;
+import com.sun.mail.imap.IMAPFolder;
+import com.sun.mail.imap.IMAPMessage;
+import com.sun.mail.imap.IMAPStore;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.mail.*;
+import javax.mail.internet.MimeUtility;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
 import java.util.List;
 
+@Slf4j
 @Service
 public class MailServiceImpl implements IMailService {
 
     @Autowired
     private MailMapper mailMapper;
 
+    @Autowired
+    private IPersonalMessageService personalMessageService;
+
+    @Autowired
+    private IEnterpriseMessageService enterpriseMessageService;
+
+    @Autowired
+    private IEnterpriseMessageAddressService enterpriseMessageAddressService;
+
+    @Autowired
+    private IEnterpriseMessageAttachmentService enterpriseMessageAttachmentService;
+
+    @Autowired
+    private IEnterpriseMessageContentService enterpriseMessageContentService;
+
+    @Autowired
+    private IPersonalMessageAddressService personalMessageAddressService;
+
+    @Autowired
+    private IPersonalMessageAttachmentService personalMessageAttachmentService;
+
+    @Autowired
+    private IPersonalMessageContentService personalMessageContentService;
+
+    @Autowired
+    private IPersonalMailboxService personalMailboxService;
+
+    @Autowired
+    private IEnterpriseMailboxService enterpriseMailboxService;
+
+    @Autowired
+    private IEnterpriseDomainService enterpriseDomainService;
+
     @Override
     public List<MailboxInfo> getMailboxInfoListByUserId(List<Long> userIdList) {
         return mailMapper.getMailboxInfoListByUserId(userIdList, MailSyncInfo.mailType);
     }
 
+    @Override
+    public PageWrapper<MessageVo> getMessagePage(GetMessagePageDto dto) {
+
+        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);
+        }
+
+        Page<EnterpriseMessage> page = enterpriseMessageService.page(dto, q -> q
+                .eq(EnterpriseMessage::getFolderId, dto.getFolderId())
+                .orderByDesc(EnterpriseMessage::getSendDate)
+        );
+        return new PageWrapper<>(page, MessageVo.class);
+    }
+
+    @SneakyThrows
+    @Override
+    public MessageDetailVo getMessageDetail(GetMessagePageDto dto) {
+        Long messageId = dto.getMessageId();
+
+        Integer contentSync;
+        Integer addressSync;
+        Integer attachmentSync;
+
+        Integer messageNumber;
+
+        String folderName;
+        Long mailboxId;
+
+        if (dto.getType().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();
+            mailboxId = personalMessage.getMailboxId();
+        } 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();
+            mailboxId = enterpriseMessage.getMailboxId();
+        }
+
+        MessageDetailVo messageDetailVo = new MessageDetailVo();
+
+        // 正文附件已同步
+        if (contentSync == 1 && addressSync == 1 && attachmentSync == 1) {
+            if (dto.getType().equals(1)) {
+                setPersonalMessageDetailVo(messageDetailVo, messageId);
+            } else {
+                setEnterpriseMessageDetailVo(messageDetailVo, messageId);
+            }
+        }
+        // 未同步
+        else {
+
+            MailboxInfo mailboxInfo = getMailboxInfo(dto.getType(), mailboxId);
+
+            IMAPStore imapStore = EmailUtil.getIMAPStore(mailboxInfo);
+            IMAPFolder folder = (IMAPFolder) imapStore.getFolder(folderName);
+            folder.open(Folder.READ_ONLY);
+            IMAPMessage message = (IMAPMessage) folder.getMessage(messageNumber);
+
+            messageDetailVo.setMessageAttachmentList(new ArrayList<>());
+            getMessageAndAttachment(messageDetailVo, message, messageId);
+
+            messageDetailVo.setMessageAddressList(EmailUtil.mailAddressList(message));
+
+        }
+
+        for (MessageDetailVo.MessageAttachment messageAttachment : messageDetailVo.getMessageAttachmentList()) {
+            messageAttachment.setUrl(ObsFileUtil.getCompleteUrl(messageAttachment.getUrl()));
+        }
+
+        return messageDetailVo;
+    }
+
+    private MailboxInfo getMailboxInfo(Integer type, Long mailboxId) {
+        MailboxInfo mailboxInfo = new MailboxInfo();
+
+
+        if (type.equals(1)) {
+            PersonalMailbox personalMailbox = personalMailboxService.getById(mailboxId);
+            mailboxInfo.setReceiveHost(personalMailbox.getReceiveHost());
+            mailboxInfo.setReceivePort(personalMailbox.getReceivePort());
+            mailboxInfo.setMailUser(personalMailbox.getMailUser());
+            mailboxInfo.setMailPassword(personalMailbox.getMailPassword());
+
+            return mailboxInfo;
+        }
+
+        EnterpriseMailbox enterpriseMailbox = enterpriseMailboxService.getById(mailboxId);
+        EnterpriseDomain enterpriseDomain = enterpriseDomainService.getById(enterpriseMailbox.getDomainId());
+        mailboxInfo.setReceiveHost(enterpriseDomain.getReceiveHost());
+        mailboxInfo.setReceivePort(enterpriseDomain.getReceivePort());
+        mailboxInfo.setMailUser(enterpriseMailbox.getMailUserPrefix() + "@" + enterpriseDomain.getDomanName());
+        mailboxInfo.setMailPassword(enterpriseMailbox.getMailPassword());
+        return mailboxInfo;
+    }
+
+
+    private void setPersonalMessageDetailVo(MessageDetailVo vo, Long messageId) {
+        List<PersonalMessageAddress> addressList = personalMessageAddressService.list(
+                q -> q.eq(PersonalMessageAddress::getMessageId, messageId));
+        vo.setMessageAddressList(BeanUtil.copyToList(addressList, MessageDetailVo.MessageAddress.class));
+
+        List<PersonalMessageAttachment> attachmentList = personalMessageAttachmentService.list(
+                q -> q.eq(PersonalMessageAttachment::getMessageId, messageId));
+        vo.setMessageAttachmentList(BeanUtil.copyToList(attachmentList, MessageDetailVo.MessageAttachment.class));
+
+        PersonalMessageContent content = personalMessageContentService.getOne(
+                q -> q.eq(PersonalMessageContent::getMessageId, messageId));
+        vo.setContent(content.getContent());
+    }
+
+    private void setEnterpriseMessageDetailVo(MessageDetailVo vo, Long messageId) {
+        List<EnterpriseMessageAddress> addressList = enterpriseMessageAddressService.list(
+                q -> q.eq(EnterpriseMessageAddress::getMessageId, messageId));
+        vo.setMessageAddressList(BeanUtil.copyToList(addressList, MessageDetailVo.MessageAddress.class));
+
+        List<EnterpriseMessageAttachment> attachmentList = enterpriseMessageAttachmentService.list(
+                q -> q.eq(EnterpriseMessageAttachment::getMessageId, messageId));
+        vo.setMessageAttachmentList(BeanUtil.copyToList(attachmentList, MessageDetailVo.MessageAttachment.class));
+
+        EnterpriseMessageContent content = enterpriseMessageContentService.getOne(
+                q -> q.eq(EnterpriseMessageContent::getMessageId, messageId));
+        vo.setContent(content.getContent());
+    }
+
+    /**
+     * 保存附件和正文
+     */
+    private void getMessageAndAttachment(MessageDetailVo messageDetailVo, Part part, Long messageId)
+            throws MessagingException, IOException {
+
+        // 正文:文本格式
+        if (part.isMimeType("text/plain")) {
+            addPlain(part, messageDetailVo);
+        }
+
+        // 正文:html格式
+        else if (part.isMimeType("text/html")) {
+            addHtml(part, messageDetailVo);
+        }
+
+        // 正文:html格式
+        else if (part.isMimeType("text/html; charset=UTF-8")) {
+            addHtmlUtf8(part, messageDetailVo);
+        }
+
+        // 大对象
+        else if (part.isMimeType("multipart/*")) {
+
+            // 复杂体邮件
+            Multipart multipart = (Multipart) part.getContent();
+
+            // 复杂体邮件包含多个邮件体
+            int partCount = multipart.getCount();
+
+            for (int i = 0; i < partCount; i++) {
+
+                // 获得复杂体邮件中其中一个邮件体
+                BodyPart bodyPart = multipart.getBodyPart(i);
+
+                // 某一个邮件体也有可能是由多个邮件体组成的复杂体
+                String disposition = bodyPart.getDisposition();
+
+                // 正文:html格式
+                if (bodyPart.isMimeType("text/html")) {
+                    addHtml(bodyPart, messageDetailVo);
+                }
+
+                // 正文:文本格式
+                if (bodyPart.isMimeType("text/plain")) {
+                    addPlain(bodyPart, messageDetailVo);
+                }
+
+                // 正文:html格式
+                else if (part.isMimeType("text/html; charset=UTF-8")) {
+                    addHtmlUtf8(part, messageDetailVo);
+                }
+
+                // 附件
+                else if (disposition != null
+                        && (disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition.equalsIgnoreCase(Part.INLINE))) {
+                    MessageDetailVo.MessageAttachment messageAttachment = getMessageAttachment(bodyPart);
+                    messageDetailVo.getMessageAttachmentList().add(messageAttachment);
+                }
+
+                // 大对象
+                else if (bodyPart.isMimeType("multipart/*")) {
+                    getMessageAndAttachment(messageDetailVo, bodyPart, messageId);
+                }
+
+                // 其他类型
+                else {
+                    String contentType = bodyPart.getContentType();
+                    if (contentType.contains("name") || contentType.contains("application")) {
+                        MessageDetailVo.MessageAttachment messageAttachment = getMessageAttachment(bodyPart);
+                        messageDetailVo.getMessageAttachmentList().add(messageAttachment);
+                    } else {
+                        if (!contentType.equals("text/html; charset=UTF-8"))
+                            log.error("未知文件格式:{} ,邮件id:{},待解析", contentType, messageId);
+                    }
+                }
+
+            }
+        }
+
+        // rfc822
+        else if (part.isMimeType("message/rfc822")) {
+            getMessageAndAttachment(messageDetailVo, (Part) part.getContent(), messageId);
+        }
+
+        // 未知格式
+        else {
+            log.error("未知文件格式:{} ,邮件id:{},待解析", part.getContentType(), messageId);
+        }
+
+    }
+
+    private MessageDetailVo.MessageAttachment getMessageAttachment(Part part)
+            throws MessagingException, IOException {
+
+        InputStream is = part.getInputStream();
+        String fileName = decodeText(part.getFileName());
+
+        String url = ObsFileUtil.uploadFile(fileName, is);
+
+        MessageDetailVo.MessageAttachment messageAttachment = new MessageDetailVo.MessageAttachment();
+        messageAttachment.setUrl(url);
+        messageAttachment.setName(fileName);
+        return messageAttachment;
+    }
+
+    private void addHtml(Part part, MessageDetailVo messageDetailVo) throws MessagingException, IOException {
+        Object content = part.getContent();
+        if (content != null) {
+            messageDetailVo.setContent(content.toString());
+        } else {
+            messageDetailVo.setContent(StringPool.EMPTY);
+        }
+        messageDetailVo.setMimeType("text/html");
+    }
+
+    private void addHtmlUtf8(Part part, MessageDetailVo messageDetailVo) throws MessagingException, IOException {
+        Object content = part.getContent();
+        if (content != null) {
+            messageDetailVo.setContent(content.toString());
+        } else {
+            messageDetailVo.setContent(StringPool.EMPTY);
+        }
+        messageDetailVo.setMimeType("text/html; charset=UTF-8");
+    }
+
+    private void addPlain(Part part, MessageDetailVo messageDetailVo) throws MessagingException, IOException {
+        Object content = part.getContent();
+        if (content != null) {
+            if (ObjectUtil.notEqual(messageDetailVo.getMimeType(), "text/html")) {
+                messageDetailVo.setContent(content.toString());
+                messageDetailVo.setMimeType("text/plain");
+            }
+        }
+    }
+
+    /**
+     * 文本解码
+     */
+    private String decodeText(String encodeText) throws UnsupportedEncodingException {
+        if (encodeText == null || StringPool.EMPTY.equals(encodeText)) {
+            return StringPool.EMPTY;
+        } else {
+            return MimeUtility.decodeText(encodeText);
+        }
+    }
+
+    // /**
+    //  * 上传文件
+    //  */
+    // private String uploadFile(InputStream is, String fileName) {
+    //
+    //     BufferedInputStream bis = new BufferedInputStream(is);
+    //     ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    //     BufferedOutputStream bos = new BufferedOutputStream(baos);
+    //
+    //     try {
+    //         int len;
+    //
+    //         while ((len = bis.read()) != -1) {
+    //             bos.write(len);
+    //             bos.flush();
+    //         }
+    //
+    //         bos.write(is.read());
+    //
+    //         // 上次附件至华为云
+    //         ObsUpload obsUpload = new ObsUpload();
+    //         obsUpload.setFileName(fileName);
+    //         obsUpload.setBytes(baos.toByteArray());
+    //         R<JSONObject> jsonObjectR = obsClient.uploadHuaWei(obsUpload);
+    //         if (jsonObjectR.isSuccess()) {
+    //             JSONObject data = jsonObjectR.getData();
+    //             return data.getString("path");
+    //         }
+    //     } catch (Exception e) {
+    //         log.error("上传文件出错", e);
+    //         throw new ServiceException("获取附件出现错误");
+    //     } finally {
+    //         IoUtil.close(bos);
+    //         IoUtil.close(baos);
+    //         IoUtil.close(bis);
+    //         IoUtil.close(is);
+    //     }
+    //     return null;
+    // }
+
 }

+ 20 - 0
src/main/java/com/fjhx/email/service/impl/PersonalMessageAddressServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.email.service.impl;
+
+import com.fjhx.email.entity.PersonalMessageAddress;
+import com.fjhx.email.mapper.PersonalMessageAddressMapper;
+import com.fjhx.email.service.IPersonalMessageAddressService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 个人邮件地址 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Service
+public class PersonalMessageAddressServiceImpl extends ServiceImpl<PersonalMessageAddressMapper, PersonalMessageAddress> implements IPersonalMessageAddressService {
+
+}

+ 20 - 0
src/main/java/com/fjhx/email/service/impl/PersonalMessageAttachmentServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.email.service.impl;
+
+import com.fjhx.email.entity.PersonalMessageAttachment;
+import com.fjhx.email.mapper.PersonalMessageAttachmentMapper;
+import com.fjhx.email.service.IPersonalMessageAttachmentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 个人邮件附件 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Service
+public class PersonalMessageAttachmentServiceImpl extends ServiceImpl<PersonalMessageAttachmentMapper, PersonalMessageAttachment> implements IPersonalMessageAttachmentService {
+
+}

+ 20 - 0
src/main/java/com/fjhx/email/service/impl/PersonalMessageContentServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.email.service.impl;
+
+import com.fjhx.email.entity.PersonalMessageContent;
+import com.fjhx.email.mapper.PersonalMessageContentMapper;
+import com.fjhx.email.service.IPersonalMessageContentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 个人邮件正文 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-04-11
+ */
+@Service
+public class PersonalMessageContentServiceImpl extends ServiceImpl<PersonalMessageContentMapper, PersonalMessageContent> implements IPersonalMessageContentService {
+
+}

+ 33 - 0
src/main/java/com/fjhx/email/utils/EmailUtil.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.fjhx.email.entity.dto.MailboxInfo;
 import com.fjhx.email.entity.dto.ObsFile;
 import com.fjhx.email.entity.dto.SendDto;
+import com.fjhx.email.entity.vo.MessageDetailVo;
 import com.fjhx.email.enums.MailFlagEnum;
 import com.sun.mail.imap.IMAPStore;
 import com.sun.mail.smtp.SMTPMessage;
@@ -51,6 +52,38 @@ public class EmailUtil {
         return store;
     }
 
+    /**
+     * 获取收件人、抄送人、密送人、回复人
+     */
+    public static List<MessageDetailVo.MessageAddress> mailAddressList(Message message) throws MessagingException {
+        Address[] to = message.getRecipients(Message.RecipientType.TO);
+        Address[] cc = message.getRecipients(Message.RecipientType.CC);
+        Address[] bcc = message.getRecipients(Message.RecipientType.BCC);
+        Address[] replyTo = message.getReplyTo();
+
+        List<MessageDetailVo.MessageAddress> mailAddressList = new ArrayList<>();
+        addMailAddressList(mailAddressList, to, 1);
+        addMailAddressList(mailAddressList, cc, 2);
+        addMailAddressList(mailAddressList, bcc, 3);
+        addMailAddressList(mailAddressList, replyTo, 4);
+        return mailAddressList;
+    }
+
+    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);
+        }
+    }
+
 
     public static void main(String[] args) throws Exception {
         ObsFile attachment = new ObsFile();

+ 105 - 0
src/main/java/com/fjhx/email/utils/ObsFileUtil.java

@@ -0,0 +1,105 @@
+package com.fjhx.email.utils;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.fjhx.email.config.exception.ServiceException;
+import com.obs.services.ObsClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.InputStream;
+import java.util.Date;
+import java.util.StringJoiner;
+
+@Configuration
+public class ObsFileUtil {
+
+    private static String ak;
+
+    private static String sk;
+
+    private static String endPoint;
+
+    private static String url;
+
+    private static String bucketName;
+
+    private static String active;
+
+    public static String getCompleteUrl(String path) {
+        return url + path;
+    }
+
+    @Value("${obs.ak}")
+    public void setAk(String ak) {
+        ObsFileUtil.ak = ak;
+    }
+
+    @Value("${obs.sk}")
+    public void setSk(String sk) {
+        ObsFileUtil.sk = sk;
+    }
+
+    @Value("${obs.endPoint}")
+    public void setEndPoint(String endPoint) {
+        ObsFileUtil.endPoint = endPoint;
+    }
+
+    @Value("${obs.url}")
+    public void setUrl(String url) {
+        ObsFileUtil.url = url;
+    }
+
+    @Value("${obs.bucketName}")
+    public void setBucketName(String bucketName) {
+        ObsFileUtil.bucketName = bucketName;
+    }
+
+    @Value("${spring.profiles.active}")
+    public void setActive(String active) {
+        ObsFileUtil.active = active;
+    }
+
+    public static String uploadFile(String fileName, InputStream inputStream) {
+
+        // 文件后缀名
+        String suffix = FileUtil.getSuffix(fileName);
+
+        // 文件路径
+        String objectKey = new StringJoiner("/")
+                .add("byteSailing")
+                .add("mail")
+                .add(active)
+                .add(DateUtil.format(new Date(), "yyyy/MM/dd"))
+                .add(IdUtil.fastSimpleUUID() + (ObjectUtil.isEmpty(suffix) ? "" : "." + suffix))
+                .toString();
+
+        ObsClient obsClient = null;
+
+        try {
+            // 获取oss链接客户端
+            obsClient = getObsClient();
+            obsClient.putObject(bucketName, objectKey, inputStream);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ServiceException("文件上传失败");
+        } finally {
+            IoUtil.close(obsClient);
+        }
+
+        return objectKey;
+    }
+
+    /**
+     * 获取oss链接客户端
+     */
+    private static ObsClient getObsClient() {
+        return new ObsClient(ak, sk, endPoint);
+    }
+
+
+}

+ 2 - 2
src/main/resources/application-dev.yml

@@ -8,10 +8,10 @@ spring:
 mail:
   # 至少要等待多少秒才会开启下一轮邮件同步
   minWaitingTime: 45
-  # 初始化同步天数
-  initDay: 7
   # 多少分钟没同步完成则开启下一轮同步
   awaitTimeout: 5
+  # 初始化同步天数
+  initDay: 7
   # 超过多少次后将不再同步此邮箱
   errorNumber: 5
   # 获取邮箱类型 1国内邮箱 2国外邮箱

+ 6 - 0
src/main/resources/application.yml

@@ -27,3 +27,9 @@ mybatis-plus:
       logic-not-delete-value: 0
     enable-sql-runner: true
 
+obs:
+  ak: 9HNBVBHO7F3GLUCGTK5C
+  sk: ZowLEoMJrICA9tOyln0yWVm0xGSiupe0gnbsZimk
+  endPoint: obs.cn-south-1.myhuaweicloud.com
+  url: https://os.winfaster.cn/
+  bucketName: winfaster

+ 1 - 1
src/test/java/CodeGeneration.java

@@ -25,7 +25,7 @@ public class CodeGeneration {
                 })
                 .strategyConfig(builder -> builder
                         // 设置需要生成的表名
-                        .addInclude("enterprise_domain")
+                        .addInclude("personal_message_content")
                         .entityBuilder()
                         .disableSerialVersionUID()
                         .superClass(BaseEntity.class)