PRD-017 邮件系统
文档编号:PRD-017
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:RecordServer、MailManager、ItemManager
1. 背景与目标
邮件承担系统补发、活动奖励、交易结算与玩家留言。当前存在附件过期未清理、批量领取重复发奖、附件满包丢失等问题。本 PRD 统一邮件类型、附件、过期、领取与删除。
2. 核心规则
2.1 邮件类型
| 类型 | 发件人 | 可删除 | 附件 | 过期 |
|---|---|---|---|---|
| 系统邮件 | 系统 | 是 | 可带 | 30 天 |
| 奖励邮件 | 运营 | 是 | 可带 | 30 天 |
| 交易邮件 | 拍卖/交易 | 是 | 可带 | 30 天 |
| 玩家邮件 | 玩家 | 是 | 不可带 | 7 天 |
| 补偿邮件 | GM | 是 | 可带 | 90 天 |
2.2 附件与领取
- 每封邮件最多 4 个附件。
- 领取时校验背包空间,空间不足则整封不领取。
- 支持一键领取所有可领取邮件,逐封事务处理。
- 附件过期未领取,邮件删除且不补发(高价值邮件可配置延长)。
2.3 状态
- 未读/已读、有附件/无附件、已领取/未领取。
- 已领取附件从邮件移除,邮件保留正文。
- 删除有未领取附件的邮件需二次确认。
3. 服务端设计
3.1 数据结构
struct Mail {
uint64_t mail_id;
uint64_t role_id;
uint8_t type;
uint32_t sender_id;
std::string title, body;
std::vector<MailAttachment> attachments;
uint64_t expire_ms;
bool read;
bool claimed;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| S→C | SC_MailList | 邮件列表 |
| S→C | SC_MailDetail | 邮件正文/附件 |
| C→S | CS_MailClaim | 领取单封 |
| C→S | CS_MailClaimAll | 一键领取 |
| C→S | CS_MailDelete | 删除 |
| C→S | CS_MailRead | 标记已读 |
| S→C | SC_MailNew | 新邮件提醒 |
3.3 发送与领取
发送:校验收件人/附件/过期时间 → 写 DB → 推送 SC_MailNew
领取:校验邮件归属/未领取/背包空间 → 扣附件 → 加背包 → 标记已领取 → 写日志
- 发送附件使用事务,物品从来源扣除与邮件写入同时成功。
- 领取按
mail_id幂等,重复请求返回已领取。 - 一键领取逐封处理,某封失败不影响其他邮件。
4. 客户端设计
- 邮件列表:发件人、标题、时间、附件图标、未读标记。
- 详情:正文、附件格、领取/删除按钮。
- 一键领取:显示可领取数量,领取后汇总弹窗。
- 附件过期倒计时,剩余 3 天高亮。
- 背包满时提示并保留邮件,不自动删除。
5. 配置
Mail.xml:type、expire_days、max_attachments、can_reply、auto_delete。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 背包满领取 | 拒绝,邮件保留 |
| 附件物品被删除 | 发送时校验,领取时按替代物/邮件说明处理 |
| 重复领取 | 幂等,不重复发奖 |
| 邮件过期 | 定时清理,高价值邮件延期 |
| 玩家改名 | 邮件按 role_id 绑定,不按名字 |
| 服务器重启 | 从 DB 恢复,未领取状态不变 |
7. 验收标准
- 五类邮件发送、阅读、领取、删除正确。
- 附件领取与背包事务一致,无复制/丢失。
- 一键领取逐封处理,失败不影响其他。
- 过期清理与倒计时准确。
- 邮件日志可按 role_id/mail_id 追溯。