No description
- Python 74%
- Vue 18.2%
- CSS 5.8%
- JavaScript 1.8%
- HTML 0.2%
- Introduced OIDC login functionality with a new module `oidc_login.py`. - Updated `requirements.txt` to include necessary dependencies: `requests`, `Authlib`, and `expiringdict`. - Enhanced the web application to handle OIDC login routes and callbacks. - Modified session management to accommodate OIDC state and nonce. - Updated frontend to display OIDC login options and initiate login flow. - Improved error handling and user feedback for OIDC login processes. |
||
|---|---|---|
| web | ||
| .gitignore | ||
| __init__.py | ||
| handler.py | ||
| poste_client.py | ||
| README.md | ||
| requirements.txt | ||
dn42-bot Email Plugin
dn42-bot 邮箱管理插件 — 通过 /email 命令和网页端管理 Poste.io 邮箱。
功能
Telegram Bot (/email 命令)
| 功能 | 说明 |
|---|---|
| 📬 Create 新建 | 创建一个 username@x.dn42 邮箱 |
| 🗑️ Delete 删除 | 永久删除邮箱及所有数据 |
| 🔑 Reset 重置密码 | 生成新的随机密码 |
| ✏️ Rename 改名 | 更改邮箱用户名(会重建邮箱) |
Web 网页端 (/email 路径)
| 功能 | 说明 |
|---|---|
| 🔐 Login 登录 | 支持邮箱验证码 / GPG 签名 / SSH 签名 /(可选)外部 OIDC/OAuth |
| 📬 Create 新建 | 创建一个 username@x.dn42 邮箱 |
| 🔑 Password 改密码 | 修改邮箱密码(支持自动生成) |
| ✏️ Rename 改名 | 更改邮箱用户名(重建邮箱,数据丢失) |
| 🗑️ Delete 删除 | 永久删除邮箱 |
Web 端认证方式与 Telegram Bot 的 /login 完全一致,自动从 DN42 Registry 获取用户注册的认证方式。
注册模式
通过 POSTE_REGISTER_MODE 配置项控制注册行为:
| 模式 | 说明 |
|---|---|
"open" |
自动注册(默认)— 用户申请后立即创建邮箱 |
"approval" |
审核注册 — 用户申请后需管理员审批 |
"closed" |
关闭注册 — 不允许新用户创建邮箱 |
审核模式下,用户提交申请后所有特权用户(db_privilege)会收到审核通知,
可以通过内联按钮批准或拒绝。用户也可以随时撤回自己的申请。
安装
在 server/config.py 中添加以下配置:
# 插件列表 — 指定 git 仓库地址和插件名
PLUGINS = [
{
"git": "https://github.com/yourname/email-plugin.git",
"name": "email",
},
]
# Poste.io 相关配置
POSTE_API_URL = "https://mail.x.dn42" # API 调用地址(可以是内网地址)
POSTE_REAL_URL = "https://mail.x.dn42" # 用户访问的 Webmail 地址(可选,默认同 API_URL)
POSTE_ADMIN_EMAIL = "admin@x.dn42"
POSTE_ADMIN_PASSWORD = "your_admin_password"
POSTE_DOMAIN = "x.dn42"
POSTE_VERIFY_SSL = False
POSTE_REGISTER_MODE = "open" # "open" | "approval" | "closed"
# (可选)启用 Web 端外部 OIDC/OAuth 登录(独立配置,不与 dn42-bot 的 OIDC_LOGIN 共享)
# 默认回调路径为 /email/api/auth/oidc/callback
EMAIL_OIDC_LOGIN = {
"base_url": "https://your-server:3443",
"callback_path": "/email/api/auth/oidc/callback",
"pending_ttl": 600,
"providers": {
"iedon": {
"enabled": True,
"template": "iedon",
"client_id": "<your_client_id>",
"client_secret": "<your_client_secret>",
},
},
}
无需额外部署 — 插件和 Web 界面随 dn42-bot 一起启动。
Web 界面
Web 界面集成在 dn42-bot 的 aiohttp 服务器中(仅 webhook 模式下可用),无需单独部署。
启动 dn42-bot 后,访问 http://your-server:3443/email 即可使用。
前端自动构建
dn42-bot 启动时会自动检测插件中的 web/frontend/package.json,如果 dist/ 不存在则自动执行 npm install && npm run build。
前提:Docker 镜像需要包含 Node.js 和 npm(官方 Docker 镜像已内置)。
如果需要手动重新构建前端(如修改了前端代码):
cd data/plugins_repos/email/web/frontend
rm -rf dist
# 重启 dn42-bot 即可自动重建,或手动执行:
npm install && npm run build
前端开发
开发时可使用 Vite 热重载:
cd data/plugins_repos/email/web/frontend
npm install
npm run dev # 访问 http://localhost:3000/email/,API 自动代理到 dn42-bot
技术栈
- 后端: aiohttp(复用 dn42-bot 已有的 web 服务器)
- 前端: Vue.js 3 + Vite
- 认证: 邮箱验证码 / GPG 签名 / SSH 签名 /(可选)外部 OIDC/OAuth
- 邮箱后端: Poste.io REST API
插件结构
email-plugin/
├── README.md
├── requirements.txt # 插件额外依赖 (httpx)
├── __init__.py # 插件入口 (COMMANDS + register + setup_web_routes)
├── handler.py # Telegram 交互逻辑
├── poste_client.py # Poste.io API 客户端
└── web/ # Web 界面
├── __init__.py # setup_routes(app) — 挂载 aiohttp 路由
├── api.py # REST API 端点(aiohttp handlers)
├── utils.py # 认证工具(GPG/SSH 验证,复用 bot 已有函数)
└── frontend/ # Vue.js 3 + Vite
├── package.json
├── vite.config.js
├── index.html
└── src/
├── main.js
├── App.vue
├── router.js
├── api.js
├── style.css
└── views/
├── Login.vue
└── Dashboard.vue
持久化数据
插件数据存储在 server/data/plugins/email/ 目录下(由 dn42-bot 统一管理),包括:
email_db.pkl— 用户 ID 与邮箱地址的映射(Telegram 用户用 chat_id,Web 用户用web:<asn>)pending_db.pkl— 待审核的邮箱申请
Telegram Bot 和 Web 端共享同一份数据。
API 端点
Web API 挂载在 /email/api/ 路径下:
认证 API
| Method | Path | 说明 |
|---|---|---|
GET |
/email/api/auth/status |
获取当前登录状态 |
POST |
/email/api/auth/start |
开始认证(输入 ASN) |
GET |
/email/api/auth/oidc/start |
跳转到外部 OIDC/OAuth 登录(需 provider 参数) |
GET |
/email/api/auth/oidc/callback |
外部 OIDC/OAuth 回调 |
POST |
/email/api/auth/email/send |
发送邮箱验证码 |
POST |
/email/api/auth/email/verify |
验证邮箱验证码 |
POST |
/email/api/auth/gpg/challenge |
获取 GPG 签名挑战 |
POST |
/email/api/auth/gpg/verify |
验证 GPG 签名 |
POST |
/email/api/auth/ssh/challenge |
获取 SSH 签名挑战 |
POST |
/email/api/auth/ssh/verify |
验证 SSH 签名 |
POST |
/email/api/auth/logout |
登出 |
邮箱管理 API
| Method | Path | 说明 |
|---|---|---|
GET |
/email/api/mailbox/info |
获取当前用户邮箱信息 |
POST |
/email/api/mailbox/create |
创建新邮箱 |
POST |
/email/api/mailbox/password |
修改邮箱密码 |
POST |
/email/api/mailbox/rename |
邮箱改名 |
DELETE |
/email/api/mailbox |
删除邮箱 |
POST |
/email/api/mailbox/cancel-pending |
撤回待审核申请 |
依赖
httpx>=0.27.0— Poste.io API HTTP 客户端requests/Authlib/expiringdict— (可选)外部 OIDC/OAuth 登录aiohttp— 由 dn42-bot 提供,无需额外安装