tempmail-sdk 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +0,0 @@
1
- import { InternalEmailInfo, Email } from '../types';
2
- /**
3
- * 创建临时邮箱
4
- * API: POST /api/mail/create
5
- * 返回: { code: 0, data: { mailId, address, type, startAt, endAt } }
6
- */
7
- export declare function generateEmail(): Promise<InternalEmailInfo>;
8
- /**
9
- * 获取邮件列表
10
- * API: POST /api/mail/box
11
- * 请求: { address, cursor }
12
- * 返回: { code: 0, data: { rows: [...], cursor, hasMore } }
13
- * 每封邮件: { mailboxId, messageFrom, subject, createdAt, html, attachments, read }
14
- */
15
- export declare function getEmails(email: string): Promise<Email[]>;
@@ -1,90 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateEmail = generateEmail;
4
- exports.getEmails = getEmails;
5
- const normalize_1 = require("../normalize");
6
- const retry_1 = require("../retry");
7
- const CHANNEL = 'tempmail-la';
8
- const BASE_URL = 'https://tempmail.la/api';
9
- const DEFAULT_HEADERS = {
10
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0',
11
- 'Accept': 'application/json, text/plain, */*',
12
- 'Content-Type': 'application/json',
13
- 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
14
- 'cache-control': 'no-cache',
15
- 'dnt': '1',
16
- 'locale': 'zh-CN',
17
- 'origin': 'https://tempmail.la',
18
- 'platform': 'PC',
19
- 'pragma': 'no-cache',
20
- 'product': 'TEMP_MAIL',
21
- 'referer': 'https://tempmail.la/zh-CN/tempmail',
22
- 'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"',
23
- 'sec-ch-ua-mobile': '?0',
24
- 'sec-ch-ua-platform': '"Windows"',
25
- 'sec-fetch-dest': 'empty',
26
- 'sec-fetch-mode': 'cors',
27
- 'sec-fetch-site': 'same-origin',
28
- };
29
- /**
30
- * 创建临时邮箱
31
- * API: POST /api/mail/create
32
- * 返回: { code: 0, data: { mailId, address, type, startAt, endAt } }
33
- */
34
- async function generateEmail() {
35
- const response = await (0, retry_1.fetchWithTimeout)(`${BASE_URL}/mail/create`, {
36
- method: 'POST',
37
- headers: DEFAULT_HEADERS,
38
- body: JSON.stringify({ turnstile: '' }),
39
- });
40
- if (!response.ok) {
41
- throw new Error(`Failed to generate email: ${response.status}`);
42
- }
43
- const data = await response.json();
44
- if (data.code !== 0 || !data.data) {
45
- throw new Error('Failed to generate email');
46
- }
47
- return {
48
- channel: CHANNEL,
49
- email: data.data.address,
50
- expiresAt: data.data.endAt,
51
- createdAt: data.data.startAt,
52
- };
53
- }
54
- /**
55
- * 获取邮件列表
56
- * API: POST /api/mail/box
57
- * 请求: { address, cursor }
58
- * 返回: { code: 0, data: { rows: [...], cursor, hasMore } }
59
- * 每封邮件: { mailboxId, messageFrom, subject, createdAt, html, attachments, read }
60
- */
61
- async function getEmails(email) {
62
- const allEmails = [];
63
- let cursor = null;
64
- let hasMore = true;
65
- // 支持分页,循环获取所有邮件
66
- while (hasMore) {
67
- const response = await (0, retry_1.fetchWithTimeout)(`${BASE_URL}/mail/box`, {
68
- method: 'POST',
69
- headers: DEFAULT_HEADERS,
70
- body: JSON.stringify({ address: email, cursor }),
71
- });
72
- if (!response.ok) {
73
- throw new Error(`Failed to get emails: ${response.status}`);
74
- }
75
- const data = await response.json();
76
- if (data.code !== 0 || !data.data) {
77
- throw new Error('Failed to get emails');
78
- }
79
- const rows = data.data.rows || [];
80
- allEmails.push(...rows);
81
- if (data.data.hasMore && data.data.cursor) {
82
- cursor = data.data.cursor;
83
- }
84
- else {
85
- hasMore = false;
86
- }
87
- }
88
- return allEmails.map((raw) => (0, normalize_1.normalizeEmail)(raw, email));
89
- }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG1haWwtbGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXJzL3RlbXBtYWlsLWxhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUNBLHNDQXVCQztBQVNELDhCQWtDQztBQWxHRCw0Q0FBOEM7QUFDOUMsb0NBQTRDO0FBRTVDLE1BQU0sT0FBTyxHQUFZLGFBQWEsQ0FBQztBQUN2QyxNQUFNLFFBQVEsR0FBRyx5QkFBeUIsQ0FBQztBQUUzQyxNQUFNLGVBQWUsR0FBMkI7SUFDOUMsWUFBWSxFQUFFLCtIQUErSDtJQUM3SSxRQUFRLEVBQUUsbUNBQW1DO0lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7SUFDbEMsaUJBQWlCLEVBQUUsaURBQWlEO0lBQ3BFLGVBQWUsRUFBRSxVQUFVO0lBQzNCLEtBQUssRUFBRSxHQUFHO0lBQ1YsUUFBUSxFQUFFLE9BQU87SUFDakIsUUFBUSxFQUFFLHFCQUFxQjtJQUMvQixVQUFVLEVBQUUsSUFBSTtJQUNoQixRQUFRLEVBQUUsVUFBVTtJQUNwQixTQUFTLEVBQUUsV0FBVztJQUN0QixTQUFTLEVBQUUsb0NBQW9DO0lBQy9DLFdBQVcsRUFBRSxtRUFBbUU7SUFDaEYsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixvQkFBb0IsRUFBRSxXQUFXO0lBQ2pDLGdCQUFnQixFQUFFLE9BQU87SUFDekIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixnQkFBZ0IsRUFBRSxhQUFhO0NBQ2hDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGFBQWE7SUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLHdCQUFnQixFQUFDLEdBQUcsUUFBUSxjQUFjLEVBQUU7UUFDakUsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsZUFBZTtRQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztLQUN4QyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87UUFDeEIsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztRQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQzNDLE1BQU0sU0FBUyxHQUFVLEVBQUUsQ0FBQztJQUM1QixJQUFJLE1BQU0sR0FBa0IsSUFBSSxDQUFDO0lBQ2pDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztJQUVuQixnQkFBZ0I7SUFDaEIsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sUUFBUSxHQUFhLE1BQU0sSUFBQSx3QkFBZ0IsRUFBQyxHQUFHLFFBQVEsV0FBVyxFQUFFO1lBQ3hFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ2pELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFRLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFBLDBCQUFjLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVybmFsRW1haWxJbmZvLCBFbWFpbCwgQ2hhbm5lbCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVtYWlsIH0gZnJvbSAnLi4vbm9ybWFsaXplJztcbmltcG9ydCB7IGZldGNoV2l0aFRpbWVvdXQgfSBmcm9tICcuLi9yZXRyeSc7XG5cbmNvbnN0IENIQU5ORUw6IENoYW5uZWwgPSAndGVtcG1haWwtbGEnO1xuY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly90ZW1wbWFpbC5sYS9hcGknO1xuXG5jb25zdCBERUZBVUxUX0hFQURFUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xNDQuMC4wLjAgU2FmYXJpLzUzNy4zNiBFZGcvMTQ0LjAuMC4wJyxcbiAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonLFxuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnYWNjZXB0LWxhbmd1YWdlJzogJ3poLUNOLHpoO3E9MC45LGVuO3E9MC44LGVuLUdCO3E9MC43LGVuLVVTO3E9MC42JyxcbiAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tY2FjaGUnLFxuICAnZG50JzogJzEnLFxuICAnbG9jYWxlJzogJ3poLUNOJyxcbiAgJ29yaWdpbic6ICdodHRwczovL3RlbXBtYWlsLmxhJyxcbiAgJ3BsYXRmb3JtJzogJ1BDJyxcbiAgJ3ByYWdtYSc6ICduby1jYWNoZScsXG4gICdwcm9kdWN0JzogJ1RFTVBfTUFJTCcsXG4gICdyZWZlcmVyJzogJ2h0dHBzOi8vdGVtcG1haWwubGEvemgtQ04vdGVtcG1haWwnLFxuICAnc2VjLWNoLXVhJzogJ1wiTm90KEE6QnJhbmRcIjt2PVwiOFwiLCBcIkNocm9taXVtXCI7dj1cIjE0NFwiLCBcIk1pY3Jvc29mdCBFZGdlXCI7dj1cIjE0NFwiJyxcbiAgJ3NlYy1jaC11YS1tb2JpbGUnOiAnPzAnLFxuICAnc2VjLWNoLXVhLXBsYXRmb3JtJzogJ1wiV2luZG93c1wiJyxcbiAgJ3NlYy1mZXRjaC1kZXN0JzogJ2VtcHR5JyxcbiAgJ3NlYy1mZXRjaC1tb2RlJzogJ2NvcnMnLFxuICAnc2VjLWZldGNoLXNpdGUnOiAnc2FtZS1vcmlnaW4nLFxufTtcblxuLyoqXG4gKiDliJvlu7rkuLTml7bpgq7nrrFcbiAqIEFQSTogUE9TVCAvYXBpL21haWwvY3JlYXRlXG4gKiDov5Tlm546IHsgY29kZTogMCwgZGF0YTogeyBtYWlsSWQsIGFkZHJlc3MsIHR5cGUsIHN0YXJ0QXQsIGVuZEF0IH0gfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFbWFpbCgpOiBQcm9taXNlPEludGVybmFsRW1haWxJbmZvPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgJHtCQVNFX1VSTH0vbWFpbC9jcmVhdGVgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogREVGQVVMVF9IRUFERVJTLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHVybnN0aWxlOiAnJyB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdlbmVyYXRlIGVtYWlsOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgaWYgKGRhdGEuY29kZSAhPT0gMCB8fCAhZGF0YS5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgZW1haWwnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbDogQ0hBTk5FTCxcbiAgICBlbWFpbDogZGF0YS5kYXRhLmFkZHJlc3MsXG4gICAgZXhwaXJlc0F0OiBkYXRhLmRhdGEuZW5kQXQsXG4gICAgY3JlYXRlZEF0OiBkYXRhLmRhdGEuc3RhcnRBdCxcbiAgfTtcbn1cblxuLyoqXG4gKiDojrflj5bpgq7ku7bliJfooahcbiAqIEFQSTogUE9TVCAvYXBpL21haWwvYm94XG4gKiDor7fmsYI6IHsgYWRkcmVzcywgY3Vyc29yIH1cbiAqIOi/lOWbnjogeyBjb2RlOiAwLCBkYXRhOiB7IHJvd3M6IFsuLi5dLCBjdXJzb3IsIGhhc01vcmUgfSB9XG4gKiDmr4/lsIHpgq7ku7Y6IHsgbWFpbGJveElkLCBtZXNzYWdlRnJvbSwgc3ViamVjdCwgY3JlYXRlZEF0LCBodG1sLCBhdHRhY2htZW50cywgcmVhZCB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbWFpbHMoZW1haWw6IHN0cmluZyk6IFByb21pc2U8RW1haWxbXT4ge1xuICBjb25zdCBhbGxFbWFpbHM6IGFueVtdID0gW107XG4gIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgaGFzTW9yZSA9IHRydWU7XG5cbiAgLy8g5pSv5oyB5YiG6aG177yM5b6q546v6I635Y+W5omA5pyJ6YKu5Lu2XG4gIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgJHtCQVNFX1VSTH0vbWFpbC9ib3hgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IERFRkFVTFRfSEVBREVSUyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWRkcmVzczogZW1haWwsIGN1cnNvciB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBlbWFpbHM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChkYXRhLmNvZGUgIT09IDAgfHwgIWRhdGEuZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IGVtYWlscycpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSBkYXRhLmRhdGEucm93cyB8fCBbXTtcbiAgICBhbGxFbWFpbHMucHVzaCguLi5yb3dzKTtcblxuICAgIGlmIChkYXRhLmRhdGEuaGFzTW9yZSAmJiBkYXRhLmRhdGEuY3Vyc29yKSB7XG4gICAgICBjdXJzb3IgPSBkYXRhLmRhdGEuY3Vyc29yO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNNb3JlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsbEVtYWlscy5tYXAoKHJhdzogYW55KSA9PiBub3JtYWxpemVFbWFpbChyYXcsIGVtYWlsKSk7XG59XG4iXX0=
@@ -1,100 +0,0 @@
1
- import { InternalEmailInfo, Email, Channel } from '../types';
2
- import { normalizeEmail } from '../normalize';
3
- import { fetchWithTimeout } from '../retry';
4
-
5
- const CHANNEL: Channel = 'tempmail-la';
6
- const BASE_URL = 'https://tempmail.la/api';
7
-
8
- const DEFAULT_HEADERS: Record<string, string> = {
9
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 Edg/144.0.0.0',
10
- 'Accept': 'application/json, text/plain, */*',
11
- 'Content-Type': 'application/json',
12
- 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
13
- 'cache-control': 'no-cache',
14
- 'dnt': '1',
15
- 'locale': 'zh-CN',
16
- 'origin': 'https://tempmail.la',
17
- 'platform': 'PC',
18
- 'pragma': 'no-cache',
19
- 'product': 'TEMP_MAIL',
20
- 'referer': 'https://tempmail.la/zh-CN/tempmail',
21
- 'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"',
22
- 'sec-ch-ua-mobile': '?0',
23
- 'sec-ch-ua-platform': '"Windows"',
24
- 'sec-fetch-dest': 'empty',
25
- 'sec-fetch-mode': 'cors',
26
- 'sec-fetch-site': 'same-origin',
27
- };
28
-
29
- /**
30
- * 创建临时邮箱
31
- * API: POST /api/mail/create
32
- * 返回: { code: 0, data: { mailId, address, type, startAt, endAt } }
33
- */
34
- export async function generateEmail(): Promise<InternalEmailInfo> {
35
- const response = await fetchWithTimeout(`${BASE_URL}/mail/create`, {
36
- method: 'POST',
37
- headers: DEFAULT_HEADERS,
38
- body: JSON.stringify({ turnstile: '' }),
39
- });
40
-
41
- if (!response.ok) {
42
- throw new Error(`Failed to generate email: ${response.status}`);
43
- }
44
-
45
- const data = await response.json();
46
-
47
- if (data.code !== 0 || !data.data) {
48
- throw new Error('Failed to generate email');
49
- }
50
-
51
- return {
52
- channel: CHANNEL,
53
- email: data.data.address,
54
- expiresAt: data.data.endAt,
55
- createdAt: data.data.startAt,
56
- };
57
- }
58
-
59
- /**
60
- * 获取邮件列表
61
- * API: POST /api/mail/box
62
- * 请求: { address, cursor }
63
- * 返回: { code: 0, data: { rows: [...], cursor, hasMore } }
64
- * 每封邮件: { mailboxId, messageFrom, subject, createdAt, html, attachments, read }
65
- */
66
- export async function getEmails(email: string): Promise<Email[]> {
67
- const allEmails: any[] = [];
68
- let cursor: string | null = null;
69
- let hasMore = true;
70
-
71
- // 支持分页,循环获取所有邮件
72
- while (hasMore) {
73
- const response: Response = await fetchWithTimeout(`${BASE_URL}/mail/box`, {
74
- method: 'POST',
75
- headers: DEFAULT_HEADERS,
76
- body: JSON.stringify({ address: email, cursor }),
77
- });
78
-
79
- if (!response.ok) {
80
- throw new Error(`Failed to get emails: ${response.status}`);
81
- }
82
-
83
- const data: any = await response.json();
84
-
85
- if (data.code !== 0 || !data.data) {
86
- throw new Error('Failed to get emails');
87
- }
88
-
89
- const rows = data.data.rows || [];
90
- allEmails.push(...rows);
91
-
92
- if (data.data.hasMore && data.data.cursor) {
93
- cursor = data.data.cursor;
94
- } else {
95
- hasMore = false;
96
- }
97
- }
98
-
99
- return allEmails.map((raw: any) => normalizeEmail(raw, email));
100
- }