地址、文件夹与会话
地址
addresses 表是按用户隔离的:每个用户可以注册多个地址,其中恰有一个 主地址。删除主地址会自动把最早的剩余地址提升为主地址。
InitPage 不会创建任何地址——每个用户在登录后到 设置 → 地址 自行添加。
文件夹
每个用户都有以下 系统文件夹(始终存在,不可删除):
inbox收件箱sent已发送drafts草稿箱starred虚拟文件夹:is_starred = 1且不在 trash/spam 中的邮件archive归档spam垃圾邮件trash软删除回收站,可清空
自定义文件夹(folders 表)按 UUID 寻址,而不是按名称;删除自定义文件夹时, 其中邮件会回到 inbox。
“移动到” 操作直接修改 messages.folder 的值。
会话(线程)
Lumen 在收到邮件时合成 thread_id:
- 有
In-Reply-To时,以其作为 thread。 - 否则取
References的第一个 token。 - 否则用本封邮件自己的
Message-ID作为 thread 根。
发件回复会继承父邮件的 thread_id,因此回复链在数据库中保持连续。 当前前端按文件夹平铺展示,GET /api/threads/:threadId 已可查询同一会话所有邮件, 可作为后续会话视图的数据来源。
搜索
/api/messages?folder=…&q=… 在 subject、preview、from_address、 to_addresses 上做 LIKE 查询。它不是全文索引——大邮箱建议改造为 D1 FTS5, 或交给一个独立的索引 Worker。
回收站语义
DELETE /api/messages/:id:
- 邮件 不在 trash 时,会被移动到 trash(软删除)。
- 已经在 trash 时,会硬删除:从 D1 删除行、从 R2 删除附件与原始
.eml。
POST /api/messages/trash/empty 对当前用户的 trash 做批量硬删除。