# 有界 mboxrd 字节流与 Maildir 归档库

仓库：https://github.com/liubin-dev/moonbit-mailbox
模块 `liubin-dev/mailbox`，本地 **0.10.0**。自有源码 MIT；MoonMIME 编译代码 Apache-2.0。仅本地整改，未推送、发布或复申。

从大于内存预算的稳定 mboxrd 文件逐封提取邮件，保留非 UTF-8 原始字节和原始文件位置，导入新 Maildir；MIME 内容继续由现有 [MoonMIME 0.3.0](https://github.com/oyjh0381/MoonMIME) 处理。新 MoonBit 核心负责分块边界、From 引用还原、资源预算、截断识别和失败状态。它不实现另一套 MIME 语义。

## 直接运行

固定工具链见 [TOOLCHAIN](TOOLCHAIN.md)，宿主需 Node 24。在仓库根目录运行：

```sh
moon update
moon build --target js
node tools/refresh-engines.mjs
node examples/run-mbox-stream.mjs
node tools/mbox-import.mjs SOURCE.mbox NEW_OUTPUT_DIRECTORY
```

示例用两封原创合成邮件：第一封含 NUL/非 UTF-8 字节，存储后交 MoonMIME 成功检查；第二封 LF-only 邮件被其严格模式拒绝，原始字节照样保留。例子打印含输入、Maildir 和 report.json 的临时目录，不冒充客户案例。

真实导入命令接受调用方提供的文件，目标目录必须不存在且导入期间由调用者独占。0.10.0先写隐藏的 `.maildir.partial`，整份输入验证、写入和关闭成功后才发布 `maildir`。中途失败退出2，正式Maildir不会出现，暂存邮件与 `import.ndjson` 留作诊断；不能原目录重试。成功消费者要求 `maildir/.import-complete.json` 与最后清单均为完整，不能只看清单。清单仍记录每封消息SHA256、envelope和源字节范围。[发布合同与失败验证](IMPORT-PUBLICATION.md)。它不自动做MIME检查，不把格式错误当附件/恶意邮件判定。

## 可复用核心

`MboxrdDecoder::new` / `feed(Bytes)` / `finish()` 返回 `RawMessage`；JS/Wasm-GC 使用同一纯 MoonBit 实现。调用方可只用核心，不依赖 Node、Maildir 或 MoonMIME。默认单封 32 MiB、单行 1 MiB、单次输入 1 MiB；整个邮箱不受旧文本接口的 16 Mi UTF-16 单位限制。消息输出由调用者及时消费，未宣称全进程恒定内存。

[完整语义合同](MBOX-STREAM.md)、[公共 API](pkg.generated.mbti)、[上游分工](MOONMIME-INTEGRATION.md)。Node 流适配器 `decodeMboxrd` 随消费者逐条拉取，暂停消费时不持续读取源。CLI 是文件宿主，容器语义与判断不在脚本里重写。

## 验证与局限

新核心以固定字节期望遍历全部两段切点和单字节分块；验证截断、预算、消息位置和失败后拒绝复用。JS/Wasm-GC 各9项核心测试，4项宿主测试，其中4096封合计32 MiB内容逐条核对。另用独立编写的 Python 规范模型比对120个邮箱、644封消息；它不是第三方实现互通证明。详细范围和实跑回执见 [TESTING](TESTING.md)。

必须明确输入是 mboxrd。mboxo/mboxcl/mboxcl2、未正确引用的 `From ` 正文有不同或歧义语义，不能猜测修复。严格要求容器结束空行，不补齐截断文件。源文件须稳定；没有并发快照、崩溃恢复、目录 fsync 或整个邮箱事务保证。MIME 拒绝与容器失败分开，原字节不会被偷换成更容易解析的形式。

旧 MIME API 和 `parse_mboxrd(String)` 为兼容保留，不是本次独立贡献。旧用法在 [历史说明](README-BEFORE-VALUE-REWORK.md)；当前 [申报正文](PROPOSAL.md) 和 [驳回回应](REVIEW-RESPONSE.md) 以这版为准。暂无确认使用方或上游共同维护关系，功能完成不等于过审。

0.9.0当前流式容器检查的实跑命令与版本见 [stream-20260927/LOCAL-CHECKS.json](evidence/stream-20260927/LOCAL-CHECKS.json)；更早MIME/字符串接口记录不代替此回执。

0.10.0本次只修改文件导入宿主及失败发布合同，新增3组针对性实跑，不把0.9.0核心测试重新计作本次运行。当前证据：[publication-20260927/LOCAL-CHECKS.json](evidence/publication-20260927/LOCAL-CHECKS.json)。

## 本地验收与公开交付（2026-09-28）

核心实现使用 MoonBit；[固定编译器](.moonbit-version)为 `moonc 0.10.14+7d59c7ec9`。先按本文安装宿主依赖、运行 `moon update`，再从仓库根目录执行以下与 [CI](.github/workflows/ci.yml) 对齐的检查；可运行任务和适用边界见本文前面的示例与说明。

```sh
moon check --deny-warn
moon test --target wasm-gc --deny-warn
moon test --target js --deny-warn
moon build --target js --deny-warn
moon package
```

跨平台复核（2026-09-28，本地 Ubuntu-D 26.04 WSL2）：从当时的源码归档全新解包，固定 `moonc 0.10.14+7d59c7ec9` 下通过 `moon update`、`moon fmt --check`、`moon info`、严格检查、JS/Wasm-GC 测试及 JS release 构建；Node 24.21.0 跑通本仓一条宿主入口。本次补记仅修改文档，代码与 CI 未变；复核日志在本地交接包中，公开提交后的 GitHub Actions 仍须单独核对。

本地核验：JS/Wasm-GC 测试、浏览器/CLI/mbox/MoonMIME 示例与有界输入检查通过。 `moon package` 已完成离线打包预检，它不等于已发布到 Mooncakes。

公开交付（2026-09-28 核对）：当日 [https://github.com/liubin-dev/moonbit-mailbox](https://github.com/liubin-dev/moonbit-mailbox) 可匿名读取 Git HEAD，Mooncakes 在线版本为 `0.6.0`；此处源码版本 `0.10.0` 仍需由团队同步到公开仓库，检查新提交的 GitHub Actions，再由对应账号发布 Mooncakes 新版。相关远端 CI 与赛事结果仍需以实际记录核对。项目许可见 [LICENSE](LICENSE)；如使用第三方材料，其来源和许可见仓内相应说明。
