メイルボックスの形式

次の話のネタの前提として以前に雑誌に書いたコラムを転載します。厳密に言えばコラムの元原稿からの転載ですが。



Muttで利用できるメイルボックスの形式の特徴を説明します。

mbox

一つのファイルに全てのメッセージを格納する形式で、各メッセージは次のように"From "で始まる行(From_行)で始まり、空白行で終わります。From_行の形式は大抵"From 送信者(envelope sender) 配送時間"です。

    From bar@example.org Fri, 16 Feb 2001 22:22:22
    Return-Path: 
    Date: 16 Feb 2001 11:11:11 -0000
    From: bar 
    To: foo 

    Hello, world!

このため、このFrom_行が各メッセージの区切りになりますが、本文中に"From "で始まる行がある場合に区別できなくなり問題になります。この対策として本文中の"From "の前に">"などを挿入して">From "のようにする方法と、次のメッセージの"From "行を示すために、へッダにメッセージサイズを記録する"Content-Length:"フィールドやメッセージの行数を記録する"Lines:"フィールドを挿入する方法があります。前者の方法ではメッセージを変更しているため電子署名の検証などで問題が生じます。後者の方法では、記録された数値が何らかの原因で間違っている場合に、メイラーがそのメッセージの全部を表示できないことがあります。なお、Muttは後者の方法で処理しています。

MMDF

mbox形式の変種の一つで各メッセージをControl-Aを4つ並べた行"^A^A^A^A"で囲みます。このため、From_行関係の問題は一切ありません。

MH

ディレクトリ内に一つのメッセージにつき一つのファイルで格納する形式です。ファイル名はそれぞれ1から始まる連続した番号になります(Muttのインデックスで表示する番号とは無関係です)。例えば次のようになります。

    $ ls inbox
    1  2  3

mboxやMMDFと違って既存のメッセージファイルそのものにはロックを掛ける必要はありませんが、MDAから配達されるメッセージに関してはロックの必要性があります。

Maildir

qmailというMTAで使われているメイルボックスの形式です。MHと同様にディレクトリ内に一つのメッセージにつき一つのファイルで格納する形式ですが、"tmp", "new", "cur"という三つのサブディレクトリを使用し、このディレクトリ構造とユニークなファイル名の仕様により、ファイルのロックが一切必要なく安全に使用できます。このため、NFSの環境でも安心して使えます。それぞれのサブディレクトリの役割は次のようになります。

  • tmp: 安全な配送を行なうために一時的に使われる
  • new: スプール
  • cur: メイラーがnewから読み取ったメイルを扱う

ディレクトリに格納されている例を示します。

    $ ls Maildir/*
    Maildir/cur:
    982378966.3456.deathstar:2,S

    Maildir/new:
    982378859.8752.deathstar

    Maildir/tmp:

ファイル名がtime.pid.hostの形式であるのがわかります。これがユニークであるための必用条件です。さらに、curディレクトリにあるファイルはファイル名の後尾に情報を付け加えることができます。このため、メッセージを解析しなくてもそのメッセージのステータス情報がわかります。

  • "R" (replied): 返信済
  • "S" (seen): 既読
  • "T" (trashed): 削除
  • "F" (flagged): ユーザ定義のフラグ

逆にmbox,MMDF,MHなどはへッダに"Status:フィールド"を挿入することで情報を保持しています。

お勧めのメイルボックスの形式

特に特定のメイルボックスを使いたい理由がないのでしたらMaildirをお勧めします。利点としては次のものがあげられます。

  • ファイルの破壊があった場合でも、局所的な被害ですむ。
  • メッセージの移動・コピーのコストが小さい。
  • メッセージをオリジナルのまま扱える。
  • 未読・既読などのステイタス情報の取得コストが小さい。

逆に、欠点としてはファイルの数が多くなり、それに伴う問題が生じる可能性があることくらいです。