Преглед на файлове

feat:连接中金财富邮箱

mozuwen преди 2 седмици
родител
ревизия
4d7e1de5c0

+ 15 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CoreMailCookieSidDTO.java

@@ -0,0 +1,15 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CoreMailCookieSidDTO {
+
+    private String sid;
+
+    private String cookie;
+}

+ 29 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CoreMailFolderParam.java

@@ -0,0 +1,29 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CoreMailFolderParam {
+    /**
+     * 是否刷新缓存
+     */
+    private Boolean flush = true;
+    /**
+     * 是否返回统计信息
+     */
+    private Boolean stats = false;
+    /**
+     * 是否返回会话信息
+     */
+    private Boolean threads = false;
+    /**
+     * 默认按文件夹的名称排序
+     */
+    private String order = "name";
+
+    private String Coremail;
+}

+ 20 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CoreMailInfoDTO.java

@@ -0,0 +1,20 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CoreMailInfoDTO {
+    private String id;
+    private Integer fid;
+    private Long size;
+    private String from;
+    private String to;
+    private String subject;
+    private Date sentDate;
+    private Date receivedDate;
+    private Date modifiedDate;
+    private Integer priority;
+    private Date defer;
+}

+ 40 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CoreMailInfoParam.java

@@ -0,0 +1,40 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.Data;
+
+@Data
+public class CoreMailInfoParam {
+    private String mboxa = ""; // 默认 ""
+    private int fid;
+    private String order = "date"; // 默认 "date"
+    private int start = 0; // 默认 0
+    private int limit = -1; // 默认 -1,表示不分页
+    private FilterCondition filter;
+    private boolean returnTotal = false; // 默认 false
+
+    public static class FilterCondition {
+        private String received; // 收件时间过滤条件
+        private String subject;  // 主题关键词过滤
+
+        public FilterCondition(String received, String subject) {
+            this.received = received;
+            this.subject = subject;
+        }
+
+        public String getReceived() {
+            return received;
+        }
+
+        public void setReceived(String received) {
+            this.received = received;
+        }
+
+        public String getSubject() {
+            return subject;
+        }
+
+        public void setSubject(String subject) {
+            this.subject = subject;
+        }
+    }
+}

+ 11 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CoreMailLoginParam.java

@@ -1,5 +1,6 @@
 package com.simuwang.base.pojo.dos;
 
+import jakarta.validation.constraints.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -16,4 +17,14 @@ public class CoreMailLoginParam {
      * 邮箱密码
      */
     private String password;
+
+    private boolean forceCookieCheck = true;
+
+    private boolean returnCookie = true;
+
+
+    public CoreMailLoginParam(@NotNull String account, @NotNull String password) {
+        this.uid = account;
+        this.password = password;
+    }
 }

+ 62 - 6
service-daq/src/main/java/com/simuwang/daq/service/CoreMailApiService.java

@@ -1,11 +1,12 @@
 package com.simuwang.daq.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSONObject;
-import com.simuwang.base.pojo.dos.CoreMailFolderDTO;
-import com.simuwang.base.pojo.dos.CoreMailLoginParam;
+import com.simuwang.base.pojo.dos.*;
 import com.simuwang.daq.util.HttpClientUtil;
 import jakarta.validation.constraints.NotNull;
 import org.slf4j.Logger;
