Skip to content

Repository files navigation

邮件取件链接

中文 · English

为已有邮箱的收件地址生成独立网页链接,打开即可查看最近邮件和验证码。每条链接可单独停用或重置,接收者无需知道邮箱密码。

适用环境:Windows、macOS 或 Linux,Python 3.10+ 与 SQLite 3.35+;需可通过 IMAP 读取的邮箱和应用专用密码,分享给他人前需配置可访问的服务地址,公网使用 HTTPS。

本地启动 · 导入邮箱 · 服务器部署

界面

登录后的管理后台与运行统计

管理后台登录入口

它能做什么

  • 独立取件链接 — 每个收件邮箱一条密码学随机 URL,可单独停用或重置,互不影响。
  • 只读,而且断线也能用 — 按所属 IMAP 账号组隔离查询;上游临时断线时仍可读取缓存内容。
  • 完整管理后台 — 邮箱组检查、URL 管理、访问统计、分页与搜索,全部在浏览器里完成。
  • 四套全局主题 — 天际蓝、青岚绿、霞光橙和深灰夜色,右上角切换并自动记住。
  • 默认安全 — 只监听 127.0.0.1;后台密码从标准输入读取(不进命令行历史);外部 IP 归属地查询默认关闭。
  • 本地和服务器都能跑 — Windows / macOS / Linux 本地运行,也能在 Linux 上用 systemd 长期托管。

三分钟跑起来

需要 Python 3.10+ 和 SQLite 3.35+。没有第三方运行依赖。

python --version
python pickup_server/app.py init --admin-password-stdin --base-url "http://127.0.0.1:8080"
python pickup_server/app.py serve

第一条命令会从终端安全读取后台密码,并生成仅供本机使用的 .env 与 SQLite 数据库。然后访问:

  • 管理后台:http://127.0.0.1:8080/admin
  • 健康检查:http://127.0.0.1:8080/health
  • 就绪检查:http://127.0.0.1:8080/ready

默认不能从局域网或公网访问。确需局域网直连时才显式加 --host 0.0.0.0 并配好防火墙;公网部署推荐保持 127.0.0.1,由 Caddy 或 Nginx 提供 HTTPS。

导入邮箱

examples/待导入邮箱/示例账号组.txt 复制到一个不进 Git 的私有目录。每个 TXT 文件代表一个主邮箱账号组:

owner@example.com----应用专用密码
pickup-one@example.com
pickup-two@example.com

然后导入并生成 URL:

python pickup_server/app.py import --source "私有邮箱文件夹" --base-url "http://127.0.0.1:8080" --output "output/取件URL.txt"
python pickup_server/app.py audit-urls --input "output/取件URL.txt"

audit-urls 只报告格式、重复和数量,不回显邮箱或 token

取件 API

GET /api/q/<token>/messages?wait=5&limit=30
  • fetch.pending=true 时,按 Retry-Afterfetch.retry_after_seconds 稍后重试。
  • fetch.state=degraded 表示本轮刷新失败,但已有缓存仍可读。
  • 请用每封邮件的稳定 id 去重。

技术上值得一提的地方

降级读取是刻意设计的。 IMAP 上游会抽风。此时接口不会直接报错,而是返回 fetch.state=degraded 加上已有缓存——并且明确告诉你这是降级状态。取件的人能拿到十分钟前那封验证码,同时知道数据不是最新的,这比一个 500 有用得多。

查询按账号组隔离。 一个取件 token 只能触及它所属的 IMAP 账号组,跨组查询在数据层就被切断,不依赖界面上的过滤。

密码从标准输入读。 --admin-password-stdin 让密码不进命令行参数,也就不进 shell 历史、ps 输出和 systemd 日志。

IP 归属地默认关闭。 只有部署者显式设置 PICKUP_ENABLE_IP_GEO=1 时,访问者 IP 才会被发送到受限的 HTTPS 服务(ipwho.isipapi.co)并缓存。不需要就别开——默认不把访客 IP 交给第三方。

长轮询而不是轮询。 wait 参数让调用方挂着等新邮件,而不是每秒来一次。

纯标准库。 服务、后台、缓存、统计全用 Python 标准库实现,部署时不需要处理任何依赖冲突。

完整服务器部署、更新与回滚步骤见部署说明,API 与数据模型见技术说明

它不做什么

  • 不发信、不删信、不改动邮箱里的任何内容(只读)。
  • 不接受也不存储你的邮箱主密码——请使用应用专用密码。
  • 不提供公网默认入口(要自己配 HTTPS 反代)。
  • 不做垃圾邮件过滤或邮件客户端功能。

隐私边界

运行时会保存邮箱配置、应用专用密码、取件 token、邮件缓存和访问统计。以下内容永远不应提交或公开

pickup_server/.env
pickup_server/data/
output/
真实邮箱导入文件

公开仓库经过源码、历史、文档、图片与元数据扫描,但部署者仍须保护运行时目录并使用 HTTPS。发现安全问题请按 SECURITY.md 私下报告。

验证

python -m compileall -q pickup_server tests
python -m unittest discover -s tests -v

发布审计与工具结论记录在 docs/发布审计.md

更多文档

部署说明 · 技术说明 · 版本变更 · 参与开发 · 安全策略

许可

MIT

About

给已有邮箱生成独立的网页收件链接,打开即可查看邮件和验证码,链接可单独撤销。

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages