Przeglądaj źródła

新增pmail(还不可用)

husj 1 miesiąc temu
rodzic
commit
3c8b560b99

+ 11 - 0
pom.xml

@@ -68,12 +68,23 @@
             <optional>true</optional>
         </dependency>
 
+        <!-- Mail IMAP/SMTP -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
         <!-- Test -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.51</version>  <!-- 使用最新版本 -->
+        </dependency>
     </dependencies>
 
     <build>

+ 13 - 0
src/main/java/com/husj/openai/HusjOpenaiApplication.java

@@ -1,5 +1,9 @@
 package com.husj.openai;
 
+import com.husj.openai.schedule.PmailCookiesSchedule;
+import com.husj.openai.service.PmailService;
+import jakarta.annotation.PostConstruct;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -8,8 +12,17 @@ import com.husj.openai.config.AppProperties;
 @SpringBootApplication
 @EnableConfigurationProperties(AppProperties.class)
 public class HusjOpenaiApplication {
+    @Autowired
+    private PmailService pmailService;
 
     public static void main(String[] args) {
         SpringApplication.run(HusjOpenaiApplication.class, args);
     }
+
+
+    @PostConstruct
+    public void init() {
+        // 启动时自动创建别名
+        PmailCookiesSchedule.cookies = pmailService.getCookies();
+    }
 }

+ 12 - 1
src/main/java/com/husj/openai/mail/EmailBundle.java

