# 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)。
