4.2 KiB
Email Unlimited
Email Unlimited 是一个可自托管的临时邮箱服务,包含 Rust API/SMTP 服务、Vue 用户端和 React 管理后台。
技术栈
- 后端:Rust、Axum、SeaORM、Tokio
- 用户端:Vue 3、Pinia、Vue Router、Element Plus
- 管理端:React 19、TypeScript、Vite、TanStack Query、shadcn/ui
- 数据:MySQL / PostgreSQL / SQLite、Redis
- 部署:Docker Compose、Nginx
服务直接监听 SMTP 端口接收邮件,支持临时邮箱、WebSocket 推送、积分与每日额度、黑名单、灰名单、隔离区、正文 AES-GCM 加密和管理员接口。
本地开发
后端默认使用 server/config/development.toml:
cd server
cargo run
用户端和管理端均使用 pnpm:
cd frontend
pnpm install
pnpm dev
cd admin
pnpm install
pnpm dev
两个前端在开发模式下都通过 Vite 代理访问 http://127.0.0.1:3000。需要连接其他 API 时,可分别设置 VITE_API_PROXY_TARGET;生产构建连接独立 API 时使用:
VITE_API_BASE_URL=http://localhost:3000
Docker 部署
开发/内网部署:
先修改 compose.env 中所有 CHANGE_ME 配置,然后运行:
docker compose up -d --build
用户端地址为 http://localhost:8080,管理端地址为 http://localhost:8081,API 地址为 http://localhost:3000,SMTP 监听宿主机 25 端口。
HTTPS 完整部署:
- 修改
compose.full.env中所有CHANGE_ME配置。 - 修改
nginx.full.conf中的域名与证书文件名。 - 将证书放入
certs/。 - 启动服务。
docker compose -f docker-compose.full.yml up -d --build
使用外部数据库时,复制 compose.self.env.example 为 compose.self.env,填写数据库连接后运行:
docker compose -f docker-compose.self.yml up -d --build
生产环境会拒绝默认 JWT 密钥、通配 CORS,以及缺失或占位的 32 字节正文加密密钥。
首个管理员
新部署时,将 AUTH__BOOTSTRAP_ADMIN_EMAIL 设置为首个管理员邮箱,并为 AUTH__INVITE_CODE 设置至少 16 字符的随机值。服务启动后,用这两个值注册:
$body = @{
email = "admin@example.com"
password = "replace-with-a-strong-password"
invite_code = "replace-with-the-configured-invite-code"
} | ConvertTo-Json
Invoke-RestMethod -Method Post `
-Uri "http://localhost:3000/auth/register" `
-ContentType "application/json" `
-Body $body
注册成功后即可登录管理端。已有管理员的部署可将 AUTH__BOOTSTRAP_ADMIN_EMAIL 留空。
普通用户通过用户端注册和登录。用户端支持创建/吊销邮箱、收信与 WebSocket 推送、附件下载、邮件删除、积分余额、今日额度与积分流水。每个邮箱使用独立 token;浏览器首次打开已有邮箱时会自动轮换并保存新 token。
积分规则
积分规则保存在数据库中,不使用 CREDIT__* 环境变量。首次启动会写入内置默认值,之后可在管理端的“积分规则”页面修改,保存后从下一次业务操作立即生效并跨容器重启保留。
| 规则 | 默认值 |
|---|---|
| 注册奖励 | 30 积分 |
| 每日签到 | 3 积分 |
| 奖励余额上限 | 90 积分 |
| 创建邮箱 | 2 积分/个 |
| 接收邮件 | 1 积分/封 |
| 每日邮箱上限 | 3 个 |
| 每日收信上限 | 20 封 |
所有邮箱创建和正常邮件接收从第一次开始扣分,不存在免费次数。删除邮件、吊销邮箱或自然过期不会返还积分和当日次数。隔离邮件在管理员放行时才占用次数并扣分。积分不可购买、转账、兑换或提现。
DNS
用于接收邮件的域名至少需要:
| 类型 | 名称 | 值 |
|---|---|---|
| A | mail |
服务器公网 IP |
| MX | @ |
mail.example.com |
公网 SMTP 还需要开放 TCP 25,并根据实际域名调整 server/config/production.toml 的 smtp.hostname 与 smtp.local_domains。
验证
cd server
cargo test
cargo check
cd ..\frontend
pnpm build
cd ..\admin
pnpm build
许可证
MIT,详见 LICENSE。