jessecu2024/imail

GitHub: jessecu2024/imail

imail 是一款基于 AI 的本地邮件分类应用,通过自动生成多语气回复快速解决收件箱堆积问题。

Stars: 0 | Forks: 1

imail

imail

每封邮件五秒内完成分类处理。
本地应用 · 多账户支持 · 每封邮件3个LLM草拟回复 · 键盘优先。

PyPI Python License CI Docker

imail screenshot — three reply tones for the same email

## 🧭 核心理念 你醒来面对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技术, 办公自动化, 多邮箱支持, 安全防御评估, 快速处理, 收件箱分类, 无后门, 本地应用, 熵值分析, 生产力工具, 电子邮件处理, 自动草拟回复, 请求拦截, 逆向工具, 邮件回复生成, 邮件管理, 键盘快捷键