tempmail-sdk 1.0.3 → 1.1.1

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.
Files changed (50) hide show
  1. package/README.md +51 -3
  2. package/bun.lock +60 -0
  3. package/demo/poll-emails.ts +7 -8
  4. package/dist/config.d.ts +47 -0
  5. package/dist/config.js +68 -0
  6. package/dist/index.d.ts +21 -20
  7. package/dist/index.js +101 -37
  8. package/dist/normalize.js +28 -3
  9. package/dist/providers/awamail.d.ts +2 -2
  10. package/dist/providers/awamail.js +1 -1
  11. package/dist/providers/chatgpt-org-uk.d.ts +2 -2
  12. package/dist/providers/chatgpt-org-uk.js +1 -1
  13. package/dist/providers/dropmail.d.ts +2 -2
  14. package/dist/providers/dropmail.js +1 -1
  15. package/dist/providers/guerrillamail.d.ts +22 -0
  16. package/dist/providers/guerrillamail.js +71 -0
  17. package/dist/providers/linshi-email.d.ts +2 -2
  18. package/dist/providers/linshi-email.js +1 -1
  19. package/dist/providers/mail-tm.d.ts +2 -2
  20. package/dist/providers/mail-tm.js +1 -1
  21. package/dist/providers/maildrop.d.ts +21 -0
  22. package/dist/providers/maildrop.js +180 -0
  23. package/dist/providers/temp-mail-io.d.ts +2 -2
  24. package/dist/providers/temp-mail-io.js +1 -1
  25. package/dist/providers/tempmail-la.d.ts +2 -2
  26. package/dist/providers/tempmail-la.js +1 -1
  27. package/dist/providers/tempmail-lol.d.ts +2 -2
  28. package/dist/providers/tempmail-lol.js +1 -1
  29. package/dist/providers/tempmail.d.ts +2 -2
  30. package/dist/providers/tempmail.js +1 -1
  31. package/dist/retry.js +14 -5
  32. package/dist/types.d.ts +14 -15
  33. package/dist/types.js +1 -1
  34. package/package.json +1 -1
  35. package/src/config.ts +82 -0
  36. package/src/index.ts +102 -39
  37. package/src/normalize.ts +30 -2
  38. package/src/providers/awamail.ts +2 -2
  39. package/src/providers/chatgpt-org-uk.ts +2 -2
  40. package/src/providers/dropmail.ts +2 -2
  41. package/src/providers/guerrillamail.ts +78 -0
  42. package/src/providers/linshi-email.ts +2 -2
  43. package/src/providers/mail-tm.ts +2 -2
  44. package/src/providers/maildrop.ts +210 -0
  45. package/src/providers/temp-mail-io.ts +2 -2
  46. package/src/providers/tempmail-la.ts +2 -2
  47. package/src/providers/tempmail-lol.ts +2 -2
  48. package/src/providers/tempmail.ts +2 -2
  49. package/src/retry.ts +15 -4
  50. package/src/types.ts +15 -15
