jessecu2024/imail
GitHub: jessecu2024/imail
imail 是一款基于 AI 的本地邮件分类应用,通过自动生成多语气回复快速解决收件箱堆积问题。
Stars: 0 | Forks: 1
imail
每封邮件五秒内完成分类处理。
本地应用 · 多账户支持 · 每封邮件3个LLM草拟回复 · 键盘优先。
## 🧭 核心理念
你醒来面对30封邮件。每封都需要回答“是/否/‘稍后回复’”。尽管做出*决定*只需一瞬,但组织语言却要花费30秒。imail 颠覆了这一点:组织语言只需一次按键,决定权仍在你手中。
```
┌──────────────────────────────────────────────────────────────┐
│ From advisor@uni.edu │
│ Subject Can you join the panel on Thursday? │
│ … │
└──────────────────────────────────────────────────────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1·POSITIVE │ │ 2·NEUTRAL │ │ 3·NEGATIVE │
│ Yes, I'll … │ │ Let me … │ │ Thanks for │
│ │ │ │ │ asking, but │
└─────────────┘ └─────────────┘ └─────────────┘
1 / 2 / 3 → save draft S → skip Q → end session
```
## 🚀 安装
请选择适合您环境的方式。安装后的命令始终是 **`imail`**。
| uv (推荐) |
pipx |
Homebrew (macOS) |
Docker |
|
```
uv tool install \
imail-cli
```
|
```
pipx install \
imail-cli
```
|
```
brew install \
jessecu2024/tap/imail
```
|
```
docker pull \
ghcr.io/jessecu2024/imail
```
|
## ⚡ 首次运行
```
export DEEPSEEK_API_KEY=sk-... # https://platform.deepseek.com/api_keys (free signup)
imail # opens http://127.0.0.1:8765
```
首次启动将进入“添加账户”界面。选择 Gmail / Outlook / 163 等,登录一次,即可开始分类处理。
**Docker 版本**(本地无需 Python):
```
docker run --rm -p 8765:8765 \
-v ~/.config/imail:/root/.config/imail \
-e DEEPSEEK_API_KEY=sk-... \
ghcr.io/jessecu2024/imail:latest
```
挂载的 `~/.config/imail` 目录会在容器重启间保留您的账户和已保存的回复。
## ✨ 为何选择 imail
| | |
|--|--|
| 💸 **一次API调用生成3份草稿** | DeepSeek 只读取一次邮件,单次响应即可返回*积极/中性/消极*三种语气。每次分类处理成本约$0.0002。由于三种角度都已呈现在屏幕上,模型无需再接收“请更礼貌地重述”的后续指令。 |
| 📥 **您的邮箱保持原位** | imail 通过 OAuth 或 IMAP 登录您现有的 Gmail / Outlook / 163。保存的草稿将存入您已使用的*同一个*草稿箱——在您的手机上也能看到。 |
| 🔒 **本地优先** | 网页界面运行在您机器的 `127.0.0.1:8765`。邮件内容保持本地;唯一的网络请求是向 DeepSeek 发送草稿生成请求。没有 imail 服务器,收件箱内容不会上传至任何地方。 |
| ⌨️ **键盘优先** | `1` / `2` / `3` 保存草稿,`S` 跳过,`Q` 结束。分类视图设计为可快速浏览操作。 |
| 🟢 **追踪已处理邮件** | 已回复的邮件在收件箱中会显示绿色“已回复”徽章;点击可重新显示已保存的回复,无需重新生成(节省 token)。已发送文件夹将反映您已处理的内容,并从本地缓存提供。 |
| ❌ **删除操作同步所有设备** | 在邮件上点击 × 将从 IMAP 服务器上彻底删除它,因此 163 网页邮箱 / 手机 / 其他任何登录该邮箱的客户端都会停止显示该邮件。 |
## 🔌 邮件提供商
| 提供商 | 方式 | 设置文档 |
|------------------------------|-------------------------------------------|--------------------------------------|
| ✦ **Gmail** | OAuth (`readonly` + `modify` + `compose` + `send`) | [gmail-setup.md](docs/gmail-setup.md) |
| ▦ **Microsoft 365 / Office** | IMAP + 应用密码 | [imap-setup.md](docs/imap-setup.md) |
| ▣ **Outlook.com / Hotmail** | IMAP + 应用密码 | [imap-setup.md](docs/imap-setup.md) |
| ✱ **163 / 126 / QQ** | IMAP + 授权码 | [imap-setup.md](docs/imap-setup.md) |
| ✿ **Yahoo / iCloud** | IMAP + 应用专用密码 | [imap-setup.md](docs/imap-setup.md) |
| ⚙ **任何自定义 IMAPS 主机** | 主机名 + 端口 + 登录信息 | — |
## ⚙️ 配置
所有设置均来自 `.env` 文件或环境变量。
| 变量 | 默认值 | 说明 |
|----------------------|-------------------------------|-----------------------------------------------------------------------|
| `DEEPSEEK_API_KEY` | *(必填)* | DeepSeek API 密钥。`OPENAI_API_KEY` 是非 DeepSeek 端点的备选。 |
| `IMAIL_BASE_URL` | `https://api.deepseek.com` | 任何兼容 OpenAI 的端点(Together, Groq, Moonshot, 302.AI, …) |
| `IMAIL_MODEL` | `deepseek-chat` | 或使用 `deepseek-reasoner` 以获得更精准但较慢的草稿 |
| `USER_SIGNOFF` | `Jie Xu` | 每封草拟回复中“Best regards,”下方显示的名字 |
| `IMAIL_PORT` | `8765` | 本地服务器端口 |
| `IMAIL_HOST` | `127.0.0.1` | 绑定地址(默认为回环地址 — 请勿在局域网内公开此服务) |
| `IMAIL_CONFIG_DIR` | `~/.config/imail` | accounts.json、OAuth 令牌及 replies-*.json 文件的存放位置 |
## 🧑💻 开发
```
git clone https://github.com/jessecu2024/imail
cd imail
uv sync # install dev + runtime deps
cp .env.example .env # fill in DEEPSEEK_API_KEY
uv run imail # → opens http://127.0.0.1:8765
```
CI 四件套,推送前可运行任意一项:
```
uv run ruff check . # lint
uv run ruff format . # format
uv run mypy src # type check
uv run pytest # tests
```
发布流程:参见 [docs/release.md](docs/release.md)。简而言之是“更新 pyproject 版本 + 添加 `vX.Y.Z` 标签 + 推送”——工作流将通过受信发布机制发布到 PyPI,通过 OIDC 发布到 GHCR,然后将构建好的 wheel 文件附加到 GitHub 发行版。
## 📁 项目结构
```
src/imail/
cli.py Launcher — boots uvicorn + opens browser
config.py .env loader
server.py FastAPI app — status, accounts, triage session
accounts.py Account manifest + keyring-backed secrets
reply_generator.py DeepSeek call + JSON parser
reply_store.py On-disk pending/done state per account
providers/
base.py EmailMsg + MailProvider Protocol
gmail.py Gmail API provider (OAuth)
imap.py Generic IMAP provider with presets (Outlook/163/QQ/…)
static/
index.html Single-page UI (Alpine.js)
app.js SPA state + handlers
style.css Light theme
icon.svg Brand mark
docs/
gmail-setup.md Google Cloud Console walk-through
imap-setup.md Per-provider app-password steps
forwarding-workflow.md Locked-tenant fallback (163 as relay)
release.md How to cut a PyPI release
troubleshooting.md Recurring problems (macOS keychain after brew upgrade, …)
```
## 🔒 安全性
- 📧 **Gmail OAuth 权限范围**:`gmail.readonly`(获取)、`gmail.modify`(标记已读/归档)、`gmail.compose`(草稿)和 `gmail.send`(分类视图中一键发送)。如果您更倾向于只保存草稿,然后在 Gmail 中手动发送,请从 `src/imail/providers/gmail.py` 的 `SCOPES` 中移除 `gmail.send` 并撤销令牌。
- 🔑 **IMAP 应用密码保存在操作系统密钥环中**,绝不会存储在 `accounts.json` 或 `.env` 文件中。
- 🔐 **OAuth 令牌**存放在 `~/.config/imail/token-
.json`(权限模式 `0600`)。
- 🏠 **默认仅本地访问。** 服务器监听 `127.0.0.1`。在共享机器上请勿将其更改为 `0.0.0.0`。
- ☁️ **邮件内容将发送至 DeepSeek 的服务器。** 如果您希望所有邮件正文保留在本地设备上,请将 `IMAIL_BASE_URL` 指向运行指令模型的自托管 Ollama / vLLM 端点。
## 📜 许可证
采用双重许可。请选择适合您用途的一种。
- 🆓 **AGPL-3.0-or-later**(默认)— 完整文本见 [LICENSE](LICENSE)。您可以自由使用、修改、分叉和自托管。条件是:如果您修改了代码并且**要么再分发,要么将其作为网络服务运行**(SaaS、托管产品、任何最终用户可通过网络访问的形式),您的修改也必须采用 AGPL-3.0 许可证。这是标准的“无闭源分叉,无专有 SaaS 品牌重制”保障——详见 [GNU AGPL 常见问题](https://www.gnu.org/licenses/why-affero-gpl.html)了解其理由。
- 💼 **商业许可** — 如果 AGPL 的 Copyleft 义务不适合您的产品(专有版本、闭源 SaaS、将 imail 作为库分发而不公开源码),请发送邮件至 **wzh4464@gmail.com**。标签:163邮箱, AI 助手, CLI, DeepSeek, Docker, Gmail, LLM, Outlook, Python, Unmanaged PE, WiFi技术, 办公自动化, 多邮箱支持, 安全防御评估, 快速处理, 收件箱分类, 无后门, 本地应用, 熵值分析, 生产力工具, 电子邮件处理, 自动草拟回复, 请求拦截, 逆向工具, 邮件回复生成, 邮件管理, 键盘快捷键