API 文档
给注册机、多线程脚本和外部服务调用的邮箱池接口。
AI 快速接入
把下面这段直接给 AI 或自动化脚本即可。它包含最小配置、固定调用顺序和禁止事项。
你要接入 MailOps 邮箱池 API。
BASE_URL = "https://gptmail.passkissyou.online"
API_KEY = "mak_xxx"
CATEGORY = "safe"
CONCURRENCY = 5 # 注册机并发数;每个 worker 都必须单独调用 reserve
CODE_KEYWORD = "code,验证码,verification code,OpenAI,ChatGPT,gpt"
所有请求都带:
Authorization: Bearer API_KEY
Content-Type: application/json
固定流程:
1. 领取邮箱,只能用:
POST {BASE_URL}/api/mailboxes/reserve
body: {"category":CATEGORY,"consume":true}
2. 如果返回 email 为空,表示邮箱池耗尽,停止本轮注册。
3. 使用返回的 email 去目标系统提交绑定邮箱。
4. 等待 10-20 秒后查询验证码:
GET {BASE_URL}/api/mail/code?email={email}&keyword={CODE_KEYWORD}&limit=10&folders=inbox,junk
5. 如果 found=false,继续间隔轮询,不要重新领取新邮箱,除非本次注册流程已经判定失败。
重要限制:
- 不要用 GET /api/mailboxes 来分配邮箱,它只是查看列表。
- 并发注册必须用 reserve;并发数不通过 API 传,而是在注册机线程/任务数里配置。
- 每个并发 worker 一次注册只领取一次邮箱,不能多个 worker 共享同一个 email。
- 默认 consume=true,邮箱返回前已被服务器标记 used,不会再次从 safe 池发出。
- 验证码关键词优先填 code/验证码/verification code,其次才是 OpenAI/ChatGPT/gpt。
- 本地 used_emails.json 只能当日志,不是防重复主逻辑。
机器可读规格:/api-spec.json
接入步骤
- 管理员登录控制台,导入 Outlook/Hotmail 资产,并完成可读性扫描分类。
- 确认要消费的邮箱在目标分类里,默认推荐
safe。 - 进入 API 中心生成
mak_...API Key。Key 只完整显示一次,必须立即保存到注册机配置里。 - 注册机配置
base_url、api_key、category、keyword、并发数和验证码轮询参数。 - 每个注册 worker 都通过
POST /api/mailboxes/reserve领取唯一邮箱,不要用列表接口分配邮箱。 - 提交绑定邮件后,只对刚领取的这个邮箱调用
GET /api/mail/code轮询验证码。 - 最终收不到码时,调用
POST /api/mailboxes/report-code上报timeout,后台会把邮箱隔离到no_code。
基础配置
先确定注册机在哪里运行,再选择 base_url。这个值最容易填错。
| 注册机位置 | base_url 填写 | 说明 |
|---|---|---|
| 和后台在同一台电脑/NAS 容器内部 | http://127.0.0.1:8009 | 只适合同机访问。 |
| 局域网其他机器 | http://192.168.6.35:8009 | NAS 局域网地址,速度最快,但只在内网可用。 |
| 公网机器或外部 VPS | https://gptmail.passkissyou.online | 走公网反代和 HTTPS,注册机不在你内网时用这个。 |
所有 API 请求都要携带:
Authorization: Bearer mak_xxx Content-Type: application/json
浏览器控制台登录用账号密码;注册机和外部脚本只使用 Bearer API Key,不需要也不应该处理登录 Cookie。
注册机推荐配置模板:
{
"email_provider": "mailmanage",
"mailmanage": {
"base_url": "https://gptmail.passkissyou.online",
"api_key": "mak_xxx",
"category": "safe",
"keyword": "code,验证码,verification code,OpenAI,ChatGPT,gpt",
"folders": "inbox,junk",
"consume": true,
"poll_interval_seconds": 8,
"poll_timeout_seconds": 180
},
"concurrency": 5
}
注册机填写项
按当前后台接入 MailManage 时,注册机只需要填写下面这些项。邮箱账号、client_id、refresh_token 只导入到本后台,不要填进注册机。
| 注册机字段 | 应该填写 | 说明 |
|---|---|---|
| 邮箱提供商 | MailManage | 选择本后台邮箱池。 |
| MailManage Base URL | https://gptmail.passkissyou.online | 公网注册机用这个;同机测试才用 http://127.0.0.1:8009。 |
| MailManage API Key | mak_xxx | 在本后台 API 中心生成,完整 Key 只显示一次。 |
| MailManage 分类 | safe | 注册推荐用 safe。不要填 used;free/套餐只用于特殊策略。 |
| MailManage 关键词 | code,验证码,verification code,OpenAI,ChatGPT,gpt | 验证码邮件过滤词。优先包含 code/验证码/verification code,避免只填 gpt 时漏掉“Your verification code”这类邮件。 |
| 并发数 | 3-10 | 这是注册机线程/任务数,不是 API 参数。每个并发 worker 都调用一次 reserve,后台保证唯一邮箱。 |
| 验证码轮询间隔 | 8-10 秒 | 每次轮询同一个 email,不要没找到就重新领取。 |
| 验证码超时 | 180-300 秒 | 最终超时后调用 /api/mailboxes/report-code 上报 timeout。 |
| 绑定邮箱 | 留空 | 必须留空,注册机才会每次从 MailManage 原子领取唯一邮箱。 |
| 绑定失败释放回 safe 池 | 默认关闭 | 关闭最稳,失败也消耗邮箱。确认失败不会污染邮箱时再开启。 |
| 失败回收租约秒数 | 1800 | 只在开启失败回收时使用。 |
配置对照
如果你之前按原 MailManage 页面配置过注册机,迁移到本地后台时主要差异如下。
| 配置项 | 原站常见配置 | 本地后台配置 | 说明 |
|---|---|---|---|
| 邮箱提供商 | MailManage | MailManage | 保持一致。 |
| API Key | mak_xxx | mak_xxx | 在本地 API 中心重新生成,不能直接假设原站 Key 可用。 |
| Base URL | https://mailmanage.lizaliza.top | https://gptmail.passkissyou.online 或 http://127.0.0.1:8009 | 这是最容易漏的项。注册机必须指向本后台,不要再指向原站。 |
| 分类 | safe / free / 套餐 | safe / free / 套餐 / used | 注册机通常填 safe。used 只用于查看已消费邮箱。 |
| 关键词 | gpt | code,验证码,verification code,OpenAI,ChatGPT,gpt | 新配置更稳:先按验证码词命中,再兼容 OpenAI/ChatGPT/gpt。 |
| 并发 | 由注册机线程数决定 | 仍由注册机线程数决定 | API 没有 concurrency 参数。并发 5 就是 5 个 worker 同时各调用一次 reserve。 |
| 领取方式 | 常见是列表取一个邮箱 | POST /api/mailboxes/reserve | 本地后台默认领取即 used,专门防并发重复。 |
| 已用处理 | 可能依赖本地 used 文件或成功后 mark | 服务器领取时已标记 used | 本地 used 文件只是日志,不是主防线。 |
推荐流程
并发注册时,用领取即消费模式。邮箱返回前,后台已经把它改成 used,所以页面不刷新、本地 used 文件写入失败、程序重启,都不会重复发出同一个 safe 邮箱。
POST /api/mailboxes/reserve
{"category":"safe","consume":true}
{
"ok": true,
"email": "user@hotmail.com",
"consumed": true,
"mailbox": {
"email": "user@hotmail.com",
"category": "used",
"status": "used",
"used": 1,
"reserved": 0
}
}
然后轮询验证码:
GET /api/mail/code?email=user@hotmail.com&keyword=code,验证码,verification code,OpenAI,ChatGPT,gpt&limit=10&folders=inbox,junk
防重复机制
只要注册机用 POST /api/mailboxes/reserve 且 consume=true,邮箱会在返回给注册机之前自动离开 safe 池。这个动作发生在数据库事务里,不依赖网页刷新,也不依赖本地 used_emails.json。
| 阶段 | 数据库状态 | 效果 |
|---|---|---|
| 领取前 | category=safe, used=0, reserved=0 | 可以被 safe 池领取。 |
| reserve 返回前 | category=used, status=used, used=1, reserved=0 | 已经从 safe 池剔除。 |
| 后续并发领取 | 查询条件会排除 used=1 | 不会再把这个邮箱发给其他 worker。 |
如果你开启 consume=false 租约模式,邮箱不会立刻变成 used,而是进入 reserved 状态;成功后必须调用 mark-used,失败后按策略调用 release。高并发注册默认不要用租约模式。
历史 used 复查
如果早期规则误把账号归到 used,不要把 used 混进 safe 自动扫描,也不要自动全部恢复。控制台提供 复查全部 used,会复查所有历史已用池,不是只扫当前页;复查后仍保持 used,确认是误判后再多选账号点 恢复选中为 safe。
| 动作 | 用途 | 是否重新进入 safe 池 |
|---|---|---|
复检 safe | 日常维护,只扫描可分配邮箱。 | 原本就在 safe。 |
复查全部 used | 排查历史误判,允许扫描所有 used=1 的邮箱。 | 不会自动恢复。 |
恢复选中为 safe | 人工确认后,把选中账号清除 used/reserved/lease 并重置收码健康。 | 会重新进入 safe。 |
并发配置
并发不是填给 MailOps API 的参数,而是注册机自己的 worker/线程/任务数量。MailOps 只负责保证每个 worker 通过 reserve 拿到的邮箱唯一。
| 场景 | 推荐值 | 说明 |
|---|---|---|
| 刚开始实测 | 3 | 先确认验证码、注册流程和失败上报都正常。 |
| 稳定跑批 | 5-10 | 邮箱 API、目标站、网络都稳定后再提高。 |
| 大量并发 | 10+ | 可以领唯一邮箱,但目标站发码和 Outlook 刷新可能限速,建议逐步加。 |
worker_1 -> POST /api/mailboxes/reserve -> email A -> 只轮询 email A 的验证码 worker_2 -> POST /api/mailboxes/reserve -> email B -> 只轮询 email B 的验证码 worker_3 -> POST /api/mailboxes/reserve -> email C -> 只轮询 email C 的验证码
不要先 GET /api/mailboxes 拉一批邮箱再在本地分配;多进程、多机器或重启时很容易重复。所有并发 worker 都必须即时调用 POST /api/mailboxes/reserve。
验证码关键词
关键词不是最终验证码,验证码仍然由系统从邮件正文里提取 4-8 位数字。关键词只是先筛选“哪封邮件可能是验证码邮件”。
| 优先级 | 关键词 | 用途 |
|---|---|---|
| 最高 | code,验证码,verification code | 最直接命中验证码邮件标题和正文。 |
| 高 | OpenAI,ChatGPT | 命中发件服务或产品名。 |
| 兼容 | gpt | 兼容原 MailManage 配置,但单独使用可能漏掉只写 verification code 的邮件。 |
| 调试 | 留空 | 不按关键词过滤,只从最新邮件里提取数字,容易误读旧码,不建议实战默认使用。 |
使用推荐组合时,系统会同时要求“服务词”与“验证码词”命中:例如 OpenAI/ChatGPT/gpt 加上 code/验证码/verification code。只有普通 code 和数字、不含 OpenAI/ChatGPT/gpt 的邮件不会被当成验证码。
推荐: GET /api/mail/code?email=user@hotmail.com&keyword=code,验证码,verification code,OpenAI,ChatGPT,gpt&limit=10&folders=inbox,junk 兼容旧配置: GET /api/mail/code?email=user@hotmail.com&keyword=gpt&limit=10
接口总览
| 方法 | 路径 | 用途 | 注册机是否推荐 |
|---|---|---|---|
| POST | /api/mailboxes/reserve | 并发安全领取邮箱 | 推荐 |
| GET | /api/mail/code | 查询验证码 | 推荐 |
| GET | /api/mail/{email} | 兼容原站旧文档的验证码查询写法 | 兼容 |
| POST | /api/mailboxes/mark-used | 标记已用,租约模式成功后调用 | 可选 |
| POST | /api/mailboxes/release | 释放未消费租约 | 租约模式可用 |
| POST | /api/gpt-accounts/report | 注册机上报成功/失败的 GPT 账号 | 推荐 |
| GET | /api/mailboxes | 查看邮箱列表 | 不要用于分配 |
| POST | /api/gpt-accounts/export | 把已选 GPT 账号打包导出为 Sub2 或 CPA 压缩包 | 后台操作 |
领取邮箱
POST /api/mailboxes/reserve
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
category | string | safe | 领取哪个分类的邮箱,例如 safe、free、套餐。 |
status | string | 空 | 可选,进一步按状态过滤。 |
consume | boolean | true | 推荐 true。返回邮箱前直接标记 used。 |
lease_seconds | number | 1800 | 仅 consume=false 时有意义。 |
curl -X POST "https://gptmail.passkissyou.online/api/mailboxes/reserve" ^
-H "Authorization: Bearer mak_xxx" ^
-H "Content-Type: application/json" ^
-d "{\"category\":\"safe\",\"consume\":true}"
无可用邮箱时:
{"ok":true,"mailbox":null,"email":"","reason":"no_available","error":"no available mailbox"}
租约模式
如果你想“失败后释放回池”,可以关闭领取即消费。这个模式会返回 lease_token,成功后 mark-used,失败后 release。高并发注册默认不建议用它,因为失败释放策略要由调用方管理。
POST /api/mailboxes/reserve
{"category":"safe","consume":false,"lease_seconds":1800}
POST /api/mailboxes/mark-used
{"email":"user@hotmail.com","lease_token":"returned_token"}
POST /api/mailboxes/release
{"email":"user@hotmail.com","lease_token":"returned_token"}
注册机如何知道失败:Phase2 绑定/上传结束后会得到 oauth_result.ok。成功时调用 mark-used;失败时如果开启“绑定失败释放回 safe 池”,注册机会调用 release。默认关闭失败回收,因为某些失败代表邮箱本身不可用或已经注册,回池后可能反复失败。若进程异常退出没有 release,租约到期后后台会自动释放,默认 1800 秒。
查询验证码
GET /api/mail/code?email=user@hotmail.com&keyword=code,验证码,verification code,OpenAI,ChatGPT,gpt&limit=10&folders=inbox,junk
兼容原站旧文档写法:GET /api/mail/user@hotmail.com&keyword=gpt&limit=10。新项目推荐继续使用上面的标准 query 写法。
| 参数 | 默认 | 说明 |
|---|---|---|
email | 必填 | 刚领取到的邮箱。 |
keyword | 空 | 邮件关键词。推荐 code,验证码,verification code,OpenAI,ChatGPT,gpt;推荐组合会同时匹配服务词和验证码词,再提取 4-8 位数字验证码,避免普通 code 邮件误判。 |
limit | 10 | 实时拉取并检查最近多少封邮件,最大 50。 |
refresh | 1 | 默认实时刷新 Outlook/Hotmail 后再提码。传 0 时只读本地缓存。 |
folders | inbox,junk | 默认同时检查收件箱和垃圾箱,避免误判“没收到码”。 |
include_old | 0 | 默认只认领取/预留之后的新验证码,防止老验证码被误读。调试历史邮件时才传 1。 |
curl -H "Authorization: Bearer mak_xxx" "https://gptmail.passkissyou.online/api/mail/code?email=user@hotmail.com&keyword=code,验证码,verification code,OpenAI,ChatGPT,gpt&limit=10&folders=inbox,junk"
每次 found=false 都会被后台记为一次真实收码未命中。默认 6 次未命中或连续 120 秒仍没有验证码时,后台自动把邮箱标记为 no_code,从后续 safe 领取池排除。
{
"ok": true,
"email": "user@hotmail.com",
"code": "123456",
"found": true,
"category": "used",
"refreshed": true,
"refresh_error": "",
"code_health": "healthy",
"poll_count": 0,
"quarantined": false,
"message": {
"subject": "...",
"from_addr": "...",
"body_preview": "..."
}
}
收码失败上报
扫描历史邮件不能证明邮箱未来一定能收到验证码。可靠判定来自真实注册发码:如果多次轮询收件箱和垃圾箱仍没有验证码,后台会自动隔离;注册机最终超时时仍应上报一次,便于立即写入失败原因。
POST /api/mailboxes/report-code
{"email":"user@hotmail.com","result":"timeout","detail":"300s 内未收到验证码"}
| 字段 | 说明 |
|---|---|
result | success 表示收到码;pending 表示一次轮询未命中;timeout / no_code 表示最终没收到码。 |
threshold | 失败多少次后隔离,默认 1。注册机实战默认 1 次,因为发码已经经过轮询和重发。 |
lease_token | 租约模式可带上;领取即消费模式不需要。 |
隔离后的邮箱会显示在 no_code 分类;普通 safe 查询和 reserve 领取会自动跳过。
GPT 账号上报
注册机完成一次账号流程后,把结果上报到 /api/gpt-accounts/report。这个接口不影响邮箱领取、收码、扫描链路,只负责把注册结果沉淀到“GPT账号”仓库,后续可以按 Sub2 或 CPA 格式导出。
POST /api/gpt-accounts/report Authorization: Bearer mak_xxx Content-Type: application/json
| 字段 | 必填 | 说明 |
|---|---|---|
dedupe_key | 推荐 | 幂等键。建议用注册批次 + 登录邮箱;同一个键重复上报会更新同一条记录,不会生成重复账号。 |
result | 是 | success、partial、failed。成功进入待导出,失败进入失败/异常池。 |
stage | 否 | 注册机当前阶段,例如 registered、sub2_uploaded、bind_failed。 |
email | 推荐 | 本次消耗的邮箱,用于和邮箱池对账。 |
account | 推荐 | 账号主体,支持 email、password、phone、proxy、batch_id 等字段。 |
tokens | 按需 | 刷新凭证或会话字段,例如 refresh_token、access_token、expires_at。 |
chatgpt | 按需 | ChatGPT 侧信息,例如 plan、account_id、team_id。 |
sub2 | 按需 | Sub2 上传结果,例如 id、group、proxy_id。 |
auth_file | 推荐 | CPA/CLIProxyAPI 可直接使用的完整 auth JSON。注册机如果已经拿到 access_token、refresh_token、id_token、session_token,建议完整上报。 |
cpa | 按需 | 可放 {"ready":true,"auth_file":{...}};缺字段时仍可入库,但会标记为待补全。 |
error | 失败时 | 失败原因。系统会粗分为验证码、代理、账号密码、风控、Sub2、CPA、未知等类别。 |
{
"dedupe_key": "batch-001:user@example.com",
"result": "success",
"stage": "sub2_uploaded",
"email": "mailbox@outlook.com",
"account": {
"email": "user@example.com",
"password": "account_password",
"proxy": "http://127.0.0.1:7892",
"batch_id": "batch-001"
},
"tokens": {
"refresh_token": "rt_xxx",
"expires_at": 1790000000
},
"chatgpt": {
"plan": "free",
"account_id": "acct_xxx"
},
"sub2": {
"id": "sub2_account_id",
"group": "测试生图"
},
"auth_file": {
"type": "codex",
"email": "user@example.com",
"access_token": "at_xxx",
"refresh_token": "rt_xxx",
"id_token": "id_xxx",
"session_token": "sess_xxx",
"chatgpt_account_id": "acct_xxx",
"chatgpt_plan_type": "free"
},
"cpa": {
"ready": true
}
}
状态流转规则:success 进入 待导出,partial 进入 异常待处理,failed 进入 注册失败。导出成功后可自动标记 已导出,也可以在页面手动归档。
GPT 账号导出
导出在后台“GPT账号”页面操作:跨页勾选账号后选择 Sub2 或 CPA。系统会下载 sub2-数量.zip 或 cpa-数量.zip,压缩包内包含目标平台 JSON、完整账号信息 JSON、账号 CSV 和 manifest。导出成功后默认标记为 已导出,避免同一批账号重复对账。
POST /api/gpt-accounts/export
Content-Type: application/json
{
"ids": [1, 2, 3],
"format": "sub2",
"mark_exported": true
}
| 格式 | 产物 | 适用场景 |
|---|---|---|
sub2 | ZIP,内含 sub2.json、accounts-full.json、accounts.csv、manifest.json | 导入 Sub2 / Sub2API 账号仓库,同时保留完整账号资料。 |
cpa | ZIP,内含 cpa.json、accounts-full.json、accounts.csv、manifest.json | 给 CPA/CLIProxyAPI 或后续刷新工作台使用,同时保留完整账号资料。 |
GPT 工作台
MailOps 保留现有邮箱池核心功能,同时把参考项目的后续能力合并到后台 GPT账号 页面。所有操作都在当前后台完成,不需要跳转到参考项目旧页面。
| 后台模块 | 作用 | 关键配置 |
|---|---|---|
| 账号仓库 | 接收注册机上报、手动导入 GPT 账号、跨页选择、导出 Sub2/CPA。 | 注册机成功后调用 /api/gpt-accounts/report。 |
| 凭证刷新 | 同步 MailOps 邮箱 OAuth 凭证,按选中 GPT 账号逐个执行 OpenAI OAuth 登录刷新,并生成 CPA auth JSON。 | 必须填写 NAS/服务器可访问 ChatGPT/OpenAI 的代理;可选 CPA 地址和管理 Key,填写后刷新成功自动上传。 |
| CPA 仓管 | 扫描 CPA/CLIProxyAPI auth 仓库,诊断 401、RT 失效、封禁、风控、额度异常,可删除异常凭证或加入刷新。 | 填写 CPA 管理地址和管理 Key;可选代理探测。 |
| Session 转换 | 把 ChatGPT Web Session 转为 Sub2、CPA、Cockpit、9router、AxonHub、Codex-Manager JSON,并可导入 GPT 仓库。 | 只做格式转换,不读取邮箱池。 |
| 规则与手机池 | 维护错误分类规则和长效手机接码 API,给后续异常处理和手机验证留痕。 | 手机接码 API 可在刷新工作台填写或从手机池记录。 |
NAS 部署时这些刷新和巡检动作从 NAS 发起请求,VPS 只负责公网 HTTPS 转发,不负责访问 ChatGPT/OpenAI。若 NAS 使用 Clash,代理应填 NAS 容器可访问的代理地址,例如宿主机局域网 IP + HTTP/SOCKS 端口。
后台桥接接口只给网页登录后的控制台使用,不给注册机直接使用:/api/gpt-workbench/sync-mailboxes、/api/gpt-workbench/proxy-check、/api/gpt-workbench/refresh-start、/api/gpt-workbench/refresh-status、/api/gpt-workbench/cpa-scan、/api/gpt-workbench/cpa-delete。
列表查询
GET /api/mailboxes 只用于查看,不用于并发分配。默认排除 used=1、reserved=1 和 no_code 收码异常邮箱。
GET /api/mailboxes?category=safe&page=1&limit=100 GET /api/mailboxes?category=used GET /api/mailboxes?search=hotmail&include_used=1&include_reserved=1
| 参数 | 说明 |
|---|---|
category | 按分类筛选。 |
status | 按状态筛选。 |
search | 搜索邮箱、标签或原因。 |
page / limit | 分页。 |
include_used | 设为 1 时包含已用邮箱。 |
include_reserved | 设为 1 时包含已预留邮箱。 |
include_unhealthy | 设为 1 时包含收码异常邮箱;查看 category=no_code 时会自动包含。 |
Python 示例
import time
import requests
BASE_URL = "https://gptmail.passkissyou.online"
API_KEY = "mak_xxx"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
r = requests.post(
f"{BASE_URL}/api/mailboxes/reserve",
headers=HEADERS,
json={"category": "safe", "consume": True},
timeout=30,
).json()
if not r.get("email"):
raise RuntimeError("没有可用邮箱")
email = r["email"]
# 这里提交绑定邮箱给目标系统,然后等待邮件进入缓存
time.sleep(15)
code = requests.get(
f"{BASE_URL}/api/mail/code",
headers=HEADERS,
params={"email": email, "keyword": "code,验证码,verification code,OpenAI,ChatGPT,gpt", "limit": 10, "folders": "inbox,junk"},
timeout=30,
).json()
print(email, code.get("code"))
错误处理
| 状态 | 含义 | 处理 |
|---|---|---|
| 401 | API Key 缺失或错误 | 检查 Authorization。 |
| 404 | 邮箱不存在或接口不存在 | 确认 base_url 指向本后台。 |
| 409 | 扫描或并发状态冲突 | 稍后重试。 |
200 + email="" | 目标分类已耗尽 | 补充邮箱或换分类。 |
200 + found=false | 暂未找到验证码 | 继续轮询或重新扫描邮箱。 |