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。高并发注册默认不要用租约模式。
并发配置
并发不是填给 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 的邮件。 |
| 调试 | 留空 | 不按关键词过滤,只从最新邮件里提取数字,容易误读旧码,不建议实战默认使用。 |
推荐: 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 | 释放未消费租约 | 租约模式可用 |
| GET | /api/mailboxes | 查看邮箱列表 | 不要用于分配 |
领取邮箱
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 位数字验证码。 |
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 领取会自动跳过。
列表查询
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 | 暂未找到验证码 | 继续轮询或重新扫描邮箱。 |