24282 2 ani în urmă
părinte
comite
236d10fbb2

+ 1 - 1
src/main/java/com/fjhx/config/CodeGeneration.java

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

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

@@ -0,0 +1,18 @@
+package com.fjhx.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author zlj
+ * @since 2022-12-21
+ */
+@Controller
+@RequestMapping("/emailMessage")
+public class EmailMessageController {
+
+}

+ 6 - 13
src/main/java/com/fjhx/entity/EmailMailbox.java

@@ -28,22 +28,16 @@ public class EmailMailbox extends BaseEntity {
      */
     private String email;
 
+    /**
+     * 文件夹路径
+     */
     private String path;
 
-    private String delimiter;
-
-    private Boolean listed;
-
-    private String specialUse;
-
+    /**
+     * 文件夹名称
+     */
     private String name;
 
-    private Boolean subscribed;
-
-    private Integer messages;
-
-    private Boolean uidNext;
-
     /**
      * 是否展示(1是 0否)
      */
@@ -54,5 +48,4 @@ public class EmailMailbox extends BaseEntity {
      */
     private Boolean initialize;
 
-
 }

+ 74 - 0
src/main/java/com/fjhx/entity/EmailMessage.java

@@ -0,0 +1,74 @@
+package com.fjhx.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zlj
+ * @since 2022-12-21
+ */
+@Getter
+@Setter
+@TableName("email_message")
+public class EmailMessage extends BaseEntity {
+
+    /**
+     * 文件id
+     */
+    private String messageId;
+
+    /**
+     * 邮箱文件夹id
+     */
+    private Long emailMailboxId;
+
+    /**
+     * 邮箱文件夹路径
+     */
+    private String emailMailboxPath;
+
+    /**
+     * 是否未读
+     */
+    private Boolean unseen;
+
+    /**
+     * 是否旗标
+     */
+    private Boolean flagged;
+
+    /**
+     * 邮件标题
+     */
+    private String subject;
+
+    /**
+     * 发送时间
+     */
+    private Date fromDate;
+
+    /**
+     * 发送人
+     */
+    private String fromName;
+
+    /**
+     * 发送地址
+     */
+    private String fromAddress;
+
+    /**
+     * 邮件内容
+     */
+    private String htmlContent;
+
+
+}

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

@@ -0,0 +1,16 @@
+package com.fjhx.mapper;
+
+import com.fjhx.entity.EmailMessage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2022-12-21
+ */
+public interface EmailMessageMapper extends BaseMapper<EmailMessage> {
+
+}

+ 5 - 0
src/main/java/com/fjhx/mapper/xml/EmailMessageMapper.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.mapper.EmailMessageMapper">
+
+</mapper>

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

@@ -0,0 +1,16 @@
+package com.fjhx.service;
+
+import com.fjhx.entity.EmailMessage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2022-12-21
+ */
+public interface IEmailMessageService extends IService<EmailMessage> {
+
+}

+ 59 - 10
src/main/java/com/fjhx/service/impl/AccountServiceImpl.java

@@ -2,22 +2,30 @@ package com.fjhx.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.thread.ThreadUtil;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fjhx.config.TaskPoolConfig;
 import com.fjhx.entity.EmailInfo;
 import com.fjhx.entity.EmailMailbox;
+import com.fjhx.entity.EmailMessage;
 import com.fjhx.service.IAccountService;
 import com.fjhx.service.IEmailInfoService;
 import com.fjhx.service.IEmailMailboxService;
+import com.fjhx.service.IEmailMessageService;
 import com.fjhx.utils.EmailEngineUtil;
 import com.fjhx.vo.BindingVo;
+import com.fjhx.vo.EmailMailboxVo;
+import com.fjhx.vo.MessageDetailVo;
+import com.fjhx.vo.MessageVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Executor;
+import java.util.stream.Collectors;
 
 @Service
 public class AccountServiceImpl implements IAccountService {
@@ -28,6 +36,9 @@ public class AccountServiceImpl implements IAccountService {
     @Autowired
     private IEmailMailboxService emailMailboxService;
 
+    @Autowired
+    private IEmailMessageService emailMessageService;
+
     @Qualifier(TaskPoolConfig.taskExecutor)
     @Autowired
     private Executor executor;
@@ -46,14 +57,14 @@ public class AccountServiceImpl implements IAccountService {
 
         // 添加账号
         EmailEngineUtil.createAccount(bindingVo);
-        // 查询邮箱
-        List<EmailMailbox> mailboxList = EmailEngineUtil.getMailboxList(email);
         // 保存账号数据
         emailInfo = saveEmailInfo(bindingVo);
+        // 查询邮箱文件夹
+        List<EmailMailboxVo.MailboxesDTO> mailboxList = EmailEngineUtil.getMailboxList(email);
         // 添加邮箱文件夹
-        saveEmailMailbox(mailboxList, emailInfo.getId(), email);
+        List<EmailMailbox> emailMailboxList = saveEmailMailbox(mailboxList, emailInfo.getId(), email);
         // 异步遍历文件夹下的所有邮件
-        asyncReadEmail(email, mailboxList);
+        asyncReadEmail(email, emailMailboxList);
         return emailInfo;
     }
 
@@ -69,24 +80,62 @@ public class AccountServiceImpl implements IAccountService {
     /**
      * 添加邮箱文件夹
      */
-    private void saveEmailMailbox(List<EmailMailbox> mailboxList, Long emailInfoId, String email) {
-        for (EmailMailbox emailMailbox : mailboxList) {
+    private List<EmailMailbox> saveEmailMailbox(List<EmailMailboxVo.MailboxesDTO> mailboxDTOList, Long emailInfoId, String email) {
+
+        List<EmailMailbox> mailboxList = mailboxDTOList.stream().map(item -> {
+            EmailMailbox emailMailbox = BeanUtil.copyProperties(item, EmailMailbox.class);
             emailMailbox.setEmailInfoId(emailInfoId);
             emailMailbox.setEmail(email);
             emailMailbox.setIsShow(true);
             emailMailbox.setInitialize(false);
-        }
+            return emailMailbox;
+        }).collect(Collectors.toList());
+
         emailMailboxService.saveBatch(mailboxList);
+
+        return mailboxList;
     }
 
-    private void asyncReadEmail(String email, List<EmailMailbox> mailboxList) {
+    /**
+     * 异步读取文件
+     */
+    private void asyncReadEmail(String email, List<EmailMailbox> emailMailboxList) {
         executor.execute(() -> {
 
             ThreadUtil.sleep(5000);
 
-            for (EmailMailbox emailMailbox : mailboxList) {
-                EmailEngineUtil.getMessageList(email, emailMailbox.getPath());
+            List<EmailMessage> emailMessageList = new ArrayList<>();
+
+            for (EmailMailbox emailMailbox : emailMailboxList) {
+                List<MessageVo.MessagesDTO> messageList = EmailEngineUtil.getMessageList(email, emailMailbox.getPath());
+
+                for (MessageVo.MessagesDTO messagesDTO : messageList) {
+                    MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(email, messagesDTO.getId());
+
+                    EmailMessage emailMessage = new EmailMessage();
+                    emailMessage.setMessageId(messagesDTO.getId());
+                    emailMessage.setEmailMailboxId(emailMailbox.getId());
+                    emailMessage.setEmailMailboxPath(emailMailbox.getPath());
+                    emailMessage.setUnseen(messagesDTO.getUnseen());
+                    emailMessage.setFlagged(messagesDTO.getFlagged());
+                    emailMessage.setSubject(messagesDTO.getSubject());
+                    emailMessage.setFromDate(messagesDTO.getDate());
+
+                    MessageVo.MessagesDTO.ToDTO from = messagesDTO.getFrom();
+                    if (ObjectUtils.isNotEmpty(from)) {
+                        emailMessage.setFromName(from.getName());
+                        emailMessage.setFromAddress(from.getAddress());
+                    }
+
+                    MessageDetailVo.TextDTO text = messageDetail.getText();
+                    if (ObjectUtils.isNotEmpty(text)) {
+                        emailMessage.setHtmlContent(text.getHtml());
+                    }
+
+                    emailMessageList.add(emailMessage);
+                }
             }
+            emailMessageService.saveBatch(emailMessageList);
 
         });
 

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

@@ -0,0 +1,20 @@
+package com.fjhx.service.impl;
+
+import com.fjhx.entity.EmailMessage;
+import com.fjhx.mapper.EmailMessageMapper;
+import com.fjhx.service.IEmailMessageService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2022-12-21
+ */
+@Service
+public class EmailMessageServiceImpl extends ServiceImpl<EmailMessageMapper, EmailMessage> implements IEmailMessageService {
+
+}

+ 23 - 10
src/main/java/com/fjhx/utils/EmailEngineUtil.java

@@ -2,8 +2,6 @@ package com.fjhx.utils;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Assert;
-import com.alibaba.fastjson.JSONObject;
-import com.fjhx.entity.EmailMailbox;
 import com.fjhx.vo.*;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -11,6 +9,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @NoArgsConstructor
@@ -48,28 +47,42 @@ public class EmailEngineUtil {
     /**
      * 查看邮箱所有文件夹
      */
-    public static List<EmailMailbox> getMailboxList(String email) {
-        String result = get("v1/account/" + email + "/mailboxes?counters=false", String.class);
-        return BeanUtil.copyToList(JSONObject.parseObject(result).getJSONArray("mailboxes"), EmailMailbox.class);
+    public static List<EmailMailboxVo.MailboxesDTO> getMailboxList(String email) {
+        String url = "v1/account/" + email + "/mailboxes?counters=false";
+        EmailMailboxVo result = get(url, EmailMailboxVo.class);
+        return result.getMailboxes();
     }
 
     /**
      * 查看文件夹的所有邮件
      */
-    public static List<?> getMessageList(String email, String mailboxName) {
+    public static List<MessageVo.MessagesDTO> getMessageList(String email, String mailboxName) {
         int page = 0;
         int pages;
-
+        List<MessageVo.MessagesDTO> messagesList = new ArrayList<>();
 
         do {
-            MessageVo result = get("/v1/account/" + email + "/messages?path=" + mailboxName + "&page=" + page + "&pageSize=50&documentStore=false", MessageVo.class);
-            System.err.println(JSONObject.toJSONString(result));
+            String url = "/v1/account/" + email + "/messages?path=" + mailboxName + "&page=" + page + "&pageSize=100&documentStore=false";
+
+            MessageVo result = get(url, MessageVo.class);
+
+            List<MessageVo.MessagesDTO> messages = result.getMessages();
+            if (messages.size() > 0) {
+                messagesList.addAll(messages);
+            }
             pages = result.getPages();
             page++;
         } while (page < pages);
 
+        return messagesList;
+    }
 
-        return null;
+    /**
+     * 获取邮件明细
+     */
+    public static MessageDetailVo getMessageDetail(String email, String messageId) {
+        String url = "v1/account/" + email + "/message/" + messageId + "?textType=html&embedAttachedImages=true&documentStore=false";
+        return get(url, MessageDetailVo.class);
     }
 
 

+ 24 - 0
src/main/java/com/fjhx/vo/EmailMailboxVo.java

@@ -0,0 +1,24 @@
+package com.fjhx.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class EmailMailboxVo {
+
+
+    private List<MailboxesDTO> mailboxes;
+
+    @Data
+    public static class MailboxesDTO {
+
+        private String path;
+
+        private String name;
+
+    }
+
+}

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

@@ -0,0 +1,28 @@
+package com.fjhx.vo;
+
+import lombok.Data;
+
+@Data
+public class MessageDetailVo {
+
+    private TextDTO text;
+
+    @Data
+    public static class TextDTO {
+
+        private String id;
+
+        private EncodedSizeDTO encodedSize;
+
+        private String html;
+
+        private Boolean hasMore;
+
+        @Data
+        public static class EncodedSizeDTO {
+            private Integer html;
+            
+        }
+    }
+
+}

+ 36 - 48
src/main/java/com/fjhx/vo/MessageVo.java

@@ -1,7 +1,6 @@
 package com.fjhx.vo;
 
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.util.Date;
 import java.util.List;
@@ -20,83 +19,72 @@ public class MessageVo {
     @Data
     public static class MessagesDTO {
 
+        /**
+         * 邮件id
+         */
         private String id;
 
-        private Integer uid;
-
+        /**
+         * 发件时间
+         */
         private Date date;
 
-        private List<String> flags;
+        /**
+         * 是否未读
+         */
+        private Boolean unseen;
 
-        private Integer size;
+        /**
+         * 是否旗标
+         */
+        private Boolean flagged;
 
+        /**
+         * 邮件标题
+         */
         private String subject;
 
-        private FromDTO from;
-
-        private List<ReplyToDTO> replyTo;
+        /**
+         * 发件人
+         */
+        private ToDTO from;
 
+        /**
+         * 收件人
+         */
         private List<ToDTO> to;
 
-        private String messageId;
+        /**
+         * 抄送人
+         */
+        private List<ToDTO> cc;
 
-        private TextDTO text;
+        /**
+         * 密送人
+         */
+        private List<ToDTO> bcc;
 
+        /**
+         * 附件列表
+         */
         private List<AttachmentsDTO> attachments;
 
-
-        @Data
-        public static class FromDTO {
-
-            private String name;
-
-            private String address;
-        }
-
-        @Data
-        public static class TextDTO {
-
-            private String id;
-
-            private EncodedSizeDTO encodedSize;
-
-            @Data
-            public static class EncodedSizeDTO {
-                private Integer html;
-            }
-        }
-
-        @Data
-        public static class ReplyToDTO {
-
-            private String name;
-
-            private String address;
-        }
-
         @Data
         public static class ToDTO {
-
             private String name;
-
             private String address;
         }
 
         @Data
         public static class AttachmentsDTO {
-
             private String id;
-
             private String contentType;
-
             private Integer encodedSize;
-
             private String filename;
-
             private Boolean embedded;
-
             private Boolean inline;
         }
+
     }
 
 }