158 lines
6.3 KiB
Markdown
158 lines
6.3 KiB
Markdown
# PRD · MailGo 邮件系统
|
||
|
||
- **项目名称**:mail_go
|
||
- **编程语言**:Go
|
||
- **核心依赖**:go-smtp / go-imap / go-pop3(emersion 系列)+ Gin + html/template
|
||
- **文档版本**:v0.1
|
||
- **作者**:许清楚(PM)
|
||
|
||
---
|
||
|
||
## 一、原始需求
|
||
|
||
用 Go 语言开发一套完整的自托管邮件系统,包含 SMTP/IMAP/POP3 服务端、Web 管理后台(/admin)和用户邮箱界面(/),配置遵循 FHS 标准,支持 SQLite/MySQL 双数据库,支持 Linux 生产环境与 Windows 本地测试。
|
||
|
||
---
|
||
|
||
## 二、产品目标
|
||
|
||
1. **可自托管的完整邮件服务**:提供生产可用的 SMTP/IMAP/POP3 服务端,开箱即用,无需依赖第三方邮件服务商。
|
||
2. **低门槛运维管理**:通过 Web 管理后台完成域名配置、用户管理、DNS 指引,运维人员无需手动编辑配置文件。
|
||
3. **标准化配置与数据存储**:严格遵循 FHS 目录规范,配置自动补全,支持 Linux/Windows 双环境,降低部署与迁移成本。
|
||
|
||
---
|
||
|
||
## 三、用户故事
|
||
|
||
| # | 角色 | 需求 | 价值 |
|
||
|---|------|------|------|
|
||
| US-1 | 系统管理员 | 通过 /admin 配置域名、端口和 TLS 证书 | 无需 SSH 手动改配置即可上线邮件服务 |
|
||
| US-2 | 系统管理员 | 创建/删除/修改域名下的邮件用户并设置附件配额 | 集中管理账户,控制存储资源占用 |
|
||
| US-3 | 普通用户 | 登录后在浏览器中收发邮件并上传附件 | 随时随地通过 Web 界面使用邮箱 |
|
||
| US-4 | 普通用户 | 用标准邮件客户端(IMAP/POP3/SMTP)连接账户 | 继续使用 Outlook、Thunderbird 等熟悉工具 |
|
||
| US-5 | 系统管理员 | 启动时配置文件缺失项自动补全,并在 /admin 查看 DNS 配置提示 | 减少初始化错误,快速完成 DNS 配置 |
|
||
|
||
---
|
||
|
||
## 四、功能需求池
|
||
|
||
### P0 · 必须实现
|
||
|
||
| ID | 功能 | 说明 |
|
||
|----|------|------|
|
||
| P0-01 | SMTP 服务端 | 基于 go-smtp,支持收信/转发,TLS 可配置 |
|
||
| P0-02 | IMAP 服务端 | 基于 go-imap,支持标准 IMAP4 操作(文件夹、标记、搜索) |
|
||
| P0-03 | POP3 服务端 | 基于 go-pop3,支持标准 POP3 收信 |
|
||
| P0-04 | 配置文件自动补全 | 启动时检查 `/etc/mail_go/`(Windows:`./win/etc/mail_go/`),缺失项写入默认值 |
|
||
| P0-05 | 数据库支持 | 默认 SQLite,可切换 MySQL;数据目录 `/srv/mail_go`(Windows:`./win/srv/mail_go`) |
|
||
| P0-06 | 邮件持久化 | 收/发邮件元数据及正文存入数据库 |
|
||
| P0-07 | 附件存储 | 附件保存至 `/srv/mail_go/attachments`(Windows:`./win/srv/mail_go/attachments`) |
|
||
| P0-08 | 默认 admin 账户 | 首次启动自动生成 admin 管理员账户 |
|
||
| P0-09 | 用户登录认证 | Web 界面登录,Session 管理,未登录重定向 |
|
||
| P0-10 | 收件箱页面 | 邮件列表 + 邮件阅读(HTML/纯文本) |
|
||
| P0-11 | 撰写/发送邮件 | 支持附件上传,调用本地 SMTP 发送 |
|
||
| P0-12 | Web 框架 | Gin + html/template,/admin 仅管理员可访问 |
|
||
|
||
### P1 · 应当实现
|
||
|
||
| ID | 功能 | 说明 |
|
||
|----|------|------|
|
||
| P1-01 | 发件箱页面 | 展示已发送邮件列表 |
|
||
| P1-02 | 域名管理(/admin) | 配置域名、SMTP/IMAP 端口、TLS 证书路径 |
|
||
| P1-03 | 用户管理(/admin) | 创建/删除/修改用户,设置附件空间配额(默认 5 GB) |
|
||
| P1-04 | DNS 配置提示(/admin) | 展示 MX、SPF、DKIM、DMARC 记录的填写示例 |
|
||
| P1-05 | Web 监听配置 | 支持 TCP 端口和 Unix Socket(Windows 仅 TCP) |
|
||
| P1-06 | DKIM 签名 | 发信时自动附加 DKIM 签名 |
|
||
|
||
### P2 · 有则更好
|
||
|
||
| ID | 功能 | 说明 |
|
||
|----|------|------|
|
||
| P2-01 | 邮件搜索 | Web 界面关键词搜索收件箱 |
|
||
| P2-02 | 垃圾邮件过滤 | 基础规则过滤或集成第三方库 |
|
||
| P2-03 | 多域名支持 | 单实例托管多个邮件域名 |
|
||
| P2-04 | 邮件分组/标签 | 用户自定义文件夹或标签 |
|
||
| P2-05 | 操作审计日志 | /admin 记录管理操作日志 |
|
||
|
||
---
|
||
|
||
## 五、关键 UI 页面描述
|
||
|
||
### 5.1 登录页(`/login`)
|
||
- 居中卡片:邮箱地址 + 密码输入框 + 登录按钮
|
||
- 登录失败提示错误信息
|
||
|
||
### 5.2 收件箱(`/inbox`)
|
||
- 左侧导航:收件箱 / 发件箱 / 撰写 / 退出
|
||
- 右侧主区:邮件列表(发件人、主题、时间、未读标记)
|
||
- 点击邮件展开正文,底部显示附件下载链接
|
||
|
||
### 5.3 撰写邮件(`/compose`)
|
||
- 表单:收件人、抄送(可选)、主题、正文(textarea)
|
||
- 附件上传按钮(支持多文件)
|
||
- 发送 / 存草稿 按钮
|
||
|
||
### 5.4 发件箱(`/sent`)
|
||
- 与收件箱布局一致,展示已发送邮件列表
|
||
|
||
### 5.5 管理后台 - 域名配置(`/admin/domains`)
|
||
- 表格列:域名、SMTP 端口、IMAP 端口、TLS 状态、操作
|
||
- 新增/编辑弹层:域名、端口、证书路径输入框
|
||
- DNS 提示区:自动生成 MX / SPF / DKIM / DMARC 记录文本,可一键复制
|
||
|
||
### 5.6 管理后台 - 用户管理(`/admin/users`)
|
||
- 表格列:用户名、域名、配额、已用空间、状态、操作
|
||
- 新增/编辑弹层:用户名、密码、所属域名、附件配额(GB)
|
||
|
||
---
|
||
|
||
## 六、配置文件结构(参考)
|
||
|
||
```toml
|
||
# /etc/mail_go/config.toml
|
||
|
||
[database]
|
||
driver = "sqlite" # sqlite | mysql
|
||
dsn = "/srv/mail_go/mail.db"
|
||
|
||
[storage]
|
||
base_dir = "/srv/mail_go"
|
||
attachments = "/srv/mail_go/attachments"
|
||
|
||
[web]
|
||
listen = ":8080" # TCP 端口或 Unix socket 路径(仅 Linux)
|
||
|
||
[smtp]
|
||
port = 25
|
||
tls_port = 465
|
||
cert = ""
|
||
key = ""
|
||
|
||
[imap]
|
||
port = 143
|
||
tls_port = 993
|
||
cert = ""
|
||
key = ""
|
||
|
||
[pop3]
|
||
port = 110
|
||
tls_port = 995
|
||
cert = ""
|
||
key = ""
|
||
```
|
||
|
||
Windows 测试时路径前缀替换为 `./win`。
|
||
|
||
---
|
||
|
||
## 七、待确认问题(Open Questions)
|
||
|
||
| # | 问题 | 影响范围 |
|
||
|---|------|----------|
|
||
| OQ-1 | DKIM 私钥由系统自动生成还是管理员手动导入?影响 /admin 域名配置页交互设计 | P1-02、P1-06 |
|
||
| OQ-2 | 是否需要支持邮件转发规则(Forward Rule)?影响 SMTP 服务端逻辑复杂度 | P0-01 |
|
||
| OQ-3 | 附件大小上限由全局配置还是按用户配额单独限制? | P0-07、P1-03 |
|
||
| OQ-4 | Web 界面是否需要支持富文本(HTML)邮件撰写,还是纯文本即可? | P0-11 |
|
||
| OQ-5 | 多域名(P2-03)是否纳入第一期范围?影响数据库 Schema 设计 | P2-03 |
|
||
| OQ-6 | 是否需要 OAuth2 / 外部 LDAP 认证,还是仅本地账户? | P0-09 |
|