package/README.md CHANGED
@@ -3,12 +3,16 @@
3
3
  [![npm version](https://badge.fury.io/js/tempmail-sdk.svg)](https://www.npmjs.com/package/tempmail-sdk)
4
4
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
5
5
 
6
- 临时邮箱 SDK(TypeScript/Node.js),支持 9 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
6
+ 临时邮箱 SDK(TypeScript/Node.js),支持 11 个邮箱服务提供商,所有渠道返回**统一标准化格式**。
7
7
 
8
8
  ## 安装
9
9
 
10
10
  ```bash
11
+ # 从 npmjs.org
11
12
  npm install tempmail-sdk
13
+
14
+ # 从 GitHub Packages
15
+ npm install @XxxXTeam/tempmail-sdk --registry=https://npm.pkg.github.com
12
16
  ```
13
17
 
14
18
  ## 支持的渠道
@@ -24,6 +28,8 @@ npm install tempmail-sdk
24
28
  | `awamail` | awamail.com | ✅ | Session Cookie 自动管理 |
25
29
  | `mail-tm` | mail.tm | ✅ | 自动注册账号获取 Bearer Token |
26
30
  | `dropmail` | dropmail.me | ✅ | GraphQL API |
31
+ | `guerrillamail` | guerrillamail.com | ✅ | 公开 JSON API |
32
+ | `maildrop` | maildrop.cc | ✅ | GraphQL API,自带反垃圾 |
27
33
 
28
34
  > **提示:** 使用 `TempEmailClient` 类时无需手动处理 Token,SDK 自动管理。
29
35
 
@@ -74,7 +80,9 @@ console.log(channels);
74
80
  // { channel: 'temp-mail-io', name: 'Temp Mail IO', website: 'temp-mail.io' },
75
81
  // { channel: 'awamail', name: 'AwaMail', website: 'awamail.com' },
76
82
  // { channel: 'mail-tm', name: 'Mail.tm', website: 'mail.tm' },
77
- // { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' }
83
+ // { channel: 'dropmail', name: 'DropMail', website: 'dropmail.me' },
84
+ // { channel: 'guerrillamail', name: 'Guerrilla Mail', website: 'guerrillamail.com' },
85
+ // { channel: 'maildrop', name: 'Maildrop', website: 'maildrop.cc' }
78
86
  // ]
79
87
 
80
88
  const info = getChannelInfo('tempmail');
@@ -186,7 +194,7 @@ for (const email of result2.emails) {
186
194
  |------|------|:----:|------|
187
195
  | `channel` | `Channel` | ✅ | 渠道标识 |
188
196
  | `email` | `string` | ✅ | 邮箱地址 |
189
- | `token` | `string` | 部分 | 访问令牌(`tempmail-lol`、`awamail`、`mail-tm`、`dropmail` 必填) |
197
+ | `token` | `string` | 部分 | 访问令牌(`tempmail-lol`、`awamail`、`mail-tm`、`dropmail`、`guerrillamail`、`maildrop` 必填) |
190
198
 
191
199
  **返回值:** `GetEmailsResult`
192
200
 
@@ -233,6 +241,46 @@ await client.getEmails(); // 获取邮件(自动传递 token)
233
241
  client.getEmailInfo(); // 获取当前邮箱信息
234
242
  ```
235
243
 
244
+ ## 代理与 HTTP 配置
245
+
246
+ SDK 支持全局配置代理、超时等 HTTP 客户端参数,也可通过环境变量零代码配置:
247
+
248
+ ```typescript
249
+ import { setConfig } from 'tempmail-sdk';
250
+
251
+ // 一行跳过 SSL 验证
252
+ setConfig({ insecure: true });
253
+
254
+ // 设置全局超时
255
+ setConfig({ timeout: 30000 });
256
+
257
+ // 使用自定义 fetch(如 undici 代理)
258
+ import { ProxyAgent, fetch as undiciFetch } from 'undici';
259
+ const agent = new ProxyAgent('http://127.0.0.1:7890');
260
+ setConfig({
261
+ customFetch: (url, init) => undiciFetch(url, { ...init, dispatcher: agent }) as any,
262
+ });
263
+ ```
264
+
265
+ **配置项:**
266
+
267
+ | 字段 | 类型 | 说明 |
268
+ |------|------|------|
269
+ | `proxy` | `string?` | 代理 URL(http/https/socks5) |
270
+ | `timeout` | `number?` | 全局超时毫秒数,默认 15000 |
271
+ | `insecure` | `boolean?` | 跳过 SSL 验证(调试用) |
272
+ | `customFetch` | `typeof fetch?` | 自定义 fetch 函数,用于代理等高级场景 |
273
+
274
+ **环境变量(无需修改代码):**
275
+
276
+ ```bash
277
+ export TEMPMAIL_PROXY="http://127.0.0.1:7890"
278
+ export TEMPMAIL_INSECURE=1
279
+ export TEMPMAIL_TIMEOUT=30000
280
+ ```
281
+
282
+ > **提示:** Node.js 原生 fetch 不支持代理,推荐通过 `customFetch` + `undici` 的 `ProxyAgent` 实现代理支持。
283
+
236
284
  ## 环境要求
237
285
 
238
286
  - Node.js 18+(需要原生 `fetch` 支持)
package/bun.lock ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "configVersion": 0,
4
+ "workspaces": {
5
+ "": {
6
+ "name": "tempmail-sdk",
7
+ "dependencies": {
8
+ "readline": "^1.3.0",
9
+ },
10
+ "devDependencies": {
11
+ "@types/node": "^20.0.0",
12
+ "ts-node": "^10.9.0",
13
+ "typescript": "^5.0.0",
14
+ },
15
+ },
16
+ },
17
+ "packages": {
18
+ "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
19
+
20
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
21
+
22
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
23
+
24
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
25
+
26
+ "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="],
27
+
28
+ "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="],
29
+
30
+ "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="],
31
+
32
+ "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="],
33
+
34
+ "@types/node": ["@types/node@20.19.30", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g=="],
35
+
36
+ "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
37
+
38
+ "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="],
39
+
40
+ "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="],
41
+
42
+ "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="],
43
+
44
+ "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="],
45
+
46
+ "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="],
47
+
48
+ "readline": ["readline@1.3.0", "", {}, "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg=="],
49
+
50
+ "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="],
51
+
52
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
53
+
54
+ "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
55
+
56
+ "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="],
57
+
58
+ "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="],
59
+ }
60
+ }
@@ -84,11 +84,7 @@ async function pollEmails(emailInfo: EmailInfo): Promise<void> {
84
84
  pollCount++;
85
85
 
86
86
  try {
87
- const result = await getEmails({
88
- channel: emailInfo.channel,
89
- email: emailInfo.email,
90
- token: emailInfo.token,
91
- });
87
+ const result = await getEmails(emailInfo);
92
88
 
93
89
  const timestamp = new Date().toLocaleTimeString();
94
90
 
@@ -142,15 +138,18 @@ async function main(): Promise<void> {
142
138
  try {
143
139
  const emailInfo = await generateEmail({ channel: selectedChannel });
144
140
 
141
+ if (!emailInfo) {
142
+ console.error('\n❌ 所有渠道均不可用');
143
+ process.exit(1);
144
+ return;
145
+ }
146
+
145
147
  console.log('\n✅ 获取邮箱成功!');
146
148
  printJson('返回数据 (EmailInfo)', emailInfo);
147
149
 
148
150
  console.log('\n📋 邮箱信息:');
149
151
  console.log(` 渠道: ${emailInfo.channel}`);
150
152
  console.log(` 邮箱: ${emailInfo.email}`);
151
- if (emailInfo.token) {
152
- console.log(` Token: ${emailInfo.token}`);
153
- }
154
153
  if (emailInfo.expiresAt) {
155
154
  console.log(` 过期时间: ${emailInfo.expiresAt}`);
156
155
  }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * SDK 全局配置
3
+ * 包含代理、超时、SSL 等设置,作用于所有 HTTP 请求
4
+ *
5
+ * 支持环境变量自动读取(优先级低于代码设置):
6
+ * TEMPMAIL_PROXY - 代理 URL
7
+ * TEMPMAIL_TIMEOUT - 超时毫秒数
8
+ * TEMPMAIL_INSECURE - 设为 "1" 或 "true" 跳过 SSL 验证
9
+ *
10
+ * Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
11
+ */
12
+ /**
13
+ * SDK 全局配置接口
14
+ */
15
+ export interface SDKConfig {
16
+ /** 代理 URL,支持 http/https/socks5,如 "http://127.0.0.1:7890" */
17
+ proxy?: string;
18
+ /** 全局默认超时(毫秒),默认 15000 */
19
+ timeout?: number;
20
+ /** 跳过 SSL 证书验证(调试用) */
21
+ insecure?: boolean;
22
+ /**
23
+ * 自定义 fetch 函数,用于完全控制 HTTP 请求行为
24
+ * 当设置了 proxy 但环境不支持 undici 时,可通过此选项传入支持代理的 fetch 实现
25
+ */
26
+ customFetch?: typeof fetch;
27
+ }
28
+ /**
29
+ * 设置 SDK 全局配置
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // 一行跳过 SSL 验证
34
+ * setConfig({ insecure: true });
35
+ *
36
+ * // 设置代理和超时
37
+ * setConfig({ proxy: 'http://127.0.0.1:7890', timeout: 30000 });
38
+ *
39
+ * // 使用自定义 fetch(如支持代理的 undici)
40
+ * import { ProxyAgent, fetch as undiciFetch } from 'undici';
41
+ * const agent = new ProxyAgent('http://127.0.0.1:7890');
42
+ * setConfig({ customFetch: (url, init) => undiciFetch(url, { ...init, dispatcher: agent }) });
43
+ * ```
44
+ */
45
+ export declare function setConfig(config: SDKConfig): void;
46
+ /** 获取当前 SDK 全局配置 */
47
+ export declare function getConfig(): SDKConfig;
package/dist/config.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * SDK 全局配置
4
+ * 包含代理、超时、SSL 等设置,作用于所有 HTTP 请求
5
+ *
6
+ * 支持环境变量自动读取(优先级低于代码设置):
7
+ * TEMPMAIL_PROXY - 代理 URL
8
+ * TEMPMAIL_TIMEOUT - 超时毫秒数
9
+ * TEMPMAIL_INSECURE - 设为 "1" 或 "true" 跳过 SSL 验证
10
+ *
11
+ * Node.js 环境下设置 insecure 会自动设置 NODE_TLS_REJECT_UNAUTHORIZED=0
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.setConfig = setConfig;
15
+ exports.getConfig = getConfig;
16
+ /** 从环境变量读取默认配置 */
17
+ function loadEnvConfig() {
18
+ const config = {};
19
+ if (typeof process !== 'undefined' && process.env) {
20
+ if (process.env.TEMPMAIL_PROXY) {
21
+ config.proxy = process.env.TEMPMAIL_PROXY;
22
+ }
23
+ if (process.env.TEMPMAIL_TIMEOUT) {
24
+ const t = parseInt(process.env.TEMPMAIL_TIMEOUT, 10);
25
+ if (!isNaN(t) && t > 0)
26
+ config.timeout = t;
27
+ }
28
+ if (process.env.TEMPMAIL_INSECURE === '1' || process.env.TEMPMAIL_INSECURE?.toLowerCase() === 'true') {
29
+ config.insecure = true;
30
+ }
31
+ }
32
+ return config;
33
+ }
34
+ let globalConfig = loadEnvConfig();
35
+ /**
36
+ * 设置 SDK 全局配置
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * // 一行跳过 SSL 验证
41
+ * setConfig({ insecure: true });
42
+ *
43
+ * // 设置代理和超时
44
+ * setConfig({ proxy: 'http://127.0.0.1:7890', timeout: 30000 });
45
+ *
46
+ * // 使用自定义 fetch(如支持代理的 undici)
47
+ * import { ProxyAgent, fetch as undiciFetch } from 'undici';
48
+ * const agent = new ProxyAgent('http://127.0.0.1:7890');
49
+ * setConfig({ customFetch: (url, init) => undiciFetch(url, { ...init, dispatcher: agent }) });
50
+ * ```
51
+ */
52
+ function setConfig(config) {
53
+ globalConfig = { ...config };
54
+ /* Node.js 环境下 insecure 自动设置环境变量 */
55
+ if (typeof process !== 'undefined' && process.env) {
56
+ if (config.insecure) {
57
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
58
+ }
59
+ else {
60
+ delete process.env.NODE_TLS_REJECT_UNAUTHORIZED;
61
+ }
62
+ }
63
+ }
64
+ /** 获取当前 SDK 全局配置 */
65
+ function getConfig() {
66
+ return globalConfig;
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7QUF3REgsOEJBVUM7QUFHRCw4QkFFQztBQXBERCxrQkFBa0I7QUFDbEIsU0FBUyxhQUFhO0lBQ3BCLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztJQUM3QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyRyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxJQUFJLFlBQVksR0FBYyxhQUFhLEVBQUUsQ0FBQztBQUU5Qzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxNQUFpQjtJQUN6QyxZQUFZLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQzdCLG1DQUFtQztJQUNuQyxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUM7UUFDakQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsb0JBQW9CO0FBQ3BCLFNBQWdCLFNBQVM7SUFDdkIsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU0RLIOWFqOWxgOmFjee9rlxuICog5YyF5ZCr5Luj55CG44CB6LaF5pe244CBU1NMIOetieiuvue9ru+8jOS9nOeUqOS6juaJgOaciSBIVFRQIOivt+axglxuICpcbiAqIOaUr+aMgeeOr+Wig+WPmOmHj+iHquWKqOivu+WPlu+8iOS8mOWFiOe6p+S9juS6juS7o+eggeiuvue9ru+8ie+8mlxuICogICBURU1QTUFJTF9QUk9YWSAgICAtIOS7o+eQhiBVUkxcbiAqICAgVEVNUE1BSUxfVElNRU9VVCAgLSDotoXml7bmr6vnp5LmlbBcbiAqICAgVEVNUE1BSUxfSU5TRUNVUkUgLSDorr7kuLogXCIxXCIg5oiWIFwidHJ1ZVwiIOi3s+i/hyBTU0wg6aqM6K+BXG4gKlxuICogTm9kZS5qcyDnjq/looPkuIvorr7nva4gaW5zZWN1cmUg5Lya6Ieq5Yqo6K6+572uIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ9MFxuICovXG5cbi8qKlxuICogU0RLIOWFqOWxgOmFjee9ruaOpeWPo1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNES0NvbmZpZyB7XG4gIC8qKiDku6PnkIYgVVJM77yM5pSv5oyBIGh0dHAvaHR0cHMvc29ja3M177yM5aaCIFwiaHR0cDovLzEyNy4wLjAuMTo3ODkwXCIgKi9cbiAgcHJveHk/OiBzdHJpbmc7XG4gIC8qKiDlhajlsYDpu5jorqTotoXml7bvvIjmr6vnp5LvvInvvIzpu5jorqQgMTUwMDAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIOi3s+i/hyBTU0wg6K+B5Lmm6aqM6K+B77yI6LCD6K+V55So77yJICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOiHquWumuS5iSBmZXRjaCDlh73mlbDvvIznlKjkuo7lrozlhajmjqfliLYgSFRUUCDor7fmsYLooYzkuLpcbiAgICog5b2T6K6+572u5LqGIHByb3h5IOS9hueOr+Wig+S4jeaUr+aMgSB1bmRpY2kg5pe277yM5Y+v6YCa6L+H5q2k6YCJ6aG55Lyg5YWl5pSv5oyB5Luj55CG55qEIGZldGNoIOWunueOsFxuICAgKi9cbiAgY3VzdG9tRmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbi8qKiDku47njq/looPlj5jph4/or7vlj5bpu5jorqTphY3nva4gKi9cbmZ1bmN0aW9uIGxvYWRFbnZDb25maWcoKTogU0RLQ29uZmlnIHtcbiAgY29uc3QgY29uZmlnOiBTREtDb25maWcgPSB7fTtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudikge1xuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9QUk9YWSkge1xuICAgICAgY29uZmlnLnByb3h5ID0gcHJvY2Vzcy5lbnYuVEVNUE1BSUxfUFJPWFk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5URU1QTUFJTF9USU1FT1VUKSB7XG4gICAgICBjb25zdCB0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVEVNUE1BSUxfVElNRU9VVCwgMTApO1xuICAgICAgaWYgKCFpc05hTih0KSAmJiB0ID4gMCkgY29uZmlnLnRpbWVvdXQgPSB0O1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVNUE1BSUxfSU5TRUNVUkUgPT09ICcxJyB8fCBwcm9jZXNzLmVudi5URU1QTUFJTF9JTlNFQ1VSRT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnKSB7XG4gICAgICBjb25maWcuaW5zZWN1cmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5sZXQgZ2xvYmFsQ29uZmlnOiBTREtDb25maWcgPSBsb2FkRW52Q29uZmlnKCk7XG5cbi8qKlxuICog6K6+572uIFNESyDlhajlsYDphY3nva5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIOS4gOihjOi3s+i/hyBTU0wg6aqM6K+BXG4gKiBzZXRDb25maWcoeyBpbnNlY3VyZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyDorr7nva7ku6PnkIblkozotoXml7ZcbiAqIHNldENvbmZpZyh7IHByb3h5OiAnaHR0cDovLzEyNy4wLjAuMTo3ODkwJywgdGltZW91dDogMzAwMDAgfSk7XG4gKlxuICogLy8g5L2/55So6Ieq5a6a5LmJIGZldGNo77yI5aaC5pSv5oyB5Luj55CG55qEIHVuZGljae+8iVxuICogaW1wb3J0IHsgUHJveHlBZ2VudCwgZmV0Y2ggYXMgdW5kaWNpRmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuICogY29uc3QgYWdlbnQgPSBuZXcgUHJveHlBZ2VudCgnaHR0cDovLzEyNy4wLjAuMTo3ODkwJyk7XG4gKiBzZXRDb25maWcoeyBjdXN0b21GZXRjaDogKHVybCwgaW5pdCkgPT4gdW5kaWNpRmV0Y2godXJsLCB7IC4uLmluaXQsIGRpc3BhdGNoZXI6IGFnZW50IH0pIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgZ2xvYmFsQ29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgLyogTm9kZS5qcyDnjq/looPkuIsgaW5zZWN1cmUg6Ieq5Yqo6K6+572u546v5aKD5Y+Y6YePICovXG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYpIHtcbiAgICBpZiAoY29uZmlnLmluc2VjdXJlKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEID0gJzAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIOiOt+WPluW9k+WJjSBTREsg5YWo5bGA6YWN572uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IFNES0NvbmZpZyB7XG4gIHJldHVybiBnbG9iYWxDb25maWc7XG59XG4iXX0=
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import { Channel, EmailInfo, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
2
+ import { setConfig, getConfig } from './config';
2
3
  export { Channel, EmailInfo, Email, EmailAttachment, GetEmailsResult, GenerateEmailOptions, GetEmailsOptions } from './types';
3
4
  export { normalizeEmail } from './normalize';
4
5
  export { withRetry, fetchWithTimeout, RetryOptions } from './retry';
5
6
  export { LogLevel, LogHandler, setLogLevel, getLogLevel, setLogger, logger } from './logger';
7
+ export { SDKConfig, setConfig, getConfig } from './config';
6
8
  /**
7
9
  * 渠道信息,包含渠道标识、显示名称和对应网站
8
10
  */
@@ -37,47 +39,43 @@ export declare function getChannelInfo(channel: Channel): ChannelInfo | undefine
37
39
  * 创建临时邮箱
38
40
  *
39
41
  * 错误处理策略:
40
- * - 网络错误、超时、服务端 5xx 错误 → 自动重试(默认 2 次,指数退避)
41
- * - 4xx 客户端错误、参数错误 → 直接抛出异常
42
+ * - 指定渠道失败时,自动尝试其他可用渠道(打乱顺序逐个尝试)
43
+ * - 未指定渠道时,打乱全部渠道逐个尝试,直到成功
44
+ * - 所有渠道均不可用时返回 null(不抛出异常)
42
45
  *
43
46
  * @param options - 创建选项,可指定渠道、有效时长、域名等
44
- * @returns 邮箱信息,包含地址、令牌等
45
- * @throws 重试耗尽后仍失败时抛出异常
47
+ * @returns 邮箱信息,所有渠道均不可用时返回 null
46
48
  *
47
49
  * @example
48
50
  * ```ts
49
51
  * const emailInfo = await generateEmail({ channel: 'temp-mail-io' });
50
- * console.log(emailInfo.email); // 临时邮箱地址
52
+ * if (emailInfo) console.log(emailInfo.email);
51
53
  * ```
52
54
  */
53
- export declare function generateEmail(options?: GenerateEmailOptions): Promise<EmailInfo>;
55
+ export declare function generateEmail(options?: GenerateEmailOptions): Promise<EmailInfo | null>;
54
56
  /**
55
57
  * 获取邮件列表
58
+ * Channel/Email/Token 等由 SDK 从 EmailInfo 中自动获取,用户无需手动传递
56
59
  *
57
60
  * 错误处理策略:
58
- * - 网络错误、超时、服务端 5xx 错误 → 自动重试(默认 2 次)
61
+ * - 网络错误、超时、429、服务端 5xx 错误 → 自动重试(默认 2 次)
59
62
  * - 重试耗尽后返回 { success: false, emails: [] },不抛异常
60
- * - 参数校验错误(缺少 channel / token)直接抛出
63
+ * - 参数校验错误(缺少 EmailInfo)直接抛出
61
64
  *
62
- * 这种设计让调用方在轮询场景下不会因网络波动而中断整个流程,
63
- * 只需检查 success 字段即可判断本次请求是否成功。
64
- *
65
- * @param options - 获取选项,包含渠道、邮箱地址、令牌
65
+ * @param info - GenerateEmail() 返回的邮箱信息
66
+ * @param options - 可选配置(重试等)
66
67
  * @returns 邮件结果,包含 success 标记和邮件列表
67
68
  *
68
69
  * @example
69
70
  * ```ts
70
- * const result = await getEmails({
71
- * channel: emailInfo.channel,
72
- * email: emailInfo.email,
73
- * token: emailInfo.token,
74
- * });
71
+ * const info = await generateEmail({ channel: 'mail-tm' });
72
+ * const result = await getEmails(info);
75
73
  * if (result.success && result.emails.length > 0) {
76
74
  * console.log('收到邮件:', result.emails[0].subject);
77
75
  * }
78
76
  * ```
79
77
  */
80
- export declare function getEmails(options: GetEmailsOptions): Promise<GetEmailsResult>;
78
+ export declare function getEmails(info: EmailInfo, options?: GetEmailsOptions): Promise<GetEmailsResult>;
81
79
  /**
82
80
  * 临时邮箱客户端
83
81
  * 封装了邮箱创建和邮件获取的完整流程,自动管理邮箱信息和认证令牌
@@ -100,15 +98,16 @@ export declare class TempEmailClient {
100
98
  /**
101
99
  * 创建临时邮箱并缓存邮箱信息
102
100
  * 后续调用 getEmails() 时自动使用此邮箱的渠道、地址和令牌
101
+ * 所有渠道均不可用时返回 null
103
102
  */
104
- generate(options?: GenerateEmailOptions): Promise<EmailInfo>;
103
+ generate(options?: GenerateEmailOptions): Promise<EmailInfo | null>;
105
104
  /**
106
105
  * 获取当前邮箱的邮件列表
107
106
  * 必须先调用 generate() 创建邮箱
108
107
  *
109
108
  * @throws 未调用 generate() 时抛出异常
110
109
  */
111
- getEmails(): Promise<GetEmailsResult>;
110
+ getEmails(options?: GetEmailsOptions): Promise<GetEmailsResult>;
112
111
  /**
113
112
  * 获取当前缓存的邮箱信息
114
113
  * 未调用 generate() 时返回 null
@@ -121,5 +120,7 @@ declare const _default: {
121
120
  generateEmail: typeof generateEmail;
122
121
  getEmails: typeof getEmails;
123
122
  TempEmailClient: typeof TempEmailClient;
123
+ setConfig: typeof setConfig;
124
+ getConfig: typeof getConfig;
124
125
  };
125
126
  export default _default;