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