@@ -17,7 +17,7 @@ public class EmailBundle {
 
     private static final Pattern OTP_PATTERN = Pattern.compile("(?<!\\d)(\\d{6})(?!\\d)");
 
-    public enum Provider { TEMPMAIL, GPTMAIL }
+    public enum Provider { TEMPMAIL, GPTMAIL, PMAIL }
 
     private final Provider provider;
     private final String email;
@@ -27,6 +27,8 @@ public class EmailBundle {
     private TempMailClient tempMailClient;
     // GPTMail specific
     private GptMailClient gptMailClient;
+    // PMail specific
+    private PMailClient pMailClient;
 
     /** Build TempMail bundle */
     public EmailBundle(TempMailClient client, String password) {
@@ -44,6 +46,14 @@ public class EmailBundle {
         this.password = password;
     }
 
+    /** Build PMail bundle */
+    public EmailBundle(PMailClient client, String password) {
+        this.provider = Provider.PMAIL;
+        this.pMailClient = client;
+        this.email = client.getAddress();
+        this.password = password;
+    }
+
     public String getEmail() { return email; }
     public String getPassword() { return password; }
     public Provider getProvider() { return provider; }
@@ -98,6 +108,7 @@ public class EmailBundle {
         return switch (provider) {
             case TEMPMAIL -> tempMailClient.getMessages();
             case GPTMAIL -> gptMailClient.listEmails(email);
+            case PMAIL -> pMailClient.getMessages();
         };
     }
 

+ 7 - 0
src/main/java/com/husj/openai/mail/EmailProviderFactory.java

@@ -21,6 +21,7 @@ public class EmailProviderFactory {
         return switch (p) {
             case "tempmail" -> buildTempMail(proxy);
             case "gptmail" -> buildGptMail(proxy);
+            case "pmail" -> buildPMail(proxy);
             default -> buildAuto(proxy);
         };
     }
@@ -36,6 +37,12 @@ public class EmailProviderFactory {
         return new EmailBundle(client, email, PkceUtil.genPassword());
     }
 
+    private EmailBundle buildPMail(String proxy) {
+        String alias = PkceUtil.randomName().toLowerCase() + "@030208.xyz";
+        PMailClient client = new PMailClient(alias);
+        return new EmailBundle(client, PkceUtil.genPassword());
+    }
+
     private EmailBundle buildAuto(String proxy) {
         try {
             return buildTempMail(proxy);

+ 126 - 0
src/main/java/com/husj/openai/mail/PMailClient.java

@@ -0,0 +1,126 @@
+package com.husj.openai.mail;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.husj.openai.service.PmailService;
+import jakarta.mail.*;
+import jakarta.mail.BodyPart;
+import jakarta.mail.internet.MimeMultipart;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+
+import java.io.IOException;
+import java.net.http.HttpResponse;
+import java.util.*;
+
+
+/**
+ * PMail 自建邮箱客户端 — 连接 IMAP(993) 获取验证码
+ */
+@Slf4j
+public class PMailClient {
+
+    private static final String HOST = "pmail.030208.xyz";
+    private static final String USER = "husj@030208.xyz";
+    private static final String PASS = "15629747218hsjH";
+    private static final int PORT = 993;
+
+    private final String address;
+
+    public PMailClient(String aliasAddress) {
+        this.address = aliasAddress;
+        log.info("[+] 分配自建域邮箱别名: {} (PMail)", this.address);
+        log.info("[*] 自动轮询已启动(关联至主信箱 {})", USER);
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public List<Map<String, Object>> getMessages() {
+        return new PmailService().getEmail();
+    }
+
+    private String getTextFromMessage(Message message) throws Exception {
+        if (message.isMimeType("text/plain")) {
+            return message.getContent().toString();
+        } else if (message.isMimeType("multipart/*")) {
+            return getTextFromMimeMultipart((MimeMultipart) message.getContent());
+        }
+        return "";
+    }
+
+    private String getTextFromMimeMultipart(MimeMultipart mimeMultipart) throws Exception {
+        StringBuilder result = new StringBuilder();
+        int count = mimeMultipart.getCount();
+        for (int i = 0; i < count; i++) {
+            BodyPart bodyPart = mimeMultipart.getBodyPart(i);
+            if (bodyPart.isMimeType("text/plain")) {
+                result.append("\n").append(bodyPart.getContent());
+            } else if (bodyPart.isMimeType("text/html")) {
+                result.append("\n").append(bodyPart.getContent());
+            } else if (bodyPart.getContent() instanceof MimeMultipart) {
+                result.append(getTextFromMimeMultipart((MimeMultipart) bodyPart.getContent()));
+            }
+        }
+        return result.toString();
+    }
+
+    public static void main(String[] args) throws IOException {
+        OkHttpClient client = new OkHttpClient.Builder()
+                .followRedirects(true)
+                .followSslRedirects(true)
+                .build();
+
+        // 构建JSON请求体
+        String jsonBode = "{\"tag\":{\"type\":0,\"status\":-1,\"group_id\":0},\"page_size\":10}";
+        RequestBody body = RequestBody.create(jsonBode, MediaType.parse("application/json; charset=utf-8"));
+
+        // 从 -b 参数获取的 Cookie
+
+        Request request = new Request.Builder()
+                .url("https://pmail.030208.xyz/api/email/list")
+                .addHeader("Cookie", "session=beG8AdZzfjgHWPwR0mrgoWGvjMU30zwPgvfNgT31sSk")  // 添加 Cookie 头
+                .addHeader("Accept", "application/json, text/plain, */*")
+                .addHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
+                .addHeader("Cache-Control", "no-cache")
+                .addHeader("Content-Type", "application/json;charset=UTF-8;")
+                .addHeader("Lang", "zhCn")
+                .addHeader("Origin", "https://pmail.030208.xyz")
+                .addHeader("Pragma", "no-cache")
+                .addHeader("Priority", "u=1, i")
+                .addHeader("Referer", "https://pmail.030208.xyz/")
+                .addHeader("Sec-Ch-Ua", "\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft")
+                .addHeader("Sec-Ch-Ua-Mobile", "?0")
+                .addHeader("Sec-Ch-Ua-Platform", "\"Windows\"")
+                .addHeader("Sec-Fetch-Dest", "empty")
+                .addHeader("Sec-Fetch-Mode", "cors")
+                .addHeader("Sec-Fetch-Site", "same-origin")
+                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0")
+                .post(body)
+                .build();
+
+        try (Response response = client.newCall(request).execute()) {
+            if (response.body() != null) {
+                String html = response.body().string();
+                System.out.println(html);
+                JSONObject jsonObject = JSON.parseObject(html);
+                JSONArray jsonList = jsonObject.getJSONObject("data").getJSONArray("list");
+                for (int i = 0; i < 3; i++) {
+                    HashMap<String, Object> map = new HashMap<>();
+                    JSONObject json = jsonList.getJSONObject(i);
+                    map.put("subject", json.getString("title"));
+                    map.put("txt", json.getString("title"));
+                    JSONObject to = (JSONObject) json.getJSONArray("to").get(0);
+                    map.put("from", to.getString("EmailAddress"));
+                    System.out.println( map);
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
+

+ 23 - 0
src/main/java/com/husj/openai/schedule/PmailCookiesSchedule.java

@@ -0,0 +1,23 @@
+package com.husj.openai.schedule;
+
+import com.husj.openai.service.PmailService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PmailCookiesSchedule {
+    @Autowired
+    private PmailService pmailService;
+
+    public static String cookies ;
+
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void getCookies() {
+        try {
+            cookies = pmailService.getCookies();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 123 - 0
src/main/java/com/husj/openai/service/PmailService.java

@@ -0,0 +1,123 @@
+package com.husj.openai.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import okhttp3.*;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class PmailService {
+    public String getCookies() {
+        OkHttpClient client = new OkHttpClient.Builder()
+                .followRedirects(true)
+                .followSslRedirects(true)
+                .build();
+
+        // 构建JSON请求体
+        String json = "{\"account\":\"husj\",\"password\":\"15629747218hsjH\"}";
+        RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
+
+        Request request = new Request.Builder()
+                .url("https://pmail.030208.xyz/api/login")
+                .addHeader("Accept", "application/json, text/plain, */*")
+                .addHeader("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7")
+                .addHeader("Cache-Control", "no-cache")
+                .addHeader("Content-Type", "application/json;charset=UTF-8;")
+                .addHeader("Lang", "zhCn")
+                .addHeader("Origin", "https://pmail.030208.xyz")
+                .addHeader("Pragma", "no-cache")
+                .addHeader("Priority", "u=1, i")
+                .addHeader("Referer", "https://pmail.030208.xyz/")
+                .addHeader("Sec-Ch-Ua", "\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Google")
+                .addHeader("Sec-Ch-Ua-Mobile", "?0")
+                .addHeader("Sec-Ch-Ua-Platform", "\"Windows\"")
+                .addHeader("Sec-Fetch-Dest", "empty")
+                .addHeader("Sec-Fetch-Mode", "cors")
+                .addHeader("Sec-Fetch-Site", "same-origin")
+                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36")
+                .post(body)  // 改为POST方法
+                .build();
+
+        try (Response response = client.newCall(request).execute()) {
+            System.out.println(response.code() + " " + response.message());
+            List<String> setCookies = response.headers("Set-Cookie");
+            String cookies = setCookies.get(0);
+            return cookies;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public List<Map<String, Object>> getEmail() {
+        try {
+            //确保能收到邮件
+            Thread.sleep(3*1000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+        ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>> ();
+        OkHttpClient client = new OkHttpClient.Builder()
+                .followRedirects(true)
+                .followSslRedirects(true)
+                .build();
+
+        // 构建JSON请求体
+        String jsonBody = "{\"tag\":{\"type\":0,\"status\":-1,\"group_id\":0},\"page_size\":10}";
+        RequestBody body = RequestBody.create(jsonBody, MediaType.parse("application/json; charset=utf-8"));
+
+        // 从 -b 参数获取的 Cookie
+
+        Request request = new Request.Builder()
+                .url("https://pmail.030208.xyz/api/email/list")
+                .addHeader("Cookie", "session=beG8AdZzfjgHWPwR0mrgoWGvjMU30zwPgvfNgT31sSk")  // 添加 Cookie 头
+                .addHeader("Accept", "application/json, text/plain, */*")
+                .addHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
+                .addHeader("Cache-Control", "no-cache")
+                .addHeader("Content-Type", "application/json;charset=UTF-8;")
+                .addHeader("Lang", "zhCn")
+                .addHeader("Origin", "https://pmail.030208.xyz")
+                .addHeader("Pragma", "no-cache")
+                .addHeader("Priority", "u=1, i")
+                .addHeader("Referer", "https://pmail.030208.xyz/")
+                .addHeader("Sec-Ch-Ua", "\"Chromium\";v=\"146\", \"Not-A.Brand\";v=\"24\", \"Microsoft")
+                .addHeader("Sec-Ch-Ua-Mobile", "?0")
+                .addHeader("Sec-Ch-Ua-Platform", "\"Windows\"")
+                .addHeader("Sec-Fetch-Dest", "empty")
+                .addHeader("Sec-Fetch-Mode", "cors")
+                .addHeader("Sec-Fetch-Site", "same-origin")
+                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36 Edg/146.0.0.0")
+                .post(body)
+                .build();
+
+        try (Response response = client.newCall(request).execute()) {
+
+            // 打印响应体
+            if (response.body() != null) {
+                String html = response.body().string();
+//                System.out.println(html);
+                JSONObject jsonObject = JSON.parseObject(html);
+                JSONArray jsonList = jsonObject.getJSONObject("data").getJSONArray("list");
+                for (int i = 0; i < 3; i++) {
+                    HashMap<String, Object> map = new HashMap<>();
+                    JSONObject json = jsonList.getJSONObject(i);
+                    map.put("subject", json.getString("title"));
+                    map.put("txt", json.getString("title"));
+                    JSONObject to = (JSONObject) json.getJSONArray("to").get(0);
+                    map.put("from", to.getString("EmailAddress"));
+                    list.add(map);
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return list;
+    }
+}

+ 1 - 1
src/main/resources/application.yml

@@ -9,7 +9,7 @@ husj:
   openai:
     # 代理配置 (可选, 例: http://127.0.0.1:7890)
     proxy: ""
-    # 临时邮箱提供商: auto / gptmail / tempmail
+    # 临时邮箱提供商: pmail / auto / gptmail / tempmail
     mail-provider: auto
     # 循环模式随机等待时间范围(秒)
     sleep-min: 5