一个基于 Flask 的多邮箱管理员后台,支持:
- 管理员登录
- 添加、编辑、删除多个微软邮箱档案
- 在
graph_api、imap_new、imap_old三种方式之间切换 - 查看收件箱概览、邮件列表、邮件详情
- 切换邮件已读 / 未读状态
- 侧边栏分页、搜索、跨页多选
- 批量测试连接、批量切换默认方式、批量删除
- 通过
邮箱 + API Key直接读取邮件列表和邮件详情
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
python app.py默认访问地址:http://127.0.0.1:5000
如果没有额外配置,默认管理员账号为:
- 用户名:
admin - 密码:
admin123456
推荐启动前显式配置:
$env:MAIL_ADMIN_USERNAME="admin"
$env:MAIL_ADMIN_PASSWORD="your-strong-password"
$env:MAIL_ADMIN_SECRET_KEY="replace-this-secret"
$env:INBOXOPS_API_KEY="replace-this-project-key"
python app.py说明:
MAIL_ADMIN_USERNAME:管理员用户名MAIL_ADMIN_PASSWORD:管理员密码MAIL_ADMIN_SECRET_KEY:Flask Session 密钥INBOXOPS_API_KEY:项目级访问 Key,用于邮箱 + Key接口
- 邮箱档案使用 SQLite,默认文件:
data/mailboxes.db - 每个档案保存:
- 备注名称
- 邮箱账号
- Client ID
- Refresh Token
- 代理
- 默认方法
- 备注
项目已增加 GitHub Actions 自动构建并发布镜像到 GitHub Container Registry。
- 工作流文件:
.github/workflows/publish-ghcr.yml - 镜像地址:
ghcr.io/genz27/inboxops - 触发条件:
- 推送到
main - 推送版本标签,例如
v1.0.0 - 在 Actions 页面手动执行
workflow_dispatch
- 推送到
main分支推送时会发布:latestmainsha-<commit>
- 推送语义化版本标签时会额外发布:
v1.2.31.21
拉取示例:
docker pull ghcr.io/genz27/inboxops:latest
docker pull ghcr.io/genz27/inboxops:v1.0.0管理员接口:
GET /api/auth/mePOST /api/auth/loginPOST /api/auth/logoutGET /api/mailboxes?q=&page=&page_size=POST /api/mailboxesPOST /api/mailboxes/importGET /api/mailboxes/<id>PUT /api/mailboxes/<id>DELETE /api/mailboxes/<id>POST /api/mailboxes/delete/batchPOST /api/mailboxes/test-connectionPOST /api/mailboxes/test-connection/batchPOST /api/mailboxes/preferred-method/batchPOST /api/mailbox/overviewPOST /api/mailbox/messagesPOST /api/mailbox/messagePOST /api/mailbox/message/read-state
项目级 Key 接口:
POST /api/key/mailbox/messagesPOST /api/key/mailbox/message
GET /api/mailboxes返回邮箱摘要列表,不包含client_id、refresh_token、proxy- 支持查询参数:
q:按备注名称、邮箱账号、备注信息搜索page:页码,默认1page_size:每页数量,默认20
- 编辑邮箱时,继续通过
GET /api/mailboxes/<id>获取完整详情 - 侧边栏支持跨页多选
- 支持批量测试连接、批量切换默认接入方式、批量删除
- 搜索词、页码、跨页已选邮箱、批量方法选择会保存在当前浏览器会话中
为了让外部服务不依赖管理员登录态直接读取邮件,项目新增了项目级访问 Key。
- 服务端配置:
INBOXOPS_API_KEY - 推荐传递方式:请求头
X-InboxOps-Key - 兼容请求体字段:
api_key或key - 通过邮箱账号定位档案,不暴露
client_id、refresh_token、proxy - 当服务端未配置
INBOXOPS_API_KEY时,接口返回503 - 当 Key 缺失或错误时,接口返回
401
接口:POST /api/key/mailbox/messages
请求头示例:
X-InboxOps-Key: replace-this-project-key
Content-Type: application/json请求体示例:
{
"email": "demo@example.com",
"method": "graph_api",
"top": 10,
"unread_only": false,
"keyword": "invoice"
}字段说明:
email:必填,邮箱账号method:可选,graph_api、imap_new、imap_oldtop:可选,返回数量,范围1-50unread_only:可选,是否只返回未读邮件keyword:可选,按主题 / 发件人 / 摘要关键字过滤
返回内容包含:
mailbox:邮箱公开信息method:本次使用的读取方式messages:邮件摘要列表count:本次返回条数
curl 示例:
curl -X POST http://127.0.0.1:5000/api/key/mailbox/messages \
-H "Content-Type: application/json" \
-H "X-InboxOps-Key: replace-this-project-key" \
-d "{\"email\":\"demo@example.com\",\"top\":5}"接口:POST /api/key/mailbox/message
请求体示例:
{
"email": "demo@example.com",
"message_id": "AAMkAG...",
"method": "graph_api"
}字段说明:
email:必填,邮箱账号message_id:必填,邮件唯一标识method:可选,不传时使用该邮箱的默认读取方式
返回内容包含:
mailbox:邮箱公开信息message:完整邮件详情,包括正文、收件人、抄送、附件状态、会话信息等
refresh_token和client_id需要具备对应 IMAP 或 Graph API 权限- IMAP 连接本身仍是直连,当前代理主要覆盖 token 和 Graph 的 HTTP 请求
- 当前多邮箱后台适合内部管理使用;若用于生产环境,建议再补密码哈希、CSRF、防爆破和敏感信息加密存储