このドキュメントは Postfix アーキテクチャの概要を示しており、また全ての Postfix コマンドやサーバプログラムへのポインタがわかる場所となっています。 文章でそれぞれのコマンドやサーバプログラムが使われる一般的な場面を示し、 特定の利用例や背景の情報があるドキュメントへのポインタを提供します。
このドキュメントがカバーしている話題:
メッセージが Postfix メールシステムに入ってくると、内部でまず止まるのは incoming キューです。 以下の図は新しいメールに関する主なプロセスを示しています。数字が続く名前は Postfix コマンドまたはサーバプログラムであり、斜線部分の数字のない名前は Postfix キューを表しています。
trivial-
rewrite(8)ネットワーク -> smtpd(8)
^
||
v\ ネットワーク -> qmqpd(8) -> cleanup(8) -> incoming / pickup(8) <- maildrop ^
|ローカル -> sendmail(1) -> postdrop(1)
ネットワークメールは smtpd(8) または qmqpd(8) サーバを通して Postfix に 入ってきます。これらのサーバは SMTP または QMQP プロトコルによる カプセル化を解き、Postfix を保護するためにいくつかのサニティチェックを おこない、cleanup(8) サーバに送信者や受信者、 メッセージの内容を与えます。smtpd(8) サーバは SMTPD_ACCESS_README ドキュメントに 記述されているように望まないメールをブロックするように設定することが できます。
ローカルでの投函は Postfix sendmail(1) 互換コマンドによって受け取られ、特権を持つ postdrop(1) コマンドによって maildrop キューに入れられ ます。この処理は Postfix メールシステムが動いていない間でも動きます。 ローカル pickup(8) サーバはローカル投函を拾い、 Postfix を保護するためにいくつかのサニティチェックをおこない、 cleanup(8) サーバに送信者や受信者、メッセージの 内容を与えます。
内部ソースからのメールは直接 cleanup(8) サーバに渡されます。これらのソースは図では表されていませんが、以下のものが 含まれます: local(8) 配送エージェントによって 転送されたメール (次のセクションを参照)、bounce(8) サーバによって送信者に返されるメッセージ (次の次のセクションを参照)、 および Postfix の問題の postmaster への通知。
cleanup(8) サーバはメールがキューに 入れられる前の最後の処理ステージを実装しています。見つからない From: や 他のメッセージヘッダを加え、 ADDRESS_REWRITING_README ドキュメントに書かれているようにアドレスを変換します。オプションで cleanup(8) サーバは BUILTIN_FILTER_README ドキュメントに書かれているような、正規表現を使った軽いコンテンツ検査を おこなうように設定することもできます。cleanup(8) サーバはその結果を 1つのファイルとして incoming キュー に置き、 キューマネージャ (次のセクションを参照) に新しいメールが来たことを 知らせます。
trivial-rewrite(8) サーバは アドレスを ADDRESS_REWRITING_README ドキュメントに書かれているように、標準的な "user@fully.qualified.domain" 形式に書き換えます。Postfix は今のところ書き換え言語を実装していませんが、 テーブル検索や、必要ならば正規表現を使って多くのことができます。
メッセージが incoming キュー キューに入ったら、次のステップでそれを配送します。図は Postfix メール 配送機構の主なコンポーネントを示しています。数字が続く名前は Postfix コマンドまたはサーバプログラムであり、斜線部分の数字のない名前は Postfix キューを表しています。
trivial-
rewrite(8)smtp(8) -> ネットワーク /
^
||
v- lmtp(8) -> ネットワーク / incoming -> active -> qmgr(8) --- local(8) -> ファイル、コマンド
^
||
v\ - virtual(8) -> ファイル deferred \ pipe(8) -> コマンド
キューマネージャ (図の qmgr(8) サーバ プロセス) は Postfix メール配送の心臓部です。smtp(8) または lmtp(8)、local(8)、 virtual(8)、pipe(8)、 discard(8)、error(8) 配送エージェントに接触し、1つ以上の受信者アドレスに対する配送要求を送ります。 discard(8) および error(8) 配送エージェントは特別です: すべてのメールを破棄するかバウンスします。これは 上の図では示されていません。
キューマネージャは配送のためにオープンされたメッセージを持つ小さな active キュー キューを 管理します。active キュー は潜在的に大きな incoming または deferred キュー の限られた窓として振る舞います。 active キュー を制限する ことで、キューマネージャは高負荷時にメモリを使い果たさないようにします。
キューマネージャは配送できなかったメールに対して、別の deferred キュー を 管理し、大量のメールのバックログが通常のキューアクセスを遅くしないように します。遅延メールの配送試行に関するキューマネージャの戦略は QSHAPE_README および TUNING_README ドキュメントに書かれて います。
trivial-rewrite(8) サーバは それぞれの受信者アドレスを ADDRESS_CLASS_README ドキュメントに 定義されているようにローカルおよびリモートアドレスクラスに従って解決 します。追加のルーティング情報はオプションの transport(5) テーブルで指定されます。 trivial-rewrite(8) はオプションで アドレスを変更した受信者を relocated(5) に問い合わせます; そのような受信者宛のメールは説明付きで送信者に 返されます。
smtp(8) クライアントは配送先ホストの メール交換機のリストを検索し、優先度で並び替え、応答するサーバが見つかる までそれぞれのサーバを順番に試します。そして送信者や受信者、メッセージの 内容を SMTP プロトコルで要求されるようにカプセル化します; これには 8-bit MIME の 7-bit エンコードへの変換も含まれます。
lmtp(8) クライアントは Cyrus のような メールボックスに配送するサーバに最適化された、SMTP に似たプロトコルを 話します。これを設定する利点は 1つの Postfix マシンが LMTP で複数の メールボックスサーバに入力できることです。その逆も成り立ちます: 1つのメールボックスサーバが複数の Postfix マシンから LMTP で入力を 受けることもできます。LMTP_README ドキュメントには lmtp(8) クライアントの利用方法の 例があります。
local(8) 配送エージェントは UNIX 形式の メールボックス、qmail 互換の maildir ファイル、Sendmail 形式のシステム 全体の aliases(5) データベース、および Sendmail 形式のユーザごとの .forward ファイルを理解します。複数の local 配送エージェントを並列に走らせることは可能ですが、同じユーザへの 並列配送は通常制限されます。
local(8) 配送エージェントはローカル配送の 代替形式を呼び出すことができます: ユーザのホームディレクトリにあるメール ボックスに配送するように設定できますし、メールボックス配送を procmail の ような外部コマンドに委任するようにも設定できますし、別の Postfix 配送 エージェントに配送を委任することもできます。
virtual(8) 配送エージェントは UNIX 形式のメールボックスまたは qmail 形式の maildir ファイルのみに 配送する、最低限の機能を備えた配送エージェントです。この配送 エージェントは複数のドメインに対してメールを配送できるため、大量の 小さなドメインを1つのマシンにホスティングさせるのに特に適しています。 これは VIRTUAL_README ドキュメントに 記述されています。
pipe(8) メーラは他のメール処理
システムへの外行きのインターフェースです (Postfix
sendmail(1) コマンドは内向きの
インターフェースです)。インターフェースは UNIX 互換です: コマンドラインと
標準入力ストリームに情報を与え、プロセスに
前のセクションでは Postfix サーバがどのようにメールを送受信するかの 概要を示しました。これらのサーバプロセスは舞台裏で動く他のサーバプロセスを 信頼しています。以下の文では、各場面でのそれぞれのサービスの図示を試みます。 前と同じように、数字が続く名前は Postfix コマンドまたはサーバプログラムであり、 斜線部分の数字のない名前は Postfix キューを表しています。
常駐master(8) サーバは Postfix メールシステムの健康を監視し続けるスーパーバイザーです。通常はシステム 起動時に "postfix start" コマンドで起動し、システムが落ちるまで 動き続けます。master(8) サーバには、メールを 受け取ったり配送するサーバプロセスを起動したり、何らかの問題で期限前に 終了したサーバを再起動する責任があります。master(8) サーバは、master.cf 設定ファイルで指定されたサーバプロセス数制限を 強制する責任も持ちます。以下の図はPostfix が起動されるときのプログラムの 階層構造を示しています。メールを扱うデーモンプロセスの一部のみが示されて います。
postfix(1) | |||||||||||
| | | |||||||||||
postfix-script(1) | |||||||||||
|
| | |
| |||||||||
postsuper(1) | master(8) | postlog(1) | |||||||||
|
| | |
| |||||||||
smtpd(8) | qmgr(8) | local(8) |
anvil(8) サーバは全ての smtpd(8) サーバに対するクライアント接続や要求の速度制限を実装しています。 TUNING_README ドキュメントに間違った振る舞いをする SMTP クライアントを扱うための案内があります。anvil(8) サービスは Postfix バージョン2.2以降で利用可能です。
Network | -> | smtpd(8) | <-> | anvil(8) |
bounce(8)、 defer(8) および trace(8) サーバはそれぞれメッセージごとの ログファイルを持つ、自分自身のキューディレクトリのツリーを管理します。 この情報は送信者に配送もしくは不達通知を送るのに使われます。
trace(8) サービスは、Postfix のメール 配送方法についてのレポートを生成する、Postfix "sendmail -bv" および "sendmail -v" コマンドのサポートを実装しています。例は DEBUG_README を参照して ください。
cleanup(8) | -> | qmgr(8) Postfix キュー | -> | 配送 エージェント |
^ | | | v |
| v | ||
(非) 配送 通知 | <- | bounce(8) defer(8) trace(8) | <- | キューid,
受信者, 状態 |
| ||||
Per- メッセージごとの ログファイル |
flush(8) サーバは配送先ごとのログを 管理し、ETRN_README に書かれているように ETRN および "sendmail -qRdestination" を実装しています。これは選択された キューファイルを deferred キュー から incoming キュー に戻し、それらの配送を要求します。 flush(8) サービスは Postfix バージョン 1.0 以降で使えます。
incoming ^ deferred | ||||||||
^ | | ||||||||
smtpd(8) sendmail(1) postqueue(1) | - |
flushする 配送先 | -> | flush(8) | <- | 遅延された 配送先, キューid |
- |
Delivery agents, qmgr(8) |
| ||||||||
配送先 ごとの ログ |
proxymap(8) サーバは読み込み専用の テーブル検索を Postfix プロセスに提供します。これは chroot の制限を 乗り越え、またオープンされた1つのテーブルを複数のプロセスで共有することで、 オープンする検索テーブルの数を減らします。
The scache(8) サーバはPostfix smtp(8) クライアントの接続キャッシュを管理します。選択された配送先に対して接続 キャッシュが有効になっていると、smtp(8) クライアントは メールの処理が終わってもすぐには接続を切らず、限られた時間だけ接続を開き続ける 接続キャッシュサーバに接続を渡します。smtp(8) クライアントは他のメール配送要求を続けます。逆に、いずれの smtp(8) プロセスも scache(8) サーバにキャッシュされた 接続を要求してメール配送に再利用することができます。安全対策として、Postfixは 接続が再利用される回数を制限します。
複数のメールサーバを持つある配送先にメールを配送する際には、接続キャッシュは 応答しないサーバをとばすのに役に立ち、配送が劇的に速くなります。
smtp(8) | <-> | scache(8) | <-> | smtp(8) |
showq(8) サービスは Postfix キューの 状態をリストアップします。これは mailq(1) および postqueue(1) コマンドのために働く、 キューをリストアップするサービスです。
出力 | <- | mailq(1) post- queue(1) | <- | showq(8) | <- | Postfix キュー |
spawn(8) サーバは要求に応じて、 ソケットや FIFO を使ってコマンドの標準入力および出力、エラーストリームに 接続されたクライアントを使って、非 Postfix コマンドを走らせます。 その利用法の例は SMTPD_POLICY_README ドキュメントにあるのが見つかるでしょう。
tlsmgr(8) サーバはPostfix smtp(8) クライアントもしくは smtpd(8) サーバでTLS (Transport Layer Security、以前は SSLとして知られていました) が有効に なっていると動きます。このプロセスには2つの仕事があります:
Postfix smtp(8) クライアントまたは smtpd(8) サーバプロセスのTLSエンジンに種を与える 擬似乱数生成器 (pseudo-random number generator, PRNG) を管理します。この PRNGの状態は定期的にファイルに保存され、tlsmgr(8) が起動するときに読み込まれます。
オプションでPostfix smtp(8) クライアント または smtpd(8) サーバのTLSセッションキーの キャッシュを管理します。キーを保存するとTLSセッションを始める際の計算量を 減らしてパフォーマンスを向上することができます。
TLSサポートはPostfixバージョン2.2以降で使えます。Postfix TLS実装についての 情報は TLS_README ドキュメントにあります。
Network-> | smtpd(8) |
<---種--- <-セッション-> | tlsmgr(8) |
---種---> <-セッション-> | smtp(8) | ->Network | ||||||||||
| | | |
| ||||||||||||||
smtpd session cache | PRNG state file | smtp session cache |
verify(8) サーバは、送信者または 受信者アドレスが配送可能であることを smtpd(8) サーバが受け入れる前に検証します。verify(8) サーバはプローブメッセージを Postfix キューに差し挟み、配送エージェントや キューマネージャからプロセス状態を更新します。このプロセスは ADDRESS_VERIFICATION_README ドキュメントに記述されています。verify(8) サービスは Postfix バージョン 2.1 以降で使えます。
ネットワーク | -> | smtpd(8) | <-> | verify(8) | -> | cleanup(8) | -> |
qmgr(8) Postfix キュー | -> | 配送 エージェント |
|||||||
| <- | <- |
| v |
|
Postfix アーキテクチャの概要は、日々 Postfix メールシステムで使う コマンドラインユーティリティをまとめて終わりにします。Sendmail 互換の sendmail(1) や mailq(1)、 newaliases(1) コマンドを除いて、Postfix システムには独自のコマンドラインユーティリティの集まりが付いてきます。 一貫性を保つため、これらは全て postsomething という名前が付いて います。
postfix(1) コマンドはメールシステムの 動作を制御します。これはメールシステムの起動や停止、再起動のインター フェースであり、またいくつかの管理業務のインターフェースでもあります。 このコマンドはスーパーユーザ専用です。
postalias(1) コマンドは Postfix aliases(5) 形式のデータベースを管理します。 これは newaliases(1) コマンドのために働く プログラムです。
postcat(1) コマンドは Postfix キュー ファイルの内容を表示します。これは制限された、予備的なユーティリティです。 このプログラムは Postfix キューファイルの編集もできるような、より パワフルなものに置き換えられる予定です。
postconf(1) コマンドは Postfix main.cf パラメータの表示や更新をおこなったり、サポートしているファイル ロッキング方法や検索テーブルなどシステムに依存する情報を表示します。
postdrop(1) コマンドは maildrop キュー ディレクトリにメールを入れるために Postfix sendmail(1) コマンドによって起動される メール投函ユーティリティです。
postkick(1) コマンドは例えば シェルスクリプトで Postfix 内部通信チャネルを使えるようにします。
postlock(1) コマンドは例えば シェルスクリプトで使える、Postfix 互換のメールボックスロッキングを 提供します。
postlog(1) コマンドはシェルスクリプトに Postfix 互換のロギングを提供します。
postmap(1) コマンドは canonical(5) や virtual(5) のような Postfix 検索テーブルを 管理します。これは UNIX makemap コマンドのいとこです。
postqueue(1) コマンドはメール キューをリストアップしたり flush する、Postfix sendmail(1) および mailq(1) によって起動される、特権を持つ コマンドです。
postsuper(1) コマンドは Postfix キューを管理します。古い一時ファイルを削除したり、キューディレクトリの ハッシュの深さを変更した後でキューファイルを正しい場所に移動します。 このコマンドはメールシステムの起動時と Postfix が再起動されるときに 実行されます。