巨大な Thunderbird のメールボックスファイルを、メールを失わずに分割する方法
Thunderbird のフォルダは 1 個の mbox ファイルで、15 年も経てば、始まった当時のディスクより重くなります。小さなメールボックスに切り分ける方法を — Mbox Viewer と、オープンソースのターミナルツール mboxShell で — そして何より、1 通も失われていないことをあとから証明する方法を紹介します。
Thunderbird のフォルダはフォルダではありません。受け取ったすべてのメッセージが、届いた順に一つずつ並んだ、たった 1 個のファイルです。この設計は驚くほどうまく歳を重ねました — 2004 年に書かれたメールボックスが今日でも開けるのはそのおかげです — が、気づくのが遅れがちな副作用が一つあります。15 年も経つと受信トレイは 14 GB の単一の物体になり、その一部に対して何かしようとするたびに、全体を動かす羽目になるのです。
遅かれ早かれ、切り分ける理由はやってきます。弁護士から 1 年分のやり取りを求められる。会社を離れることになり、自分のものはプロジェクトのメールだけ。2008〜2015 年分は外付けドライブに置き、残りは日常的に使いたい。あるいは単に、フォルダが手に負えなくなり、別々にバックアップできる大きさに分けたい。
フォーラムでよく見かける助言は、split で切れ、テキストエディタで切れ、csplit で /^From / を目印に切れ、というものです。やめてください。理由と、代わりにすべきことを説明します。
mbox を手で切ると失敗する理由
mbox ファイルは、ただの連結です。各メッセージは From で始まる行 — From: ヘッダーではなくエンベロープ行 — から始まり、次のエンベロープ行まで続きます。形式としてはそれで全部です。
このファイルを任意のバイト位置や行で切れば、まず間違いなくメッセージの途中に着地します。前半はヘッダーの半分で終わり、後半はヘッダーが一切ない本文で始まる — それはもうメッセージではなく、ただのテキストです。どちらのファイルも見た目は問題なさそうで、開けますし、サイズも妥当です。そして被害が見えるのは何年もあと、まさにその 1 通を探した日だけです。
From というパターンで切るのは賢いやり方ですが、それでも安全ではありません。mbox 系の形式では、本文中の From で始まる行を >From と書いてエスケープしますが、あなたのメールボックスに書き込んできたすべてのプログラムがそうしたとは限りません。引用された返信には「From 」で始まる行が普通に含まれ得ます。パターンで分割すれば、そのメッセージは真っ二つに裂けます。1 通のメールが半分ずつ 2 通になり、それを知らせてくれるものは何もありません。
これがすべての手作業ルートに共通する本当の問題です。どの方法も件数を教えてくれません。何通入って、何通出てきて、その二つが一致するのかがわからない。メールボックスを安全に分割する方法は、それをテキストではなくメールとして扱うこと — 解析し、メッセージ単位で選び、書き戻すこと — そして最後に計算が合うか確かめることです。
切る前に:Thunderbird のファイルについて 3 つ
各メールボックスは、プロファイル内の拡張子のないファイルとして存在します。
- Windows:
%APPDATA%\Thunderbird\Profiles\<プロファイル>\Mail\Local Folders\ - macOS:
~/Library/Thunderbird/Profiles/<プロファイル>/Mail/Local Folders/ - Linux:
~/.thunderbird/<プロファイル>/Mail/Local Folders/
中には INBOX、Sent、Archives と自分で作ったフォルダ名が並び、それぞれ同じ名前の .msf ファイルが隣にあります。.msf は Thunderbird のインデックスにすぎず、無視して構いません(必要になれば作り直されます)。拡張子のないファイルこそがメール本体で、標準的な mbox 形式です。(詳しくは macOS と Windows のガイドをどうぞ。)
何かに触れる前に、3 つのルールがあります。
Thunderbird を終了する。 Thunderbird はファイルを開いたまま書き込み続けます。追記されている最中のメールボックスを分割すれば、末尾に半分のメッセージが残るのは当然の結果です。
コピーで作業する。 メールボックスファイルを別の場所に — デスクトップで十分です — コピーして、コピーのほうを分割してください。原本をプロファイルの外に出してはいけません。Thunderbird はそのフォルダが消えたと判断します。
先に「最適化」するか、何を持っていくか自覚する。 メッセージを削除しても、Thunderbird は印を付けるだけでファイルの中に残します。バイトが消えるのはフォルダを最適化(コンパクト化)したときです。表示上 4,000 通のフォルダが 9 GB になり得るのはそのためです。最適化せずに分割すれば、それらの削除済みメッセージも切片に付いてきます — しかも完全に読めるメールとして。要らなければフォルダを右クリック →最適化、要るなら意図的にこの手順を飛ばしてください。
ステップ 1 — 切る前に測る
どこで切るかを決める前に、ファイルの中身を実際に見ておきましょう。オープンソース(MIT)のターミナルツール mboxShell は、Thunderbird の拡張子なしファイルをそのまま読み、サイズの上限がなく、開いたファイルには決して書き込みません。
$ mboxshell stats INBOX
File INBOX
File size 9.41 GiB
Messages 128,455
Date range 2004-02-11 — 2026-08-19
Index size 14.2 MiB
Indexing time 48.31s
With attachments 19,880 (15.5%)
Duplicates 312 (128,143 Unique IDs)
この 2 つの数字 —メッセージ数と日付の範囲— を控えておいてください。最後に照合する相手です。
次に、何も生成せずに切り方を設計します。search は 1 区間の件数を数えてくれるので、切片が望むサイズになるまで境界を試せます。
$ mboxshell search INBOX "after:2004-01-01 before:2010-01-01" --json | head -3
{
"result_count": 31204,
after: はその日を含み、before: はその日を含みません。だからこの書き方で並べた連続する範囲は、すき間も重なりもなく、ぴったり接します。最後の検証が成立するのはこの性質のおかげです。検索構文の全体を使えば、日付ではなく差出人・サイズ・添付で切ることもできます。分割の本当の目的がそちらなら、そのほうが早いでしょう。
ステップ 2 — メールボックスを切る
Mbox Viewer(Mac と Windows)なら、分割はすでにご存じのエクスポートそのものです。
- コピーしたメールボックスファイルを開く — 拡張子のないまま、名前を変える必要はありません。
- 区間を検索する:
after:2004-01-01 before:2010-01-01。 - メッセージを選択する:最初の行をクリックし、最後の行を Shift+クリックすれば範囲全体が選べます。
- ファイル → 書き出す(⌘E)→ MBOX。Windows では エクスポート → MBOX へ… で、そこでは手順 3 を省略できます。何も選択していなければ、検索結果として画面に残っているものをすべて書き出します。
INBOX-selection.mbox という名前が提案され、そのメッセージだけが入った新しいメールボックスが 1 個できます。バイト単位でそのままコピーされるので、結果はどのメールソフトでも開ける正しいメールボックスです。そして開いたファイルには一切触れません — アプリは厳密に読み取り専用です。区間ごとに繰り返してください。MBOX への書き出しは無料版に含まれます。無料版が制限しているのは開けるメールボックスのサイズで、1 GB までです。
mboxShell だけで済ませる場合は道筋が変わります。はっきり書いておくと、mboxShell が書き出せるのは EML・CSV・テキスト・HTML で、部分的な mbox は書きません。つまりターミナル一本の道は、各区間を EML ファイルのフォルダとして書き出し、取り込み時に Thunderbird にメールボックスを組み立て直させる、というものです。
$ mboxshell export INBOX --format eml --query "after:2004-01-01 before:2010-01-01" --output ./2004-2009/
Exporting 31204 message(s) as eml to ./2004-2009/
Exported 31204 .eml files
遠回りではありますが、無料で、サイズの上限がなく、スクリプトにもできます。仕事のもう半分 — メールボックスをまとめるほう — なら、mboxShell は mbox として書き出します:mboxshell merge a.mbox b.mbox -o merged.mbox。
ステップ 3 — 何も失われていないことを証明する
分割を「賭け」と分ける工程であり、そして、ほとんど誰もやりません。
切片ごとに数える。 各区間に stats をかけ、メッセージ数を合計します。合計は原本の件数と一致しなければなりません。足りなければ境界が間違っていますし、多ければ 2 つの区間が重なっています。
日付の範囲を確認する。 各切片の範囲は指定した境界の内側に収まり、切片どうしはすき間なく端で接しているはずです。
原本を組み直して比べる。 これが決定打です。切片を結合し — Message-ID による重複排除は既定で有効です — 要約を読みます。
$ mboxshell merge 2004-2009.mbox 2010-2017.mbox 2018-2026.mbox -o rebuilt.mbox
Merge complete:
Input files 3
Total messages 128,455
Duplicates removed 0
Output size 9.41 GiB
Output file rebuilt.mbox
Total messages が原本の件数と一致し、Duplicates removed が 0 —— この 2 つが揃えば、切片は全体として過不足がなくかつ互いに重なっていないことになります。つまり、どのメッセージもちょうど 1 つの切片に入っている、ということです。重複が出れば範囲が重なっていますし、合計が少なければ何かが 2 つの切れ目の間に落ちています。どちらにせよ、何かを削除する前に気づけます。それこそがこの工程の目的です。
そこまで来て初めて、原本を片付けるのが理にかなった判断になります。それでも、捨てずに取っておいてください。ディスクは、取り戻せないメールより安いのですから。
ステップ 4 — 切片を Thunderbird に戻す
切片を別々のフォルダとして Thunderbird に残すなら、無料のアドオン ImportExportTools NG が mbox ファイルをローカルフォルダに新しいフォルダとして直接取り込めます。EML ファイルのディレクトリを取り込むこともでき、これで mboxShell ルートが閉じます。ファイルを手でプロファイルに放り込むのではなく、Thunderbird を起動したままアドオン経由で行ってください。そうすれば Thunderbird は自分で .msf インデックスを作り、自分が何を持っているかを把握できます。
そして切片が戻る必要のないもの — 弁護士に渡す 1 年分、外付けドライブに置く保存分 — であれば、戻す必要はありません。どれも標準の mbox ファイルです。Mbox Viewer で開けますし、mboxShell でも開けます。20 年後にメールを読む何かでも、きっと開けるでしょう。あとから登場した形式の大半については、そうとは言えません。
やってはいけないこと
- ステップ 3 の計算が合うまで、原本を削除しない。
split、dd、テキストエディタでバイトや行で分割しない。数ギガバイトのメールボックスをエディタで開くこと自体、やめておきましょう。- プロファイル内で原本の名前を変えたり移動したりしない。 Thunderbird はフォルダをファイル名で識別します。
- 数えていない切片を信用しない。 開けるファイルと、完全なファイルは、同じではありません。
Mbox Viewer でアーカイブを開く
Mac と Windows のネイティブ アプリ。あらゆるサイズの MBOX・EML ファイルを完全にオフラインでストリーミングします。