Parcourir la source

feat:通过Coremail接口获取邮箱邮件v1

mozuwen il y a 2 semaines
Parent
commit
361dbe0367

+ 17 - 0
pom.xml

@@ -28,6 +28,8 @@
         <jjwt.version>0.12.6</jjwt.version>
         <apahce-pdfbox.version>3.0.3</apahce-pdfbox.version>
         <tabula.version>1.0.5</tabula.version>
+        <fastjson.version>1.2.83</fastjson.version>
+        <httpcomponents.version>4.5.3</httpcomponents.version>
     </properties>
 
     <modules>
@@ -40,6 +42,21 @@
 
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpcomponents.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpmime</artifactId>
+                <version>${httpcomponents.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
             <!-- SpringBoot的依赖配置-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>

+ 19 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CoreMailFolderDTO.java

@@ -0,0 +1,19 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CoreMailFolderDTO {
+    /**
+     * 文件夹id
+     */
+    private Integer id;
+    /**
+     * 文件夹名称
+     */
+    private String name;
+}

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

@@ -0,0 +1,19 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CoreMailLoginParam {
+    /**
+     * 邮箱账号
+     */
+    private String uid;
+    /**
+     * 邮箱密码
+     */
+    private String password;
+}

+ 68 - 0
service-daq/src/main/java/com/simuwang/daq/service/CoreMailApiService.java

@@ -0,0 +1,68 @@
+package com.simuwang.daq.service;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.simuwang.base.pojo.dos.CoreMailFolderDTO;
+import com.simuwang.base.pojo.dos.CoreMailLoginParam;
+import com.simuwang.daq.util.HttpClientUtil;
+import jakarta.validation.constraints.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+
+@Service
+public class CoreMailApiService {
+
+    private static final Logger log = LoggerFactory.getLogger(CoreMailApiService.class);
+
+    @Value("${coremail.url}")
+    private String coreMailUrl;
+
+    /**
+     * 登录获取token
+     *
+     * @param account  邮箱账号
+     * @param password 邮箱密码
+     * @return 登录token
+     */
+    public String login(@NotNull String account, @NotNull String password) {
+        String url = coreMailUrl + "/coremail/s/json?func=user:login";
+
+        CoreMailLoginParam coreMailLoginParam = new CoreMailLoginParam(account, password);
+        String bodyParam = JSONObject.toJSONString(coreMailLoginParam);
+        log.info("用户登录接口请求体 -> url:{}, bodyParam:{}", url, bodyParam);
+        try {
+            String resp = HttpClientUtil.post(url, new HashMap<>(), bodyParam);
+            log.info("用户登录接口响应体:{}", resp);
+            if (StrUtil.isBlank(resp)) {
+                log.warn("用户登录接口返回空响应");
+                return null;
+            }
+            JSONObject jsonObject = JSONObject.parseObject(resp);
+            if (jsonObject == null) {
+                return null;
+            }
+            if (!"S_OK".equals(jsonObject.getString("code"))) {
+                log.error("用户登录失败, 返回码:{}", jsonObject.getString("code"));
+                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");
+            }
+        } catch (Exception e) {
+            log.error("用户登录接口异常:{}", ExceptionUtil.stacktraceToString(e));
+        }
+        return null;
+    }
+
+    public List<CoreMailFolderDTO> getAllFolders(String token) {
+        return ListUtil.toList(new CoreMailFolderDTO(1, "inbox"));
+    }
+}

+ 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.realEmail(mailboxInfoDTO, emailTypeMap, startDate, endDate);
+            emailContentMap = readEmailService.readEmail(mailboxInfoDTO, emailTypeMap, startDate, endDate);
         } catch (Exception e) {
             log.info("采集邮件失败 -> 邮箱配置信息:{},堆栈信息:{}", mailboxInfoDTO, ExceptionUtil.stacktraceToString(e));
             return;

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

@@ -1,8 +1,12 @@
 package com.simuwang.daq.service;
 
 import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.simuwang.base.pojo.dos.CoreMailFolderDTO;
 import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -12,6 +16,13 @@ import java.util.Map;
 @Service
 public class ReadEmailService {
 
+    private static final Logger log = LoggerFactory.getLogger(ReadEmailService.class);
+    private final CoreMailApiService coreMailApiService;
+
+    public ReadEmailService(CoreMailApiService coreMailApiService) {
+        this.coreMailApiService = coreMailApiService;
+    }
+
     /**
      * 通过接口获取邮件
      *
@@ -21,7 +32,21 @@ public class ReadEmailService {
      * @param endDate        结束日期
      * @return 邮件信息
      */
-    public Map<String, List<EmailContentInfoDTO>> realEmail(MailboxInfoDTO mailboxInfoDTO, Map<Integer, List<String>> emailTypeMap, Date startDate, Date endDate) {
+    public Map<String, List<EmailContentInfoDTO>> readEmail(MailboxInfoDTO mailboxInfoDTO, Map<Integer, List<String>> emailTypeMap, Date startDate, Date endDate) {
+        String account = mailboxInfoDTO.getAccount();
+        String password = mailboxInfoDTO.getPassword();
+        // 获取token
+        String token = coreMailApiService.login(account, password);
+        if (StrUtil.isBlank(token)) {
+            log.error("邮箱登录失败, 无法获取到token");
+            return MapUtil.newHashMap();
+        }
+        // 获取邮箱文件夹(默认只读取收件箱Inbox的邮件)
+        List<CoreMailFolderDTO> mailFolderList = coreMailApiService.getAllFolders(token);
+
+        // 获取邮件id
+
+        // 根据邮件id获取邮件内容
 
         return MapUtil.newHashMap();
     }

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

@@ -0,0 +1,139 @@
+package com.simuwang.daq.util;
+
+import cn.hutool.core.util.StrUtil;
+import com.huawei.shade.org.apache.http.HttpResponse;
+import com.huawei.shade.org.apache.http.client.methods.HttpGet;
+import com.huawei.shade.org.apache.http.client.methods.HttpPost;
+import com.huawei.shade.org.apache.http.client.methods.HttpRequestBase;
+import com.huawei.shade.org.apache.http.entity.StringEntity;
+import com.huawei.shade.org.apache.http.impl.client.CloseableHttpClient;
+import com.huawei.shade.org.apache.http.impl.client.HttpClients;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+public class HttpClientUtil {
+
+    static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
+
+    public static String get(String url, Map<String, String> header) {
+        HttpGet httpget = new HttpGet(url);
+        addHeader(httpget, header);
+        return getResult(httpget);
+    }
+
+    public static String get(String url, Map<String, String> header, String charsets) {
+        HttpGet httpget = new HttpGet(url);
+        header.put("EMAIL-PARSE-TOKEN", "EMAIL-PARSE-TOKEN");
+        addHeader(httpget, header);
+        return getResult(httpget, charsets);
+    }
+
+    private static HttpPost getPost(String url, Map<String, String> header, String json) {
+        HttpPost httpPost = new HttpPost(url);
+        if (StrUtil.isNotBlank(json)) {
+            StringEntity entity = getEntity(json, StandardCharsets.UTF_8.name(), "application/json; charset=utf-8");
+            httpPost.setEntity(entity);
+        }
+
+        addHeader(httpPost, header);
+        return httpPost;
+    }
+
+    public static String post(String url, Map<String, String> header, String json) {
+        header.put("EMAIL-PARSE-TOKEN", "EMAIL-PARSE-TOKEN");
+        HttpPost httpPost = getPost(url, header, json);
+        return getResult(httpPost);
+    }
+
+    private static StringEntity getEntity(String content, String charset, String contentType) {
+        StringEntity entity = new StringEntity(content, charset);
+        entity.setContentEncoding(charset);
+        entity.setContentType(contentType);
+        return entity;
+    }
+
+    private static void addHeader(HttpRequestBase httpType, Map<String, String> header) {
+        if (header != null && header.size() > 0) {
+            Set<String> headerKey = header.keySet();
+            Iterator var4 = headerKey.iterator();
+
+            while (var4.hasNext()) {
+                String key = (String) var4.next();
+                httpType.setHeader(key, (String) header.get(key));
+            }
+        }
+
+    }
+
+    public static String getResult(HttpRequestBase httpType) {
+        return getResult(httpType, StandardCharsets.UTF_8.name());
+    }
+
+    public static String getResult(HttpRequestBase httpType, String charsets) {
+        CloseableHttpClient httpClient = null;
+
+        String var8;
+        try {
+            httpClient = HttpClients.createDefault();
+            HttpResponse response = httpClient.execute(httpType);
+            int status = response.getStatusLine().getStatusCode();
+            if (status != 200) {
+                logger.error("请求失败url:{},错误的HTTP Status:{}", httpType.getURI().toString(), status);
+                return null;
+            }
+
+            InputStream is = response.getEntity().getContent();
+            String retString = InputStreamTOString(is, charsets);
+            var8 = retString;
+        } catch (Exception var17) {
+            logger.error(httpType.getURI().toString(), var17);
+            return null;
+        } finally {
+            try {
+                if (httpClient != null) {
+                    httpClient.close();
+                }
+            } catch (IOException var16) {
+                var16.printStackTrace();
+            }
+
+        }
+
+        return var8;
+    }
+
+    private static String InputStreamTOString(InputStream in, String encoding) {
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        byte[] data = new byte[4096];
+        boolean var4 = true;
+
+        try {
+            int count;
+            while ((count = in.read(data, 0, 4096)) != -1) {
+                outStream.write(data, 0, count);
+            }
+
+            String result = new String(outStream.toByteArray(), encoding);
+            in.close();
+            outStream.flush();
+            outStream.close();
+            return result;
+        } catch (UnsupportedEncodingException var6) {
+            var6.printStackTrace();
+            return null;
+        } catch (IOException var7) {
+            var7.printStackTrace();
+            return null;
+        }
+    }
+
+}

+ 2 - 0
service-deploy/src/main/resources/application.yml

@@ -96,3 +96,5 @@ simuwang:
     - path: "/**"
       filters: jwt
 
+coremail:
+  url: http://10.100.74.15