Files
outlookEmailPlus/注册与邮箱池接口文档.md

447 lines
9.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 注册机接入与邮箱池 API 文档
## 📖 概览 Overview
本文档描述邮箱池管理系统的公开 API,供注册机业务方、脚本接入方使用。
**服务定位**:为注册机提供邮箱领取、状态回传、池管理等功能。
**数据格式**:所有请求和响应均使用 JSON 格式。
**支持 CORS**:支持跨域请求。
---
## 🔐 鉴权与通用规则
### API Key 获取
联系系统管理员获取 API Key,在请求头中携带:
```
Authorization: Bearer YOUR_API_KEY
```
**测试环境**:联系管理员获取测试 Key(调用限制:100 次/分钟)
### 统一响应格式
所有接口遵循统一的响应格式:
```json
{
"success": true,
"data": { ... },
"message": "操作成功"
}
```
失败时:
```json
{
"success": false,
"error": "error_code",
"message": "错误描述"
}
```
### 时间字段约定
所有时间字段使用 ISO 8601 格式:`YYYY-MM-DDTHH:MM:SSZ`
---
## 📋 API 端点列表
### 快速开始
注册机接入只需关注以下 3 个核心接口:
| 接口 | 用途 | 必要性 |
|------|------|--------|
| `POST /api/pool/claim-random` | 领取邮箱 | 必需 |
| `POST /api/pool/claim-complete` | 完成任务回传 | 必需 |
| `POST /api/pool/claim-release` | 释放邮箱 | 必需 |
| `GET /api/pool/stats` | 查看池状态 | 可选 |
---
## 1️⃣ 领取邮箱
### 基本信息
```
POST /api/pool/claim-random
需要鉴权:是
```
### 请求示例
```bash
curl -X POST https://api.example.com/api/pool/claim-random \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"caller_id": "register-worker-1",
"task_id": "job-20260317-0001",
"provider": "outlook"
}'
```
### 参数说明
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `caller_id` | string | 是 | 调用方标识,建议使用固定的业务方标识或机器标识,如:`register-worker-1`、`register-cluster-a` |
| `task_id` | string | 是 | 当前注册任务的唯一 ID,如:`job-20260317-0001`、`order-928371` |
| `provider` | string | 否 | 邮箱提供商筛选,传 `outlook` 则只领取 Outlook 邮箱 |
### 成功响应示例
```json
{
"success": true,
"data": {
"account_id": 12,
"email": "demo@outlook.com",
"claim_token": "clm_xxxxx",
"lease_expires_at": "2026-03-17T10:00:00Z"
},
"message": "邮箱领取成功"
}
```
### 响应字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `account_id` | integer | 账号 ID,回传时必需 |
| `email` | string | 邮箱地址 |
| `claim_token` | string | 领取令牌,回传时必需 |
| `lease_expires_at` | string | 租约过期时间,过期前需完成回传或释放 |
### 失败响应示例
```json
{
"success": false,
"error": "no_available_account",
"message": "池中没有符合条件的可用邮箱"
}
```
---
## 2️⃣ 完成任务并回传结果
### 基本信息
```
POST /api/pool/claim-complete
需要鉴权:是
```
### 请求示例
```bash
curl -X POST https://api.example.com/api/pool/claim-complete \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_id": 12,
"claim_token": "clm_xxxxx",
"caller_id": "register-worker-1",
"task_id": "job-20260317-0001",
"result": "success",
"detail": "注册成功"
}'
```
### 参数说明
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `account_id` | integer | 是 | 领取时返回的账号 ID |
| `claim_token` | string | 是 | 领取时返回的令牌 |
| `caller_id` | string | 是 | 必须与领取时的 `caller_id` 一致 |
| `task_id` | string | 是 | 必须与领取时的 `task_id` 一致 |
| `result` | string | 是 | 任务结果,见下方【result 可选值】 |
| `detail` | string | 否 | 详细说明,建议填写失败原因、目标站名称、风控现象等 |
### result 可选值及对应状态
| result 值 | 说明 | 邮箱最终状态 | 使用场景 |
|-----------|------|--------------|----------|
| `success` | 注册成功,账号已消耗 | `used` | 成功完成注册任务 |
| `verification_timeout` | 未收到验证码 | `cooldown` | 长时间未收到验证码,建议冷却后再试 |
| `provider_blocked` | 被供应商风控 | `frozen` | 供应商风控、被封、被限制 |
| `credential_invalid` | 凭据失效 | `retired` | 邮箱密码或凭据已失效 |
| `network_error` | 网络故障 | `available` | 网络问题、临时故障,可立即重试 |
### 成功响应示例
```json
{
"success": true,
"data": {
"account_id": 12,
"pool_status": "used"
},
"message": "结果回传成功"
}
```
### 失败响应示例
```json
{
"success": false,
"error": "invalid_claim",
"message": "claim_token 已失效或与 account_id 不匹配"
}
```
---
## 3️⃣ 释放邮箱
### 基本信息
```
POST /api/pool/claim-release
需要鉴权:是
```
### 请求示例
```bash
curl -X POST https://api.example.com/api/pool/claim-release \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_id": 12,
"claim_token": "clm_xxxxx",
"caller_id": "register-worker-1",
"task_id": "job-20260317-0001",
"reason": "任务取消"
}'
```
### 参数说明
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `account_id` | integer | 是 | 领取时返回的账号 ID |
| `claim_token` | string | 是 | 领取时返回的令牌 |
| `caller_id` | string | 是 | 必须与领取时一致 |
| `task_id` | string | 是 | 必须与领取时一致 |
| `reason` | string | 否 | 释放原因 |
### 成功响应示例
```json
{
"success": true,
"data": {
"account_id": 12,
"pool_status": "available"
},
"message": "邮箱已释放回池"
}
```
---
## 4️⃣ 查看池状态
### 基本信息
```
GET /api/pool/stats
需要鉴权:是
```
### 请求示例
```bash
curl -X GET https://api.example.com/api/pool/stats \
-H "Authorization: Bearer YOUR_API_KEY"
```
### 成功响应示例
```json
{
"success": true,
"data": {
"total": 1000,
"available": 850,
"claimed": 120,
"used": 20,
"cooldown": 5,
"frozen": 3,
"retired": 2
},
"message": "查询成功"
}
```
---
## ⚠️ 错误处理
### HTTP 状态码一览
| 状态码 | 说明 |
|--------|------|
| 200 | 请求成功 |
| 400 | 请求参数错误 |
| 401 | 未授权(缺少或无效的 API Key) |
| 403 | 禁止访问 |
| 404 | 资源不存在 |
| 429 | 请求频率超限 |
| 500 | 服务器内部错误 |
### 常见错误响应
#### 缺少 API Key
```json
{
"success": false,
"error": "missing_api_key",
"message": "请在请求头中携带 Authorization: Bearer YOUR_API_KEY"
}
```
#### 请求频率超限
```json
{
"success": false,
"error": "rate_limit_exceeded",
"message": "请求频率超限,请稍后重试"
}
```
#### 无可用邮箱
```json
{
"success": false,
"error": "no_available_account",
"message": "池中没有符合条件的可用邮箱"
}
```
#### claim_token 不匹配
```json
{
"success": false,
"error": "invalid_claim",
"message": "claim_token 已失效或与 account_id 不匹配"
}
```
---
## 📝 使用限制
### 频率限制
- 领取邮箱:60 次/分钟
- 回传结果:120 次/分钟
- 查询状态:300 次/分钟
### 租约超时
领取邮箱后,必须在 `lease_expires_at` 前完成回传或释放。超时未处理的邮箱将自动释放回池。
### 建议重试策略
- 遇到 `429` 错误时,等待 1 秒后重试
- 遇到 `no_available_account` 时,等待 5-10 秒后重试
- 建议使用指数退避算法
---
## 🔄 业务流程图
```
导入邮箱(add_to_pool=true)
↓
邮箱进入池子(status=available)
↓
注册机调用 claim-random 领取邮箱
↓
注册机执行注册任务
↓
┌────┴────┐
↓ ↓
成功/失败 中途放弃
↓ ↓
claim-complete claim-release
↓ ↓
邮箱状态更新 邮箱返回池子
```
---
## 🎯 常见问题
### Q1: 账号导入了,但注册机领不到?
**原因**:
1. 导入时没有设置 `add_to_pool=true`
2. 账号状态不是 `active` 或不在 `available`
**解决**:检查导入参数,确保账号正确入池。
### Q2: 回传时提示参数不匹配?
**原因**:`account_id`、`claim_token`、`caller_id`、`task_id` 四个字段必须与领取时完全一致。
**解决**:注册机必须保存领取时的原始参数,不能自行修改。
### Q3: 领取后忘记回传会怎样?
**后果**:邮箱会停留在 `claimed` 状态,影响后续分配。
**建议**:
- 成功或失败都调用 `claim-complete`
- 中途放弃调用 `claim-release`
### Q4: 所有失败都回传 `network_error` 会怎样?
**后果**:已失效的邮箱会继续回池,被重复分配,浪费资源。
**建议**:根据实际失败原因选择正确的 `result` 值。
---
## 📞 联系方式
- 问题反馈:[提交 Issue]
---
## 📅 更新日志
### v1.0.0 (2026-03-17)
- 初始版本发布
- 支持邮箱领取、回传、释放、查询功能
---
## 外部接口路径
如果通过外部受控接口调用,路径对应为:
- `/api/external/pool/claim-random`
- `/api/external/pool/claim-complete`
- `/api/external/pool/claim-release`
- `/api/external/pool/stats`
业务含义与内部接口完全一致。