メールシステムの管理

sendmail の動作

sendmail プログラムは mailxmailtool などのプログラムからメッセージを収集し、宛先のメールプログラムの要求で必要な場合にメッセージヘッダーを編集し、適切なメールプログラムを呼び出して配信したり、ネットワーク送信のために待ち行列に入れたりします。


注 -

sendmail プログラムはメッセージ本体の編集や変更は一切行いません。電子メールアドレスの解釈のためのいかなる変更も、メッセージのヘッダーでだけ行われます。


引数処理とアドレス解析

sendmail が入力を受けると、受信者の名前を収集し (コマンド行か SMTP プロトコルのどちらかから)、2 つのファイルを生成します。1 つはヘッダーと受信者のリストを含む「封筒」に相当するファイルです。別のファイルにはメッセージ本体が含まれます。sendmail プログラムはメーリングリストも含め別名を展開し、リモートの受信者の確認ができるかぎり行われます。次に構文をチェックし、ローカルの受信者を確認しますが、ホスト名の詳細なチェックは配信まで行われません。sendmail がローカルの受信者を確認すると、メッセージの転送が行われます。

sendmail は、受信者リストを解析したあとで封筒とメッセージのヘッダーの両方に名前を追加します。名前が別名に変換されるか、または転送されると、古い名前がリストに保存され、配信フェーズでこの受信者を無視するよう指示するフラグが設定されます。このリストは重複がないように管理されていて、1 人が 2 つの異なるグループに所属している場合に発生するような別名ループ、およびメッセージが重複して同じ受信者に配信されるといったことを防ぎます。


注 -

別名リストに、異なる構文を使用した同じ個人宛の電子メールアドレスがある場合、ユーザーは、同じメッセージを 2 回受けとることがあります。sendmail は、内容が同じメールの電子メールアドレスを必ず比較できるとは限りません。


メッセージの収集

すべての受信者名が解析されて確認されると、メッセージが収集されます。メッセージはメッセージのヘッダーと本体の 2 つの部分に分かれてきます。ヘッダーと本体はブランク行で分けられます。

ヘッダーは次の形式で一連の行として初期設定されます。


field-name: field-value

たとえば、サンプルヘッダーは次のようになります。


From: John Smith <Smith@colorado.edu>

後に続く行をスペースかタブで始めて、field-value を複数の行に分けることができます。ヘッダーフィールドの一部には、特別な内部の意味を持ち、それに応じた特別な処理のあるものがあります。他のヘッダーは単純に渡されます。タイムスタンプのように自動的に追加されるヘッダーもあります。

テキスト行でなければならない点を除き、メッセージ本体のフォーマットについての条件はありません。sendmail はヘッダーをメモリに格納し、メッセージ本体を一次ファイルに保存します。プログラムインタフェースを単純化するため、たとえ有効な名前がなくてもメッセージは収集されます。いずれの名前も有効でない場合、このようなメッセージは送信者にエラーで戻されます。


注 -

DeskSetTM のメールツール側では、ユーザーはバイナリデータを転送できます。ただしメールツール側でコード化する必要があります。sendmail プログラムはバイナリデータのコード化を自動的には行いません。バイナリデータメッセージのコード化とデコードの方法については、mailtool(1) のマニュアルページを参照してください。


メッセージ本体は SMTP チャネルでの転送時に、ドットで始まる行のドットが二重になる点を除き、メッセージ本体の解釈や処理は一切行われません。この余分なドットは受信者が取り除きます。

メッセージの配信

送信待ち行列はメッセージのバッチ処理のため転送する前に、受信側ホストによってグループ分けされます。処理の進行につれ、引数リストが構築されます。ファイルに送信されるメールは、送信リストの処理中に検出されます。

接続が確立すると、sendmail はヘッダーにメールプログラムごとの変更を加え、メールプログラムに結果を送信します。メールプログラムによって排除されるメールがある場合は、すべての配信の完了後にフラグが設定されて送信者に返送する機能を呼び出します。

sendmail プログラムは、sendmail にメッセージを転送するのに使用するのと同じインタフェースの 1 つを使用して、メールプログラムにメッセージを送信します (UNIX での慣例的な引数群と終了状態を使用して、UNIX の 1 組のパイプ経由で、または TCP 接続で SMTP を使用して通信を行う)。メッセージの各コピーには、カスタマイズしたヘッダーが付いています。

エラーの処理

メールが配信できない場合は、メールプログラムで状態コードがキャッチおよびチェックされ、そして適当なエラーメッセージが必要に応じて出されます。終了コードはシステムの標準に準拠している必要があります。非標準の終了コードが使用されると、sendmail「Services unavailable」 というメッセージが送信されます。

再送のための待ち行列

メールプログラムが 「temporary failure」 終了状態を戻した場合、メッセージは待ち行列に入っています。制御ファイルは、受信者とその他各種のパラメータを記述します。この制御ファイルのフォーマットは一連の行になっていて、この各行に送信者、受信者、依頼の時刻、メッセージのその他のパラメータが記述されます。メッセージのヘッダーは制御ファイルに保存されるので、待ち行列にある対応するデータファイルは、すでに収集されていた一時ファイルにすぎません。

発信者への返却

処理中にエラーが発生すると、sendmail は再送のためメッセージを発信者に戻します。その手紙は返送されるか、または発信者のホームディレクトリにある dead.letter ファイルに書き込まれます。

メッセージヘッダーの編集

ある程度のメッセージヘッダーの編集は自動的に行われます。ヘッダー行は、構成ファイルの制御によって挿入されます。行によってはマージできます。たとえば、From: 行と Full-name: 行は、特定の状況ではマージできます。

構成ファイル

ほとんどすべての構成情報はテキストファイルから実行時に読み出され、マクロ定義 (内部で使用されるマクロの値)、ヘッダー宣言 (特殊処理されるヘッダー行と追加または再フォーマットされる行のフォーマット)、メールプログラム定義 (各メールプログラムの配置と特性などの情報を与える)、および名前の書き換えのルール (名前の書き換えに使用される限定パターンマッチングシステム) が含まれます。