@@ -15,6 +16,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class CoreMailApiService {
@@ -31,7 +33,7 @@ public class CoreMailApiService {
      * @param password 邮箱密码
      * @return 登录token
      */
-    public String login(@NotNull String account, @NotNull String password) {
+    public CoreMailCookieSidDTO login(@NotNull String account, @NotNull String password) {
         String url = coreMailUrl + "/coremail/s/json?func=user:login";
 
         CoreMailLoginParam coreMailLoginParam = new CoreMailLoginParam(account, password);
@@ -53,8 +55,11 @@ public class CoreMailApiService {
                 return null;
             }
             JSONObject varJsonObject = jsonObject.get("var") != null ? JSONObject.parseObject(jsonObject.get("var").toString()) : null;
-            if (varJsonObject != null && StrUtil.isBlank(varJsonObject.getString("sid"))) {
-                return varJsonObject.getString("sid");
+            if (varJsonObject != null && StrUtil.isNotBlank(varJsonObject.getString("sid"))) {
+                CoreMailCookieSidDTO coreMailCookieSidDTO = new CoreMailCookieSidDTO();
+                coreMailCookieSidDTO.setSid(varJsonObject.getString("sid"));
+                coreMailCookieSidDTO.setCookie(varJsonObject.getString("Cookie.Coremail"));
+                return coreMailCookieSidDTO;
             }
         } catch (Exception e) {
             log.error("用户登录接口异常:{}", ExceptionUtil.stacktraceToString(e));
@@ -62,7 +67,58 @@ public class CoreMailApiService {
         return null;
     }
 
-    public List<CoreMailFolderDTO> getAllFolders(String token) {
+    public List<CoreMailFolderDTO> getAllFolders(String token, String cookie) {
+        String url = coreMailUrl + "/coremail/s/json?func=mbox:getAllFolders&sid=" + token;
+        Map<String, String> requestParam = new HashMap<>();
+        requestParam.put("Cookie.Coremail", cookie);
+        requestParam.put("sid", token);
+        CoreMailFolderParam coreMailFolderParam = new CoreMailFolderParam();
+        coreMailFolderParam.setCoremail(cookie);
+
+        Map<String, Object> bodyMap = new HashMap<>();
+        bodyMap.put("flush", "ture");
+        bodyMap.put("stats", "false");
+        bodyMap.put("threads", "false");
+        bodyMap.put("order", "name");
+        bodyMap.put("Coremail", cookie);
+        String bodyParam = JSONObject.toJSONString(bodyMap);
+        log.info("获取邮箱文件夹接口请求体 -> url:{}, requestParam:{}, bodyParam:{}", url, requestParam, bodyParam);
+        try {
+            String resp = HttpUtil.get(url, bodyMap);
+            log.info("获取邮箱文件夹接口响应体:{}", resp);
+            if (StrUtil.isBlank(resp)) {
+                log.warn("获取邮箱文件夹接口返回空响应");
+                return CollUtil.newArrayList();
+            }
+
+        } catch (Exception e) {
+            log.error("获取邮箱文件夹接口异常:{}", ExceptionUtil.stacktraceToString(e));
+        }
         return ListUtil.toList(new CoreMailFolderDTO(1, "inbox"));
     }
+
+    public List<CoreMailInfoDTO> getFolderMails(String token, Integer folderId) {
+        String url = coreMailUrl + "/coremail/s/json?func=mbox:listMessages&sid=" + token;
+        Map<String, String> requestParam = new HashMap<>();
+        requestParam.put("sid", token);
+        CoreMailInfoParam coreMailInfoParam = new CoreMailInfoParam();
+        coreMailInfoParam.setFid(folderId);
+        coreMailInfoParam.setFilter(new CoreMailInfoParam.FilterCondition("3:", "净值,业绩报酬,规模"));
+        String bodyParam = JSONObject.toJSONString(coreMailInfoParam);
+        log.info("获取文件夹邮件接口请求体 -> url:{}, requestParam:{}, bodyParam:{}", url, requestParam, bodyParam);
+        try {
+            String resp = HttpUtil.post(url, bodyParam);
+            log.info("获取文件夹邮件接口响应体:{}", resp);
+            if (StrUtil.isBlank(resp)) {
+                log.warn("获取文件夹邮件接口返回空响应");
+                return CollUtil.newArrayList();
+            }
+
+        } catch (Exception e) {
+
+            log.error("获取文件夹邮件接口异常:{}", ExceptionUtil.stacktraceToString(e));
+        }
+
+        return CollUtil.newArrayList();
+    }
 }

+ 1 - 1
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -139,7 +139,7 @@ public class EmailParseService {
         Map<String, List<EmailContentInfoDTO>> emailContentMap;
         try {
             // 通过接口获取邮件
-            emailContentMap = readEmailService.readEmail(mailboxInfoDTO, emailTypeMap, startDate, endDate);
+            emailContentMap = readEmailService.readEmail(mailboxInfoDTO, startDate, endDate);
         } catch (Exception e) {
             log.info("采集邮件失败 -> 邮箱配置信息:{},堆栈信息:{}", mailboxInfoDTO, ExceptionUtil.stacktraceToString(e));
             return;

+ 25 - 8
service-daq/src/main/java/com/simuwang/daq/service/ReadEmailService.java

@@ -1,10 +1,15 @@
 package com.simuwang.daq.service;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
+import com.simuwang.base.pojo.dos.CoreMailCookieSidDTO;
 import com.simuwang.base.pojo.dos.CoreMailFolderDTO;
+import com.simuwang.base.pojo.dos.CoreMailInfoDTO;
 import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import org.jsoup.select.Collector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -12,6 +17,7 @@ import org.springframework.stereotype.Service;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class ReadEmailService {
@@ -27,26 +33,37 @@ public class ReadEmailService {
      * 通过接口获取邮件
      *
      * @param mailboxInfoDTO 邮箱账号密码
-     * @param emailTypeMap   邮箱类型映射表
      * @param startDate      开始日期
      * @param endDate        结束日期
      * @return 邮件信息
      */
-    public Map<String, List<EmailContentInfoDTO>> readEmail(MailboxInfoDTO mailboxInfoDTO, Map<Integer, List<String>> emailTypeMap, Date startDate, Date endDate) {
+    public Map<String, List<EmailContentInfoDTO>> readEmail(MailboxInfoDTO mailboxInfoDTO, Date startDate, Date endDate) {
         String account = mailboxInfoDTO.getAccount();
         String password = mailboxInfoDTO.getPassword();
         // 获取token
-        String token = coreMailApiService.login(account, password);
-        if (StrUtil.isBlank(token)) {
+        CoreMailCookieSidDTO cookieSidDTO = coreMailApiService.login(account, password);
+        if (cookieSidDTO == null || cookieSidDTO.getSid() == null) {
             log.error("邮箱登录失败, 无法获取到token");
             return MapUtil.newHashMap();
         }
+        String token = cookieSidDTO.getSid();
+        String cookie = cookieSidDTO.getCookie();
         // 获取邮箱文件夹(默认只读取收件箱Inbox的邮件)
-        List<CoreMailFolderDTO> mailFolderList = coreMailApiService.getAllFolders(token);
-
-        // 获取邮件id
-
+        List<CoreMailFolderDTO> mailFolderList = coreMailApiService.getAllFolders(token, cookie);
+        Integer folderId = 1;
+        if (CollUtil.isNotEmpty(mailFolderList)) {
+            folderId = mailFolderList.stream().filter(e -> e.getName().equals("inbox"))
+                    .findFirst().map(CoreMailFolderDTO::getId).orElse(folderId);
+        }
+        // 获取文件夹的邮件id
+        List<CoreMailInfoDTO> coreMailInfoDTOList =  coreMailApiService.getFolderMails(token, folderId);
+        if(CollUtil.isEmpty(coreMailInfoDTOList)) {
+            log.error("获取不到邮件");
+            return MapUtil.newHashMap();
+        }
         // 根据邮件id获取邮件内容
+        List<String> mailIdList = coreMailInfoDTOList.stream().map(CoreMailInfoDTO::getId).toList();
+
 
         return MapUtil.newHashMap();
     }

+ 1 - 1
service-daq/src/main/java/com/simuwang/daq/util/HttpClientUtil.java

@@ -49,7 +49,7 @@ public class HttpClientUtil {
     }
 
     public static String post(String url, Map<String, String> header, String json) {
-        header.put("EMAIL-PARSE-TOKEN", "EMAIL-PARSE-TOKEN");
+        // header.put("EMAIL-PARSE-TOKEN", "EMAIL-PARSE-TOKEN");
         HttpPost httpPost = getPost(url, header, json);
         return getResult(httpPost);
     }

+ 3 - 3
service-deploy/src/main/resources/application.yml

@@ -28,9 +28,9 @@ spring:
       # 指定为HikariDataSource
       type: com.zaxxer.hikari.HikariDataSource
       driver-class-name: com.alipay.oceanbase.obproxy.mysql.jdbc.Driver
-      url: jdbc:oceanbase://192.168.1.28:2881/competition?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
+      url: jdbc:oceanbase://127.0.1:3306/competition?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
       username: root
-      password: Smppw@2024
+      password: Smppw@zj2025
       # hikari连接池配置 对应 HikariConfig 配置属性类
       hikari:
         pool-name: HikariCP-daq
@@ -97,4 +97,4 @@ simuwang:
       filters: jwt
 
 coremail:
-  url: http://10.100.74.15
+  url: http://bjmail.cicccs.group

+ 27 - 0
service-deploy/src/test/java/com/simuwang/CoreMailTest.java

@@ -0,0 +1,27 @@
+package com.simuwang;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import com.simuwang.daq.service.ReadEmailService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest(classes = Application.class)
+public class CoreMailTest {
+
+    @Autowired
+    ReadEmailService readEmailService;
+
+    @Test
+    public void testLogin(){
+        MailboxInfoDTO mailboxInfoDTO = new MailboxInfoDTO();
+        mailboxInfoDTO.setAccount("xi.hu@cs.cicc.com.cn");
+        mailboxInfoDTO.setPassword("P_OGTY0J2aH");
+        String startDate = "2025-06-09";
+        DateTime date = DateUtil.parse(startDate);
+        readEmailService.readEmail(mailboxInfoDTO, date, date);
+    }
+
+}