Q32: 如何设计邮件系统?
核心结论
游戏邮件系统本质上不是“站内信”,而是“离线投递加附件结算系统”。
真正难点通常不在收件箱界面,而在:
- 附件是否可重复领取
- 邮件是否可批量投递
- 过期和删除怎么处理
- 系统邮件与玩家邮件是否共用一套链路
只要涉及附件,邮件系统就已经进入资产系统范畴。
一、先区分邮件类型
常见至少有:
- 系统邮件
- 活动奖励邮件
- GM 补偿邮件
- 玩家互动邮件
- 战报或结算邮件
它们的规模、审计要求和风控要求都不一样,不应完全共用一套简单逻辑。
二、邮件系统真正的核心能力
通常包括:
- 投递
- 列表查询
- 标记已读
- 领取附件
- 过期清理
其中最关键的是附件领取,因为这一步直接影响资产正确性。
三、附件领取必须具备幂等
只要客户端重试、断线重连、重复点击、超时重发存在,附件领取就必须防重复。
更稳妥的做法通常是:
- 邮件状态和附件状态分开管理
- 领取动作有明确幂等保护
- 资产发放有流水
否则很容易出现重复领取事故。
四、系统邮件和玩家邮件为什么应区别对待
1. 系统邮件
特点通常是:
- 发送量大
- 内容模板化
- 附件标准化
更适合做批量投递或逻辑投递。
2. 玩家邮件
特点通常是:
- 数量少
- 交互更强
- 风控要求更高
例如要限制骚扰、频率和非法交易风险。
五、邮件存储不一定是一封信一份完整拷贝
特别是系统邮件海量群发时,如果每个玩家都复制完整正文和附件,会很浪费。
更合理的思路通常是:
- 模板和正文分离
- 投递记录与模板关联
- 玩家收件箱只保存归属和状态
这样更容易支撑大批量活动邮件。
六、过期和删除要先定规则
邮件系统长期最容易失控的地方是生命周期管理。
需要先定义:
- 未领取附件多久过期
- 已领取邮件保留多久
- 未读邮件能否删除
- 删除是逻辑删除还是物理清理
这些规则直接决定清理作业和用户体验。
七、离线通知和实时通知要分开
玩家在线时,可以实时提示“收到新邮件”;玩家离线时,只需保证投递结果正确。
不要把“提醒”误当成“投递成功”的定义。
真正权威的是:
- 邮件是否进入可查询状态
- 附件是否已成功领取并记账
八、工程上更稳妥的组合
常见做法是:
- 邮件主表或模板表保存邮件元数据
- 收件关系表保存每个玩家的邮件状态
- 附件领取走幂等资产发放链路
- 定时任务清理过期邮件
这样能把展示、投递、资产结算拆开。
九、常见误区
1. 邮件系统只是聊天的离线版本
不对。只要有附件,它就已经是资产系统的一部分。
2. 一封邮件删掉就完了
如果有未领取附件、审计要求或批量模板投递,删除逻辑并不简单。
3. 批量发邮件就是循环 insert
规模一上来,这会给数据库和任务系统带来很大压力,通常需要模板化和批量化设计。
参考资料
- 各类在线游戏系统邮件、补偿邮件与附件幂等实践资料
