138 lines
4.2 KiB
Markdown
138 lines
4.2 KiB
Markdown
# 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`:
|
||
|
||
```powershell
|
||
cd server
|
||
cargo run
|
||
```
|
||
|
||
用户端和管理端均使用 pnpm:
|
||
|
||
```powershell
|
||
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 时使用:
|
||
|
||
```env
|
||
VITE_API_BASE_URL=http://localhost:3000
|
||
```
|
||
|
||
## Docker 部署
|
||
|
||
开发/内网部署:
|
||
|
||
先修改 `compose.env` 中所有 `CHANGE_ME` 配置,然后运行:
|
||
|
||
```powershell
|
||
docker compose up -d --build
|
||
```
|
||
|
||
用户端地址为 `http://localhost:8080`,管理端地址为 `http://localhost:8081`,API 地址为 `http://localhost:3000`,SMTP 监听宿主机 `25` 端口。
|
||
|
||
HTTPS 完整部署:
|
||
|
||
1. 修改 `compose.full.env` 中所有 `CHANGE_ME` 配置。
|
||
2. 修改 `nginx.full.conf` 中的域名与证书文件名。
|
||
3. 将证书放入 `certs/`。
|
||
4. 启动服务。
|
||
|
||
```powershell
|
||
docker compose -f docker-compose.full.yml up -d --build
|
||
```
|
||
|
||
使用外部数据库时,复制 `compose.self.env.example` 为 `compose.self.env`,填写数据库连接后运行:
|
||
|
||
```powershell
|
||
docker compose -f docker-compose.self.yml up -d --build
|
||
```
|
||
|
||
生产环境会拒绝默认 JWT 密钥、通配 CORS,以及缺失或占位的 32 字节正文加密密钥。
|
||
|
||
## 首个管理员
|
||
|
||
新部署时,将 `AUTH__BOOTSTRAP_ADMIN_EMAIL` 设置为首个管理员邮箱,并为 `AUTH__INVITE_CODE` 设置至少 16 字符的随机值。服务启动后,用这两个值注册:
|
||
|
||
```powershell
|
||
$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`。
|
||
|
||
## 验证
|
||
|
||
```powershell
|
||
cd server
|
||
cargo test
|
||
cargo check
|
||
|
||
cd ..\frontend
|
||
pnpm build
|
||
|
||
cd ..\admin
|
||
pnpm build
|
||
```
|
||
|
||
## 许可证
|
||
|
||
MIT,详见 [LICENSE](LICENSE)。
|