SkimMail
English · Tiếng Việt · 中文
速览你的所有收件箱。一个轻量、自托管、以阅读为先的多账户邮件阅读器——以 IMAP 为核心 + Gmail/Outlook OAuth——打包为单个 Go 二进制并内嵌 React SPA。 无需任何外部服务。
许可证: Business Source License 1.1(专有软件;2030 年转为 AGPL) · 安全: SECURITY.md · 文档: Wiki
下面写的都已经发布。 多账户邮件、按账户出口(egress)、规则与告警、通知、 备份与恢复、插件、远程访问和多用户角色都在当前版本里 —— AI Triage 是唯一一项 仍在路线图上的重要功能。逐版本细节见
CHANGELOG.md。
功能
阅读
- 多账户 IMAP 阅读——通过 host/port + 应用专用密码添加账户。Gmail 与 Outlook 的 OAuth(基于 IMAP 的 XOAUTH2)为可选,使用你自己的 Google/Azure 应用凭据。
- 跨所有账户的统一收件箱、轻量会话线程(threading)、三栏界面,阅读区在 沙箱 iframe 中渲染。远程图片默认一直拦截,直到你主动要求——而且那时是 SkimMail 去取图,不是你的浏览器,并且走该账户自己的出口,所以发件人的服务器 看不到你。
- 账户分组——把多个账户归入有名称、带配色的分组,按组一起阅读邮件。
- 实时新邮件推送:IMAP IDLE → WebSocket,并带轮询兜底,即使 IDLE 断开 也能收到邮件——即便没有客户端打开,后端也会持续同步。
- 两级搜索——本地快速全文(SQLite FTS5)+ 可选服务端回退,触达缓存窗口之外 的邮件。
- 快速阅读工具——稍后处理(snooze)、置顶(pin)、跨全部账户的已加星标、 分类收件箱 bundles、多选 + 批量操作、移动到任意文件夹(可撤销)、 VIP / 静音发件人(在设置里可查看并撤销)、一键退订(RFC 8058),以及 退订短名单——把你基本不读的批量发件人排出优先级,依据发件人自己的 List-Unsubscribe 头来挑选,所以账户安全类邮件永远不会被列进来。
- 键盘优先(Superhuman 风格)+ 专注/处理模式 + 命令面板(⌘K)+ PWA (可安装、外壳离线可用)+ 多语言(English / Tiếng Việt / 中文,深色与浅色主题)。
- 服务端关键字——你其他邮件客户端已经打上的标记会以只读小标形式显示。默认关 闭:大多数邮箱根本没有这些标记,而一排空标比没有这一排更糟。
- 截图安全模式——界面上显示的每个地址、姓名、主题、预览行和附件名都会被替换成 以假乱真的替身,邮件正文则完全不渲染,于是你可以在真实收件箱开着的情况下提交 issue 或写文章。默认关闭,按设备生效。
每个账户都有自己的出口
- 按账户出口(egress)。 让每个账户的邮件流量各走各的路:SOCKS5 代理、
HTTP 代理、内嵌 WireGuard 隧道,或你自己部署的无服务器中继(relay)
——把一个文件粘贴到 Cloudflare Workers,或在容器里运行
skimmail relay。工作与 私人邮箱不必共用同一个出口 IP。邮件客户端通常把这件事交给外部管道 (wireproxy、按应用 VPN、再起一个容器);在这里它只是账户上的一个选项。 - 是证据,不只是配置。 每个连接都会报告它实际离开时的公网 IP —— 代理、 隧道、中继乃至 Direct 都一样 —— 并且当两个本应彼此隔离的账户从同一个地址出 现时,SkimMail 会发出警告。Test 会通过该出口建立一次真实连接并报告延迟。
- 失败即关闭(fail-closed)。 关掉一个连接绝不会把它的账户退回到裸连接:它们 会变为 degraded 并停止同步,直到你主动选择 Direct —— 已关闭的出口无法悄 悄泄露你家里的 IP。
自动化与运维
- Rules & Signals(规则与信号)——按发件人、主题(纯文本或正则)、账户或分组 匹配来信,或匹配“看起来像一次性验证码”,然后通知某个渠道、在应用内弹出提示、 发送推送,或打上可点击筛选的标签(tag)。含一次性验证码的邮件会显示 OTP 小标签,点一下即可复制;验证码本身从不存储。
- 通知,六种渠道——普通 webhook、Telegram、Slack、Discord、 Microsoft Teams 或 Google Chat,想加多少都行,每个都有自己的 Send test —— 另外还有发往浏览器和手机的 Web Push(标准 VAPID 密钥由 SkimMail 自行生成,无需 Firebase 账号),并支持免打扰时段、内容隐私和按账户开关。
- 同步健康——反复失败的账户会自行停止,而不是一直冲击你的邮件服务商;看板 按 Stopped / Degraded / Paused 展示每个账户,并提供一键 Resume、Retry、Stop;当 账户停止同步、代理或隧道掉线、OAuth 登录即将过期时会发出告警。
- 备份与恢复——为整个实例(账户、邮件与设置)生成加密快照,可恢复到任意一台 SkimMail 服务器,哪怕它用的是另一种数据库 —— 还可按计划备份到本地目录或任意 S3 兼容存储(MinIO、Cloudflare R2、Backblaze B2、Wasabi、AWS S3)。
- 无需端口转发的远程访问——通过 Cloudflare Tunnel 或 Tailscale 把 SkimMail 暴露出去,并提供二维码方便手机打开。这些程序和 WireGuard 引擎都是按需 下载的插件,对照一份已签名、按 SHA256 固定的索引校验;在 Settings ▸ 插件里安装、更新和删除它们。
- 往回同步多久、离线保留什么——每个账户都有自己的同步深度(默认 30 天, 也可以是全部历史),在 Settings ▸ Sync 里统一设定,并可按邮箱单独覆盖。你 打开过的邮件正文会缓存在本地,重读不再有成本;后台预取可以关掉,如果你不 希望它提前读取。
- 你的邮件存在哪里、存多久——缓存下来的邮件正文放在你选择的 blob 存储里:本 地文件系统,或任何兼容 S3 的存储桶,可在 Settings ▸ Storage 里切换,带真实 的连接测试和一次中断后可续跑的迁移。留存这一面在 Settings ▸ Security:当前 用量、容量上限、正文保留天数,以及手动清理。数据库默认是 SQLite,而 PostgreSQL 与 MySQL 已编译进每一个发布版本——无需重新编译。
- 在浏览器里配置,而不是编辑文本文件——公开 URL、OAuth 应用和登录模式都是应用 内的设置;用环境变量设定的值依然优先,并在界面上显示为锁定,同时写明该删除哪个 变量。应用内自更新可在二进制 / apt 安装上一键装好新版本, Settings ▸ 日志则提供实时查看日志、运行时切换日志级别与轮转设置。
安全与多用户
- 真正隔离的多用户——
AUTH_MODE=users让每个人拥有自己的账户、邮件和设置,别 人完全看不到,角色为 owner、operator 或 viewer;用skimmail user add创建。单人实例依旧和以前一样简单。 - 安全层——首次登录由一次性认领码把关;凭据、OAuth 令牌与缓存的邮件正文均 静态加密(AES-256-GCM);另有登录限流 + 锁定、2FA、由服务端强制的空闲锁屏—— 它会覆盖每一个打开的标签页,而不只是你刚碰过的那一个、 CSRF/Origin 校验、SSRF 防护、已签名的发行版与插件索引,以及只追加的审计日志。
- 属于你,并且一直属于你——单个 Go 二进制内嵌 React SPA,内置 SQLite (PostgreSQL 与 MySQL 可选;MySQL 为实验性),常驻后台同步,并且不回传 (no phone-home)。Community Edition 免费;Sponsor 与 Pro 密钥完全离线 校验,密钥过期也绝不会拿走你已经添加的东西。
环境要求
只需 Docker —— 内置 SQLite,无需任何外部服务。
(从源码构建或参与贡献?见 README.dev.md。)
快速开始
无需源码 — 下载已发布的 compose 文件(它直接拉取预构建镜像):
curl -fsSLO https://lyquyduong.github.io/skimmail/docker-compose.yml
docker compose up -d # → http://localhost:8080(SQLite + 文件系统)
或运行纯镜像(distroless + 非 root;数据在 /data 卷):
docker run -d --name skimmail -p 8080:8080 -v skimmail-data:/data \
-e AUTH_MODE=passphrase ghcr.io/lyquyduong/skimmail:latest
一个镜像,一个软件包。 内嵌 WireGuard 出口,以及 PostgreSQL、MySQL 和 S3 支持
都在默认构建里 —— WireGuard 引擎是一个按 SHA256 固定的插件,你第一次添加隧道时由
SkimMail 自动下载,无需额外安装,也不必在两个镜像之间做选择。单独的 skimmail-wg
版本已于 1.7.0 停止发布;若你仍装着那个 apt 包,apt remove skimmail-wg 是安全的。
在 Ubuntu / Debian 上安装(apt)
curl -fsSL https://lyquyduong.github.io/skimmail/apt/skimmail.gpg \
| sudo tee /usr/share/keyrings/skimmail.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/skimmail.gpg] https://lyquyduong.github.io/skimmail/apt stable main" \
| sudo tee /etc/apt/sources.list.d/skimmail.list
sudo apt update && sudo apt install skimmail # 作为 systemd 服务运行 → http://localhost:8080
配置位于 /etc/default/skimmail;数据位于 /var/lib/skimmail;日志写入 systemd
journal(sudo journalctl -u skimmail -f)及轮转文件
/var/log/skimmail/skimmail.log —— 级别、轮转、清空与实时查看器见
Settings ▸ Logs。升级通过 apt upgrade。所有发布渠道(镜像、.deb、
apt 仓库)都从 GitHub 发布——见 DISTRIBUTION.md。
首次登录
打开 http://localhost:8080。在让你创建任何东西之前,SkimMail 会先索取首次启动时 打印的一次性认领码 —— 它用来阻止先访问到端口的人抢先认领你的实例:
sudo journalctl -u skimmail | grep 'claim code' # apt(需要 sudo:journal 仅 root 可读)
docker compose logs skimmail | grep 'claim code' # docker compose(服务名;容器实际叫 skimmail-skimmail-1)
docker logs skimmail 2>&1 | grep 'claim code' # docker run(仅当你像上面那样传了 --name skimmail)
丢失了?重新生成一个 —— 旧的随即失效:
sudo -u skimmail skimmail --data-dir /var/lib/skimmail claim-code --rotate
在封闭网络中,可用 SKIMMAIL_SKIP_CLAIM=1 直接跳过这道关卡。
随后,默认认证模式为 passphrase:你第一次输入的密码会成为主口令 ——请牢记
(之后用它登录)。用户名留空。
添加邮箱账户
添加 IMAP 账户:邮箱 · host(如 imap.gmail.com) · 端口 993 · 安全 TLS ·
应用专用密码。
Gmail 可以使用应用专用密码(不是常规密码)——两次点击,无需 Cloud 项目。 Outlook.com 和 Hotmail 不行:Microsoft 不为个人账户签发应用专用密码,并已关闭 基本身份验证,因此这些邮箱必须使用 OAuth。
要启用“使用 Google/Microsoft 添加”按钮,请配置下方的 OAuth 凭据。不要求公开的
BASE_URL——没有公网地址的实例通过粘贴浏览器最终跳转到的地址来完成登录。
点击 ↻ Sync(或等待后台轮询)。之后新邮件会通过 WebSocket 实时推送。
使用
- 搜索——在搜索框输入(回车)。选中单个账户时,“Search server ↗”按钮还会 查询邮件服务器并缓存命中结果。
- 分组——在 Settings → Groups 创建账户分组;选择某个分组即可只阅读该组账户 的邮件。
- Bundles——按 Primary / Newsletter / Transactional / Notifications 过滤列表。 💤 Snoozed 查看已稍后处理的邮件。
- 多选——勾选行进行批量 read / archive / delete。
- 阅读区——🗄 归档 · 🗑 删除(可 Undo) · 💤 稍后 · 📌 置顶 · ✉️ 退订 · ★ VIP · 🔇 静音。
- 键盘——
?显示全部快捷键:j/k移动 ·Enter/o打开 ·e归档 ·#删除 ·s稍后 ·x选择 ·Space快速预览 ·/搜索 ·f专注模式(“清空收件箱”) ·Esc关闭。 - 标签(tag)——你可以在邮件列表或阅读窗格里自己打标签,也可以交给规则;点击
标签小标即可筛选,或在搜索框里输入
tag:名称。标签取下来和打上去一样容易,新 规则还能应用到你已有的邮件上——并且会先告诉你它将影响多少封。 - 图片——图片被拦截时的横幅提供 Show images,以及 Always 或 Never from this sender(两者都可撤销;影响整个实例的开关在 Settings ▸ 安全)。
- PWA——从浏览器地址栏安装;应用外壳可离线使用。
- 语言 / 主题——在侧栏切换 EN / VI / 中 与深色/浅色。
配置
通过环境变量配置(12-factor)——见 .env.example。自 1.9.0 起,大多数
设置也可以直接在应用里(Settings)修改;用环境变量设定的值始终优先,并在那里显示
为锁定。完整参考——每个变量、各个配置层面,以及谁覆盖谁——见
wiki ▸ 配置。
| 变量 | 默认 | 用途 |
|---|---|---|
AUTH_MODE |
passphrase |
passphrase(共享口令)或 users(具名账号 + 角色)。自 1.10.0 起 users 是真正的多用户:每人只拥有并看到自己的邮箱,角色为 owner、operator 或 viewer。用 skimmail user add 创建。还有第三个取值 none,它完全关闭认证;并且必须在进程环境中另外设置 SKIMMAIL_ALLOW_AUTH_NONE=1,因为 auth.mode 可以从界面和 CLI 写入,被盗用的会话不能凭自己就把整个实例降级为无认证。 |
DATA_DIR |
./data |
SQLite 数据库、主密钥、blobs |
LISTEN_ADDR |
:8080 |
监听地址 |
BASE_URL |
– | 公开 URL——OAuth 重定向流程、WebSocket 与 PWA 需要。没有它 OAuth 仍可通过粘贴流程使用。 |
TRUST_PROXY |
false |
反向代理后信任 X-Forwarded-* |
TRUSTED_PROXIES |
– | 当 TRUST_PROXY=true 时,被视为代理跳的 CIDR 列表(逗号分隔;默认仅回环/私有网段) |
TRUSTED_ORIGINS |
– | 额外允许的 CORS/CSRF 来源(逗号分隔) |
BACKGROUND_POLL_INTERVAL |
5m |
每个账户的轮询兜底周期 |
MAX_CONCURRENT_SYNCS |
4 |
同时同步的最大邮箱数 |
SYNC_RATE_PER_MIN |
10 |
每分钟启动同步的次数上限(错峰) |
SYNC_DEPTH_DAYS |
30 |
邮件头同步窗口(0 = 全部历史) |
GOOGLE_CLIENT_ID / _SECRET |
– | Gmail OAuth 应用(可选) |
MICROSOFT_CLIENT_ID / _SECRET |
– | Outlook OAuth 应用(可选) |
安全
凭据、OAuth 令牌与缓存的邮件正文均静态加密(AES-256-GCM)。首次登录由一次性认领码
把关。服务端实施登录限流 + 锁定、CSRF/Origin 校验、对外请求的 SSRF 防护、严格安全
响应头 + 沙箱邮件 iframe、由服务端强制的空闲锁屏,以及只追加的审计日志
(GET /api/audit)。完整安全姿态与漏洞报告方式见 SECURITY.md。
卸载(完全移除)
卸载本身不会删除你的数据 —— 账户、邮件缓存和加密主密钥保存在 Docker 卷或
/var/lib/skimmail 中。下面标 ⚠ 的步骤会永久删除它们(没有备份就无法恢复)。
Docker Compose
docker compose down -v # ⚠ 停止并删除容器以及数据卷
docker rmi ghcr.io/lyquyduong/skimmail:latest 2>/dev/null
rm docker-compose.yml # 之前下载的 compose 文件
Docker(docker run)
docker rm -f skimmail
docker volume rm skimmail-data # ⚠ 全部数据
docker rmi ghcr.io/lyquyduong/skimmail:latest
APT(Ubuntu / Debian)
sudo apt purge skimmail # 停止服务,删除二进制、systemd unit
# 和 /etc/default/skimmail
sudo rm -rf /var/lib/skimmail # ⚠ 数据 —— apt 有意保留
sudo rm -rf /var/log/skimmail # 日志文件及轮转备份
sudo userdel skimmail # 安装时创建的系统用户
# 移除之前添加的 APT 仓库 + 签名密钥:
sudo rm -f /etc/apt/sources.list.d/skimmail.list /usr/share/keyrings/skimmail.gpg
sudo apt update
手动二进制(tarball) —— 停止进程(或你自建的 systemd unit),然后删除二进制
及其数据目录(DATA_DIR,默认是二进制旁的 ./data)。
面向开发者
从源码构建、开发模式(热重载)、VS Code 配置、build tags、测试与项目结构都在
README.dev.md。
许可证与版本层级
SkimMail 是专有软件。 采用 Business Source License 1.1 许可
(Licensor:Solutions101 (S101))。源代码为私有;仅向用户分发编译后的二进制。
SPDX:BUSL-1.1。
三个层级
- Community Edition —— 免费,10 个账户 / 1 个登录账号 / 3 个代理 / 2 个分组 / 5 GB 存储(无需许可证密钥)
- Sponsor Edition —— 面向 GitHub Sponsors / 赞助者的答谢(25 个账户 / 3 个登录账号 / 5 个代理 / 5 个分组 / 15 GB)
- Pro Edition —— 付费许可证密钥;账户/代理/分组/存储均无限制,并包含未来的 AI Triage 服务
详情见 COMMERCIAL-TERMS.md;完整说明(英文 + 越南语)见
docs/LICENSING.md。许可证相关问题见 SECURITY.md。
许可证转换(2030 年)
2030 年 7 月 23 日之后,SkimMail 将自动转为 AGPL-3.0-or-later。 在此日期之前,源代码仍为专有。
其他声明
- 商标: “SkimMail”名称不在源代码许可证的涵盖范围内(见
TRADEMARK.md) - 第三方依赖: 许可证清单见
NOTICE - 隐私: 不回传(no phone-home);Pro/Sponsor 的数据收集为可选(见
PRIVACY.md) - 参与贡献: 需签署 CLA
- 许可证密钥操作: 见
LICENSE-SIGNING.md(仅维护者)