Maildir 与 Mbox 有什么实际区别
Maildir 每封邮件一个文件,Mbox 每个邮箱文件夹一个文件。比较锁、删除、备份和损坏范围;性能取决于实现与负载,不能仅按格式给出通用排名。
直接回答:核心区别在存储粒度——Maildir 每封邮件一个文件,Mbox 一个邮件文件夹就是一个大文件。 由此派生出性能、可靠性、并发三方面的差异:频繁增删、多人并发、追求故障隔离的场景选 Maildir;强调简单、需要整体打包迁移的场景 Mbox 更顺手。
存储结构对比
Maildir
Maildir/
├── cur/ # 当前邮件,是否已读取决于文件名标志
├── new/ # 新投递邮件,不等同于所有未读邮件
├── tmp/ # 投递过程中的临时文件
└── .Sent/ # 子文件夹(以点开头的目录)
├── cur/
└── new/
Mbox
/var/mail/alice # 收件箱所有邮件顺序拼接在一个文件里
~/mail/Sent # 发件箱同样是一个文件
邮件之间用 From 开头的分隔行区分。
实际差异对照
| 维度 | Maildir | Mbox |
|---|---|---|
| 增删邮件 | 通常只更新相关邮件及索引 | 追加通常可直接写末尾,expunge 可能重写较多数据 |
| 文件损坏 | 单个邮件文件损坏影响较小,目录/文件系统损坏仍可能影响多封 | 可能整个文件夹报废 |
| 并发访问 | 投递设计避免单个邮箱大锁,但实现仍可能锁定目录、索引或 UID 状态 | 依赖文件锁,锁竞争易出问题 |
| 备份迁移 | 可增量同步(rsync 友好) | 单文件整体拷贝,增量不友好 |
| 磁盘开销 | 小文件多,inode 消耗大,小集群文件系统有额外元数据开销 | 空间利用紧凑 |
| 兼容性 | Dovecot、Postfix、Courier 等主流支持 | 几乎所有邮件软件都认识,历史最久 |
怎么选
- 邮件服务器(Dovecot/Postfix 生产环境):选 Maildir。高频投递、删除、多设备同步的场景下,还需比较磁盘、索引、备份与服务端实现,不能仅凭格式保证性能
- 导出归档、单用户本地客户端:Mbox 反而方便——一个文件夹拷走就是一个文件,Thunderbird 等客户端原生支持
- 海量小邮件 + 机械盘:留意 Maildir 的随机小文件 IO 与 inode 消耗,必要时评估 dbox(Dovecot 的折中格式)等替代
运维注意:Maildir 要盯 inode
Maildir 每封邮件至少占一个 inode。邮件量大、单个文件系统 inode 耗尽时,磁盘还有空间也写不进新邮件——这是邮件服务器的经典事故。规划时留意:
df -i /var/mail # 查看 inode 使用率
已有观测云环境时,可用 DataKit 磁盘采集器持续记录邮件所在挂载点的空间和 inode 使用情况,再与投递失败日志对照。先确认采集到的是邮件实际所在的文件系统;邮件队列长度和投递状态仍要从具体邮件服务的日志或指标获取。
常见问题(FAQ)
Q:Mbox 邮箱能直接转成 Maildir 吗?
A:可以。Dovecot 自带 dsync 迁移工具,也有 mb2md 等脚本。迁移前停写或选低峰期,迁移后校验邮件数量一致再切换配置。
Q:为什么 Mbox 删除一封邮件会很慢?
A:Mbox 是连续文件,删除中间一封邮件需要把其后所有内容前移重写。客户端可能先标记删除,expunge 才实际清理,不一定每次删除都重写整个邮箱,IO 和耗时自然可观;Maildir 删信只是删一个小文件。
Q:两种格式能混用吗?
A:同一邮件存储内不建议混用,但不同用户可以不同格式(取决于邮件服务器配置能力)。 Dovecot 可按用户配置存储;mail_location 是 2.3 系常见语法,新主版本按相应文档迁移,迁移期可以渐进切换。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。