sendmail の設定ファイル sendmail.cf は難しいと様々なところでいわれています。普通は、sendmail.mc から sendmail.cf を作るので、直接 sendmail.cf は触らないのですが、本当の所はどうなんでしょうか。
確かに sendmail.cf の設定自身がプログラム言語(ループを1行で表すとか)のようになっており、過去のアドレス等に関するしがらみが多数含まれているため、全部読むのは大変です。それを助けるオライリーの sendmail の本は非常に重く持ち歩きはほとんど不可能ですから急に何とかと言われてもできないですね。
とりあえずこの重い本を使って、それを持ち歩かずにすむ程度のまとめをしておくのは何かの時に役立ちそうです。
sendmail.cf の文法の基本は、
1行が1コマンドで、コマンド名は行先頭の1文字
です。
# コマンドはコメント、空白およびタブコマンドは継続
ですね。よく使うコマンドは、
ぐらいだと思います。
早速、インストール時に作った、ここで標準としている sendmail.cf で各コマンドの例を見てみます。
クラス・マクロ O を @ , % , ! の3つのリストとして定義していますね。 $=O で参照できます。
クラス・マクロ R を /etc/mail/relay-domains の内容をリストとして定義しています。同じく $=R で参照でき、-o が付いているのでファイルがなくても OK で、参照した値は空値です。
定義マクロ n に MAILER-DAEMON とう値を定義しています。$n で参照できます。この sendmail.cf では、3つだけしか定義されていません。$m (ドメイン名) や $j (標準のホスト名)のように前もって定義されているものもあるようです。
オプション AliasFile を /etc/mail/aliases に指定しています。
配信エージェント esmtp の定義です。タブコマンドで継続行になっています。
各 equate は、式=引数 の形式で , で区切るようです。式の意味は、
です。
ルールセット parse の開始を表し、番号 0 に対応付けされています。次のルールセットの開始までが1つのサブルーチンのようにみなされます。テストの時にも通常はこの番号を使います。
Date: ヘッダの追加宣言で、Mesmtp では、F=D が指定されていますので、配信時にこのヘッダが追加されます。
以上はそれほど難しくないですが、問題は、ルールコマンドです。
lhs が $* , rhs が $: $>Parse1 $1 , comment がfinal parsing でそれらの間は「タブ文字」でなければなりません。ここをいい加減にすると動作がおかしくなります。OperatorChars=.:%@!^/[]+空白文字 を分割文字として、入力テキストをトークンに分割するのが sendmail の基本です。
上のコマンドは、$* で、0個以上のトークンと一致つまり lhs がなんでも rhs に変換の意味で、そのrhs は、$: 「一度だけ書き換え」で、$>Parse1 「Parse1 ルールセットを呼び出し」をその引数 $1 ( この場合は、入力をそのまま)として行った結果を次の行のルールコマンドに渡すという意味ですね。
要するにサブルーチン呼び出しです。
この行も重要です。入力が、espiya < @ other . example . co . jp > だとすると、lhs の3つの $* は、espiya と other . exampel . co . jp と 空値と一致して、rhs では、$1 , $2 , $3 として参照され、
に変換されます。つまり lhs が入力と一致すれば、配信エージェント esmtp が選択されルールセットは完了します。rhs は、いわゆる配信エージェントの [3つ組]で、$# が配信エージェント $@ がホストを、$: がユーザを表します。
要するにここまでくればメールが送られるわけです。
やはり sendmail.cf は奥が深いです。
確かに sendmail.cf の設定自身がプログラム言語(ループを1行で表すとか)のようになっており、過去のアドレス等に関するしがらみが多数含まれているため、全部読むのは大変です。それを助けるオライリーの sendmail の本は非常に重く持ち歩きはほとんど不可能ですから急に何とかと言われてもできないですね。
とりあえずこの重い本を使って、それを持ち歩かずにすむ程度のまとめをしておくのは何かの時に役立ちそうです。
sendmail.cf の文法の基本は、
1行が1コマンドで、コマンド名は行先頭の1文字
です。
# コマンドはコメント、空白およびタブコマンドは継続
ですね。よく使うコマンドは、
C : クラス・マクロ( 次の1文字がマクロ名、CX list 、CX $=Y の形式、$=X で参照) F : クラス・マクロ( 次の1文字がマクロ名、FX /file 、FX -o /file 等の形式、$=F で参照) D : 定義マクロ( DX test 、D(XXX) testの形式、$X, $(XXX) で参照) O : オプション( 次の1文字が空白文字、続いて オプション名=値 の形式) M : メール配信エージェント( Msymname, equate, equate,... の形式 Mlocal と Mesmtp が重要) R : ルール( Rlhsタブ文字rhsタブ文字comment の形式、設定でもっとも大切なコマンド) S : ルールセット( S空白文字可ident の形式、identは昔は数字だけだった) H : ヘッダ( H?flags?name:field の形式 )
ぐらいだと思います。
早速、インストール時に作った、ここで標準としている sendmail.cf で各コマンドの例を見てみます。
CO @ % !
クラス・マクロ O を @ , % , ! の3つのリストとして定義していますね。 $=O で参照できます。
FR-o /etc/mail/relay-domains
クラス・マクロ R を /etc/mail/relay-domains の内容をリストとして定義しています。同じく $=R で参照でき、-o が付いているのでファイルがなくても OK で、参照した値は空値です。
DnMAILER-DAEMON
定義マクロ n に MAILER-DAEMON とう値を定義しています。$n で参照できます。この sendmail.cf では、3つだけしか定義されていません。$m (ドメイン名) や $j (標準のホスト名)のように前もって定義されているものもあるようです。
O AliasFile=/etc/mail/aliases
オプション AliasFile を /etc/mail/aliases に指定しています。
Mesmtp, P=[IPC], F=mDFMuXa, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=rn, L=990, T=DNS/RFC822/SMTP, A=TCP $h
配信エージェント esmtp の定義です。タブコマンドで継続行になっています。
各 equate は、式=引数 の形式で , で区切るようです。式の意味は、
P= : 配信エージェントのパスで、[IPC]はネットワークでメール転送です。 F= : 配信エージェントのフラグで、D,F,M がヘッダのフラグ、m が複数受信者可、 u が受信者アドレスの大文字を保存、X が先頭メッセージの先頭がドットの ときにドットを1つ先頭に補うことを、a が拡張SMTP を表しているようで す。 S= : 発信者の書き換えルールセット R= : 受信者の書き換えルールセット E= : 行末文字 L= : 行最大の長さ T= : DSN診断タイプ、ここでは、すべての SMTP と LMTP エージェントを表します。 A= : 配信エージェントの argv で、TCP はネットワーク配信を表し、 $h はルール セット0 の $@ オペレータが返す接続相手先のホスト名で、 この式は伝統的に最後に指定します。
です。
Sparse=0
ルールセット parse の開始を表し、番号 0 に対応付けされています。次のルールセットの開始までが1つのサブルーチンのようにみなされます。テストの時にも通常はこの番号を使います。
H?D?Date: $a
Date: ヘッダの追加宣言で、Mesmtp では、F=D が指定されていますので、配信時にこのヘッダが追加されます。
以上はそれほど難しくないですが、問題は、ルールコマンドです。
R$* $: $>Parse1 $1 final parsing
lhs が $* , rhs が $: $>Parse1 $1 , comment がfinal parsing でそれらの間は「タブ文字」でなければなりません。ここをいい加減にすると動作がおかしくなります。OperatorChars=.:%@!^/[]+空白文字 を分割文字として、入力テキストをトークンに分割するのが sendmail の基本です。
上のコマンドは、$* で、0個以上のトークンと一致つまり lhs がなんでも rhs に変換の意味で、そのrhs は、$: 「一度だけ書き換え」で、$>Parse1 「Parse1 ルールセットを呼び出し」をその引数 $1 ( この場合は、入力をそのまま)として行った結果を次の行のルールコマンドに渡すという意味ですね。
要するにサブルーチン呼び出しです。
R$* < @* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain
この行も重要です。入力が、espiya < @ other . example . co . jp > だとすると、lhs の3つの $* は、espiya と other . exampel . co . jp と 空値と一致して、rhs では、$1 , $2 , $3 として参照され、
$# esmtp $@ other . example . co . jp $: espiya < @ other . example . co . jp >
に変換されます。つまり lhs が入力と一致すれば、配信エージェント esmtp が選択されルールセットは完了します。rhs は、いわゆる配信エージェントの [3つ組]で、$# が配信エージェント $@ がホストを、$: がユーザを表します。
要するにここまでくればメールが送られるわけです。
やはり sendmail.cf は奥が深いです。