Maildir電子メール形式は、 電子メールメッセージをデータベースではなくファイルシステムに保存する一般的な方法です。各メッセージには一意の名前を持つファイルが割り当てられ、各メールフォルダはこれらのファイルを含むファイルシステムディレクトリです。Maildirは、 1995年頃にDaniel J. Bernsteinによって設計され、ローカルファイルシステムを使用することで、ファイルのロックとロック解除を処理するプログラムコードの必要性を排除することを主な目標としていました。[ 1 ] Maildirの設計は、電子メールメッセージに対して有効な操作は、作成、削除、または何らかの形でステータスを変更することだけであるという事実を反映しています。

仕様
[編集]Maildirディレクトリ(多くの場合Maildir)には通常tmp、new、 という3つのサブディレクトリがありますcur。[ 2 ]
- この
tmpサブディレクトリには、配信中の電子メールメッセージが一時的に保存されます。また、他の種類の一時ファイルも保存される場合があります。 - サブ
newディレクトリには、配信されたが、どのメール アプリケーションでもまだ表示されていないメッセージが保存されます。 - サブ
curディレクトリには、メールアプリケーションで既に閲覧されたメッセージが保存されます。[ 3 ]
メールディレクトリ++
[編集]Courier Mail Serverなどのソフトウェアの作者であるSam Varshavchik氏は、Maildir形式のMaildir++拡張[ 3 ] [ 4 ]を定義し、サブフォルダとメールクォータをサポートしました。Maildir++ディレクトリには、名前が「.」(ドット)で始まるサブディレクトリが含まれており、これらもMaildir++フォルダです。この拡張は、 tmp、new、curに加えてサブディレクトリもサポートする元のMaildir仕様に準拠しています。
技術的な操作
[編集]メール配信エージェントは、電子メールメッセージをMaildirに配信するプログラムです。メール配信エージェントはtmp、ディレクトリ内に一意のファイル名を持つ新しいファイルを作成します。[ 5 ] [ 6 ] [ 3 ]発明当時、一意のファイル名を効率的に保証することは困難でした。qmail [ 1 ]の一意のファイル名アルゴリズムは以下のとおりでした。
- 現在のUnix時間を読み取る
- 現在のプロセス識別子(PID)を読み取る
- 現在のホスト名を読み取る
- 上記の3つの値をピリオド文字で区切られた文字列に連結します。これが新しいファイル名です。
stat()ファイル名が存在すると報告された場合は、2秒待ちます- ファイル名が存在しなくなるまで前のステップに戻る
- 一意のファイル名でファイルを作成し、メッセージの内容を新しいファイルに書き込みます。
2000年までに、qmailの作者は更新された仕様[ 5 ]において、プロセスごとのカウンタ値をPIDに追加することを推奨しました。このカウンタの値は、配信ごとにインクリメントされるべきです。「2秒待つ」というレート制限の推奨事項は削除されました。
2003年までに、勧告はさらに修正され、PIDとカウンタの代わりに、1つ以上のプロセスから同じmaildirに複数の同時配信があった場合でも、ファイル名の中央部分は「以下の文字列を連結して一意性を保証する」ように要求されました。[ 7 ]
- # n、ここでnは (16 進数で) オペレーティング システムのシステム コールの出力で
unix_sequencenumber()あり、再起動後に 0 から始まり、呼び出されるたびに 1 ずつ増加する数値を返します。- X n、ここでnはオペレーティングシステムのシステムコールの出力(16進数)
unix_bootnumber()で、システムの起動回数を報告します。# と組み合わせることで、一意性が保証されます。ただし、残念ながら、ほとんどのオペレーティングシステムは と をサポートしていませunix_sequencenumber()んunix_bootnumber()。- R n、ここでnは(16進数で)オペレーティングシステムのシステムコールの出力
unix_cryptorandomnumber()、または などの同等のソースです/dev/urandom。残念ながら、一部のオペレーティングシステムには暗号乱数ジェネレータが含まれていません。- I n、ここでnは(16進数で)このファイルのUNIX inode番号です。残念ながら、inode番号はNFS経由で常に利用できるとは限りません。
- V n、ここでnは(16進数で)このファイルのUNIXデバイス番号です。残念ながら、NFS経由ではデバイス番号が常に利用できるとは限りません。(デバイス番号は標準のUNIXファイルシステムでも役に立ちません。maildir と が動作するには、単一のUNIXデバイス内に存在する必要があります
link()。rename())- M n、ここでn
gettimeofday()は (10 進数で)一意の名前の左側部分に使用されるものと同じマイクロ秒カウンターです。- P n、ここでnはプロセス ID (10 進数) です。
- Q n、ここでn (10 進数) はこのプロセスによって行われた配達の数です。
この 2003 年のアルゴリズムは、 2006 年にDovecotの作成者Timo Sirainenによって不必要に複雑であるとして批判されました[ 8 ]。
2023年11月時点で、qmailの作者であるDaniel Bernsteinは、2003年のファイル名生成の推奨事項にそれ以上の変更を加えていません。[ 9 ]現代のPOSIXシステムでは、 Cライブラリ関数を使用して一時ファイルを安全に作成できますmkstemp。
配送プロセスは、 を作成して に書き込み、次にこのファイルを に移動することによって、メッセージを maildir に格納します。この移動は を使用して実行でき、これは多くのシステムでアトミックです。[ 10 ]あるいは、を にハードリンクし、次に からファイルのリンクを解除することによって実行できます。残ったファイルは最終的に削除されます。このシーケンスにより、maildir 読み取りプログラムが、書き込まれていないメッセージを参照することがなくなります。maildir を同時に読み取るプログラムは複数存在できます。これらのプログラムは、サーバーのファイルシステムに直接アクセスするメールユーザーエージェント(MUA) から、リモート MUA に代わって動作するインターネットメッセージアクセスプロトコルまたはポストオフィスプロトコルサーバー、そして maildir 構造を認識するかどうかわからないbiffやrsyncなどのユーティリティまで多岐にわたります。読者は を決して見てはいけません。tmp/uniquefilenamenew/uniquefilenamerenamenewtmptmp
認識可能なmaildir読み取りプロセス(POPまたはIMAPサーバー、あるいはローカルで動作するメールユーザーエージェント)がnewディレクトリ内でメッセージを見つけると、それらを に移動する必要がありますcur。これは、ユーザーに「X件の新着メッセージがあります」と通知する手段にすぎません。[ 11 ]この移動は、アトミックファイルシステム を用いて行う必要がありますrename()。代替のリンク・アンド・アンリンク手法は非アトミックであり、メッセージが重複する可能性があるためです。この段階で、ファイル名に情報サフィックスが付加されます。これは、コロン(ファイル名の固有部分と実際の情報を区切るため)、"2"、カンマ、および様々なフラグで構成されます。"2"は、カンマに続く情報のバージョンを指定します。現在公式に指定されているバージョンは"2"のみで、"1"は実験的なバージョンです。仕様では、メッセージが既読か削除されたかなどを示すフラグが定義されています。フラグは、「Passed(承認済み)」、「Replied(返信済み)」、「Seen(閲覧済み)」、「Trashed(ゴミ箱へ移動)」、「Draft(下書き)」、「Flagged(フラグ付き)」などの頭文字(大文字)です。[ 7 ]アプリケーションは、この非常に限られたフラグセットを補完することがよくあります。たとえば、notmuch [ 12 ] は、任意のユーザー定義フラグに加えてフラグ同期機能を提供します。[ 13 ] Dovecot は、26 個の IMAP キーワードを小文字で照合します。 [ 6 ]これには、$ MDNSentなどのキーワードやユーザー定義フラグが含まれる場合があります。
Maildirはロックなしで使用できるように設計されていましたが、実際にはMaildirを使用するソフトウェアの中には、Dovecotのようにロックを使用するものもあります。[ 14 ]
ファイルシステムの互換性の問題
[編集]Maildir標準は、ファイル名にコロンを受け入れるシステムでのみ実装できます。[ 15 ]
ファイル名にコロンを使用できないシステム(Microsoft WindowsやNovell Storage Servicesの一部の構成など)では、「;」や「-」といった非標準の代替区切り文字を使用できます。フリーソフトウェアやオープンソースソフトウェアにパッチを適用して別の区切り文字を使用するようにすることは、多くの場合簡単です。 [ 16 ]
この代替セパレータ文字が何であるべきかについて現在合意が得られていないため、これらのシステム上で動作するMaildir対応プログラム間で相互運用性に問題が生じる可能性があります。しかし、すべてのMaildir関連ソフトウェアがセパレータ文字を認識する必要はありません。なぜなら、すべてのMaildir関連ソフトウェアがメッセージのフラグ(「既読」、「返信済み」など)の読み取りや変更を行う必要はないからです。日付のみに基づいてMaildirにメッセージを配信したり、古いメッセージをアーカイブしたりするだけのソフトウェアは、どのようなセパレータが使用されていても動作するはずです。MUAのみがメッセージフラグの読み取りや変更を必要とし、かつ使用されるMUAが1つだけであれば、非標準の代替セパレータを使用しても相互運用性に問題が生じることはありません。
Maildirを直接サポートするソフトウェア
[編集]- Dovecot IMAPサーバー
- Courier Mail Server SMTP および IMAP サーバー。Maildir++ 形式が発明された。
- SendmailオリジナルのSMTPサーバー
- Exim SMTPサーバー
- Postfix SMTPサーバー
- Maildir形式が発明されたqmail SMTPサーバー
- MeTA1 SMTPサーバー
- OpenSMTPD SMTPサーバー
- Rustで実装された堅牢なメールサーバー、SMTP および IMAP サーバー
- プロックメール
- Dovecot配信エージェント
- メールドロップ
- getmail は、 Fetchmailに代わる Maildir 対応のメール取得および配信エージェントです。
- fdm
- muchsync は、任意の数のレプリカ間でnotmuch メールメールボックスを同期します。
- オフラインIMAP
- isync はメールボックスを同期し、Maildir と IMAP4 をサポートします。
- Attomail は、Haskell で実装された最小限の Maildir 対応 MDA です。
- aerc [ 17 ](効率的で拡張可能な電子メールクライアント)
- Balsa は以前は公式 GNOME メール リーダーでした (Evolution 以前)
- Cone はcurses ベースのメールリーダーです
- Evolution、公式GNOMEメールクライアント
- GNUメール
- ヌース
- KMail、KDE メールリーダー
- メールx
- 雑種
- Notmuch [ 18 ](高速、グローバル検索、タグベースのメールシステム)
- パイン/アルパイン
- Mozilla Thunderbird – 実験的なものであり、「まだ多くのバグがあるためデフォルトで無効になっています」[ 19 ]
注釈と参考文献
[編集]- ^ a b Bernstein, Daniel J. (1995). "maildir(5)" . 1997年10月12日時点のオリジナルよりアーカイブ。 2018年11月23日閲覧。
- ^ ブラム、リチャード (2001). Postfix . サムズ出版. ISBN 978-0-672-32114-6。
- ^ a b c Varshavchik, Sam (2009). "maildir(5)" . 2024年4月17日時点のオリジナルよりアーカイブ。 2024年8月9日閲覧。
- ^ Varshavchik, Sam (2011). 「Maildir++」 . 2024年5月29日時点のオリジナルよりアーカイブ。2024年8月9日閲覧。
- ^ a b Bernstein, Daniel J. (c. 2000) [初版2000年以前]. 「maildir形式の使用」 . 2000年9月2日時点のオリジナルよりアーカイブ。2018年11月23日閲覧。
- ^ a b Dovecot Wiki: maildir 形式
- ^ a b Bernstein, Daniel J. (2003) [この文書の初版は2000年以前に初版が発行されたものです]. 「maildir形式の使用」 . 2003年4月1日時点のオリジナルよりアーカイブ。2018年11月23日閲覧。
- ^ シライネン、ティモ。「Maildir メールボックス形式: メール配信」"。2024年6月24日にオリジナルからアーカイブ。2024年8月9日に取得。
こうした面倒な作業はむしろ無意味です。メールが上書きされないことを本当に保証するのは最初のステップだけで、残りはただ聞こえが良いだけです。時折問題を検出することはあっても、保証された保護は提供されず、重複したファイル名を簡単に通過させて既存のメールを上書きしてしまいます。¶ ステップ2は、ステップ2と3の間に競合状態が発生するため無意味です。PID/ホストの組み合わせ自体が、そのようなファイルが見つからないことを保証しているはずです。もし見つかった場合、何かが壊れており、stat()チェックは役に立ちません。別のプロセスが同時に同じことを実行している可能性があり、tmp/にある同じファイルに書き込むことになり、メールが破損する可能性があるからです。¶ ステップ4で、Maildirに同一のファイルが既に存在する場合、link()は失敗しますよね?違います。ファイルはすでにcur/に移動されている可能性があります。ディレクトリであり、その時点では任意の数のフラグが含まれている可能性があるため、単純な stat() で存在するかどうかを確認できなくなります。¶ ステップ 2 は、クロックが逆方向に進んでいる場合に便利であると指摘されました。ただし、同一のベース ファイル名がすでに cur/ 内に存在する可能性があるため、実際の安全性は保証されません。さらに、システムを再起動しただけであれば、tmp/ 内のファイルはおそらく安全に上書きされる可能性があります (new/ に link() されていないと仮定)。¶ つまり、Maildir でメールが上書きされないようにするために重要なのは、ステップ 1 だけです。常に、一意であることが保証されたファイル名を作成します。Qmail のマニュアル ページで説明されている 2 秒間の待機などは忘れてください。
- ^ 「Wayback Machine snapshots of cr.yp.to/proto/maildir.html」 . Internet Archive . 2023年. 2023年5月3日時点のオリジナルよりアーカイブ。 2023年11月23日閲覧。
{{cite web}}: CS1 maint: bot: 元のURLステータス不明(リンク) - ^ "rename" . The Open Group . 2013. 2016年7月23日閲覧。
この仕様では、関数のアクションがアトミックであることが要求されています。
- ^ Sam Varshavchik (2016年7月25日). 「maildir構造の管理」 . courier-users (メーリングリスト) . 2016年7月26日閲覧。
- ^ 「Notmuchメールシステムのホームページ」notmuchmail.org . 2019年6月22日閲覧。
- ^ "notmuch 0.38.3 ドキュメント" . notmuch-config . 2024年4月17日閲覧。
- ^ Sirainen, Timo . 「Maildir Mailbox Format: Locking」 . 2024年6月24日時点のオリジナルよりアーカイブ。2024年8月9日閲覧。
- ^ 「mailbox — 様々な形式のメールボックスを操作する」 . Pythonドキュメント. 2023年6月19日閲覧。
- ^ mutt maildir サポート: コロンを受け付けないファイルシステムに対する回避策
- ^ 「aerc - 世界最高の電子メールクライアントのホームページ」aerc-mail.org .
- ^ 「Notmuchメールシステムのホームページ」notmuchmail.org . 2019年6月22日閲覧。
- ^ 「ThunderbirdのMaildir」 . mozilla.org . 2020年12月6日閲覧。