[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93964":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":16,"lastSyncTime":29,"discoverSource":30},93964,"OutlookManage","daimon3332\u002FOutlookManage","daimon3332","Outlook\u002FHotmail local account management WebUI supports batch account import, status detection (alive\u002Fbanned), token refresh and synchronization.Outlook \u002F Hotmail 本地账号管理 WebUI，支持账号批量导入、状态检测（存活\u002F封禁）、令牌刷新与同步。","",null,"Python",108,10,1,0,2,6,45.32,false,"main",true,[23,24,25,26],"hotmail","mail-manager","microsoft","outlook","2026-07-30 04:02:14","# Outlook Manage\n\nOutlook \u002F Hotmail 本地账号管理 WebUI。以 **SQLite 为唯一权威数据源**，覆盖：\n\n- 账号导入（文本 \u002F 文件 \u002F 注册产出 `oauth2.txt`）\n- 协议测试（Graph \u002F IMAP \u002F POP \u002F SMTP）\n- Token 刷新与轮换落库\n- 健康分类与微软错误码中文化（含 `service abuse mode` 等）\n- 后台批量任务（并发可调、实时进度、原因聚合、**硬取消**）\n- 按邮箱后缀路由，同步到远程 OutlookEmail 池\n- 可选 ABUSE 恢复（临时邮箱 + 浏览器解封 + 重新授权）\n\n## 相关项目\n\n- **[OutlookRegister](https:\u002F\u002Fgithub.com\u002Fdaimon3332\u002FOutlookRegister) — 账号注册。** 自动注册 Outlook \u002F Hotmail 账号，并获取 Microsoft Graph OAuth2 `refresh_token`。\n- **[Outlook OAuth GetToken](https:\u002F\u002Fgithub.com\u002Fdaimon3332\u002FOutlook-Oauth-GetToken) — 单独获取令牌。** 为已有微软邮箱单独完成 OAuth2 授权并获取 `refresh_token`。\n\n## 环境准备\n\n```bash\npip install -r requirements.txt\n```\n\n可选（仅 ABUSE 恢复 \u002F 浏览器解封需要）：\n\n```bash\npatchright install chromium\n# 或 playwright install chromium\n```\n\n协议测试建议配置可用 HTTP 代理（IMAP\u002FPOP\u002FSMTP 经代理更稳）。\n\n## 快速开始\n\n1. 复制配置并编辑密钥（**不要提交真实 `config.json`**）：\n\n```bash\ncopy config.example.json config.json\n# Linux \u002F macOS:\n# cp config.example.json config.json\n```\n\n2. 按需修改 `config.json`：代理、远程池地址\u002F密码、域名分组 ID、临时邮箱、协议测试收件人等。**仓库与示例里不包含真实密钥、邮箱或分组号。**\n\n3. 启动：\n\n```bash\npython -m uvicorn backend.main:app --host 127.0.0.1 --port 18080\n```\n\n4. 浏览器打开 \u003Chttp:\u002F\u002F127.0.0.1:18080>\n\n依赖：FastAPI · uvicorn · requests · PySocks · python-multipart；恢复流程另需 playwright \u002F patchright。\n\n## 目录结构\n\n```text\nOutlookManage\u002F\n  backend\u002F\n    main.py                 # FastAPI 入口与批量任务 API\n    db.py                   # SQLite schema \u002F 连接\n    services\u002F\n      diagnostics.py        # AADSTS \u002F 健康分类\n      jobs.py               # 后台任务与硬取消\n      protocols.py          # 协议测试调度（可杀子进程）\n      remote_pool.py        # 远程池登录 \u002F 导入 \u002F token 同步\n      abuse_recovery.py     # ABUSE 恢复\n      oauth_reauth.py       # 重新授权\n      temp_mail.py          # 临时邮箱客户端\n      locks.py              # 账号级锁\n  frontend\u002F\n    index.html\n    app.js\n    styles.css\n    logo.svg\n  tests\u002F\n    test_hardening.py\n  data\u002F                     # 运行时数据库（gitignore）\n  logs\u002F                     # 运行日志（gitignore）\n  test_protocols.py         # 协议测试脚本（子进程 \u002F 同进程）\n  config.example.json       # 配置模板（可提交）\n  config.json               # 本地真实配置（勿提交）\n  requirements.txt\n  README.md\n  scope.md                  # Graph\u002FIMAP\u002FPOP\u002FSMTP scope 说明\n```\n\n## 完整使用流程\n\n```text\n① 注册（OutlookRegister）→ Results\u002Foauth2.txt\n② 导入本地库（预览 → 导入；可加载 oauth2.txt）\n③ 批量协议测试 → 正常 \u002F 其他错误 \u002F 滥用封禁\n④ 批量刷新 Token → 成功则按时间与远程双向同步\n⑤ 同步未上传 \u002F 校准远程（按需）\n⑥ 封禁号：本地保留；可从远程移除；可选 ABUSE 恢复\n```\n\n**默认安全策略：**\n\n- 批量刷新 \u002F 测试 \u002F 同步 **排除** `banned` 账号\n- 测出或刷出封禁 → **自动从远程删除**，本地保留\n- 列表接口默认不返回 `password` \u002F `refresh_token`（详情抽屉才有）\n\n## 配置说明（`config.json`）\n\n路径：项目根目录。请从 `config.example.json` 复制后填写。\n\n### 完整示例（占位符）\n\n```json\n{\n  \"proxy\": { \"url\": \"http:\u002F\u002F127.0.0.1:7890\" },\n  \"database\": { \"path\": \"data\u002Faccounts.db\" },\n  \"remote\": {\n    \"base_url\": \"\",\n    \"password\": \"\",\n    \"group_map\": { \"outlook.com\": 0, \"hotmail.com\": 0 },\n    \"skip_unmapped\": true,\n    \"default_group_id\": 0,\n    \"provider\": \"outlook\",\n    \"account_format\": \"client_id_refresh_token\"\n  },\n  \"server\": { \"host\": \"127.0.0.1\", \"port\": 18080 },\n  \"temp_mail\": {\n    \"base_url\": \"\",\n    \"domain\": \"\",\n    \"admin_password\": \"\",\n    \"site_password\": \"\"\n  },\n  \"recovery\": {\n    \"enabled\": true,\n    \"headless\": false,\n    \"wait_after_code_submit_sec\": 8,\n    \"captcha_max_attempts\": 4,\n    \"unrecoverable_max_attempts\": 3,\n    \"mail_poll_timeout_sec\": 180,\n    \"mail_poll_interval_sec\": 5\n  },\n  \"protocol_test\": { \"external_recipient\": \"\" },\n  \"ui\": { \"title\": \"Outlook Manage WebUI\", \"default_concurrency\": 20 }\n}\n```\n\n### 字段说明\n\n| 字段 | 含义 |\n|------|------|\n| `proxy.url` | HTTP 代理，协议测试 \u002F 部分网络请求使用 |\n| `database.path` | SQLite 路径，默认 `data\u002Faccounts.db` |\n| `remote.base_url` | 远程 OutlookEmail 池根地址 |\n| `remote.password` | 远程池登录密码 |\n| `remote.group_map` | 邮箱后缀 → 远程分组 ID |\n| `remote.skip_unmapped` | 未映射后缀是否跳过同步 |\n| `remote.default_group_id` | 未映射且未跳过时的默认分组 |\n| `server.host` \u002F `server.port` | 文档用本地服务说明（启动仍以 uvicorn 参数为准） |\n| `temp_mail.*` | ABUSE 恢复用临时邮箱服务 |\n| `recovery.*` | 解封浏览器是否无头、轮询验证码间隔等 |\n| `protocol_test.external_recipient` | 可选外部收件人（发信探测） |\n| `ui.default_concurrency` | 前端默认并发数 |\n\n## 界面与操作要点\n\n页面分区：**总览 → 推荐下一步 → 当前任务 → 导入 → 任务中心 → 账号池 → 配置 → 日志**。\n\n### 导入\n\n- 每行：`邮箱----密码----client_id----refresh_token`\n- 支持粘贴 \u002F 上传 txt \u002F 加载默认 `oauth2.txt`（若配置了路径）\n- 先 **预览** 再导入；同名覆盖会重置健康状态并标「待同步」\n\n### 任务中心\n\n- 并发数 1–100，批量任务共用\n- **一键测试未测试** \u002F **一键同步未上传** \u002F **补测注册时间**\n- **批量协议测试** \u002F **批量刷新** \u002F **批量恢复 ABUSE**\n- **终止任务 = 硬取消**：立刻 `cancelled`、杀协议子进程、停线程池，未处理记跳过\n\n### 账号池\n\n- 筛选：正常 \u002F 封禁 \u002F 其他错误 \u002F 未测试 \u002F 未上传 \u002F 域名等\n- 勾选批量：刷新、测试、恢复、同步、远程移除、彻底删除\n- 详情抽屉可改密钥与备注；列表默认不带密钥字段\n\n### 远程同步\n\n- 比较本地 `refresh_token_updated_at` 与远程刷新时间，**较新覆盖较旧**\n- 新账号按 `group_map` 路由（默认 outlook→3、hotmail→8）\n- **不挪动**个人\u002F临时等手动分组（只纠正批量分组内放错）\n\n## 账号健康状态\n\nHealth 主要看 **Graph + IMAP\u002FPOP**（SMTP 仅展示，不主导分类）。\n\n| health_status | severity | 含义 |\n|---|---|---|\n| `all` | ok | Graph + IMAP\u002FPOP 可用 |\n| `graph_only` | warn | 仅 Graph |\n| `imap_pop` | warn | 仅 IMAP\u002FPOP |\n| `token_invalid` | fail | refresh token 失效\u002F过期 |\n| `other_error` | fail | 脚本异常 \u002F 疑似受限等 |\n| `banned` | banned | 滥用封禁 \u002F 锁定 \u002F 禁用等账号级拒绝 |\n\n说明：\n\n- 微软常返回 `AADSTS70000` + `User account is found to be in service abuse mode`\n- 官方错误码页对 `70000` 的通用解释是 InvalidGrant；**以 `error_description` 全文为准**\n- 本项目对含 `service abuse` \u002F `abuse mode` 的响应归为 **banned**，不是普通 token 失效\n\nAADSTS 映射见 `backend\u002Fservices\u002Fdiagnostics.py`。\n\n## 数据与隐私\n\n| 位置 | 是否应提交 | 内容 |\n|------|------------|------|\n| `data\u002Faccounts.db` | **否** | 账号、密码、token、历史 |\n| `config.json` | **否** | 远程密码、临时邮箱密钥等 |\n| `logs\u002F` | **否** | 运行日志（可能含邮箱） |\n| `config.example.json` | 是 | 无真实密钥的模板 |\n| 源码 \u002F 前端 \u002F 测试 | 是 | 业务逻辑 |\n\n仓库已用 `.gitignore` 忽略：本地配置、数据库、日志、虚拟环境、缓存、浏览器 profile、密钥类文件名等。  \n**推送前请确认 `git status` 无 `config.json` \u002F `*.db` \u002F `oauth2.txt` \u002F 日志。**\n\n## API 摘要\n\n| 方法 | 路径 | 说明 |\n|---|---|---|\n| GET | `\u002Fapi\u002Fstatus` | 总览统计 |\n| GET | `\u002Fapi\u002Faccounts` | 账号列表（默认无密钥） |\n| GET | `\u002Fapi\u002Faccounts\u002F{id}\u002Fdetail` | 详情 + 历史 |\n| POST | `\u002Fapi\u002Faccounts\u002Fimport-preview` | 导入预览 |\n| POST | `\u002Fapi\u002Faccounts\u002Fimport-text` | 文本导入 |\n| POST | `\u002Fapi\u002Faccounts\u002Fbatch\u002Frefresh` | 批量刷新 → `job_id` |\n| POST | `\u002Fapi\u002Faccounts\u002Fbatch\u002Fprotocol` | 批量协议测试 → `job_id` |\n| POST | `\u002Fapi\u002Fjobs\u002F{id}\u002Fcancel` | **硬取消**任务 |\n| GET \u002F PUT | `\u002Fapi\u002Fconfig` | 配置读写 |\n| GET | `\u002Fapi\u002Flogs` | 日志尾部 |\n\n批量请求体常见字段：`{ \"ids\": [], \"concurrency\": 8 }`；`ids` 空表示按规则取全部（仍会排除封禁，视接口而定）。\n\n## 开发与测试\n\n```bash\npython -m unittest tests.test_hardening -v\n```\n\n## 常见问题\n\n**Q: 协议测试大量 ABUSE？**  \nA: 多为微软账号处于 `service abuse mode`，不是本系统误判。可对少量号直接打 token 端点核对 `error_description`。\n\n**Q: 取消任务后还在跑？**  \nA: 请使用带硬取消的版本：取消会杀协议子进程并停池。需重启后端使新代码生效。\n\n**Q: 远程同步不动手动分组？**  \nA: 设计如此，避免覆盖个人\u002F临时分组。\n\n**Q: 如何只更新公开仓库？**  \nA: 本目录即独立 git 仓库；只提交源码与 `config.example.json`，本地 `config.json` 与 `data\u002F` 留在本机。\n\n## License \u002F 声明\n\n仅供自有账号运维与技术研究。请遵守微软服务条款与当地法律；勿将真实账号库、密码、token、远程凭据推送到公开仓库。\n\n---\n\n## 友情链接\n\n- \u003Ca href=\"https:\u002F\u002Flinux.do\">\u003Cimg src=\".\u002Flinuxdo.webp\" width=\"22\" height=\"22\" alt=\"LINUX DO\" align=\"center\">\u003C\u002Fa> [linux.do](https:\u002F\u002Flinux.do)：**学AI，上L站！！！**\n- [Nodeseek.com](https:\u002F\u002Fwww.nodeseek.com)：**Nodeseek是一个为热爱web开发、托管、vps \u002F服务器和其他极客事物的人提供的地方。**\n","2026-07-29 02:30:03","CREATED_QUERY"]