前回までで、sendmail.cf の遊び方が少し分かったので、実際のメール転送の設定をここで標準としている sendmail.cf で見てみます。
最初に sendmail がアドレスを書き換えるときのルールセットの順序を見てみます。
要するに受信者アドレスから送信方法を決めて、発信者アドレスと受信者アドレスを書き換えて送信するのが sendmail の役割ですね。その際、アドレスはメールのヘッダ用とエンベロープ用があるので全部で4つ操作することになります。
特に 1) のテストは、どこにメールが送られるのかを決める重要な部分ですので、ほとんどのテストはここに集中するわけです。それで sendmail では、
のようにテストすることが多いわけですね。ちなみにそのアドレスが自分宛であることを確認するには、
のように 配信エージェントが$# local になれば良く、外部に送られる場合は、
のように 配信エージェントが$# esmtp で、$@ の示す受信者ホスト名が期待する送り先になっていれば良いわけです。
先ほどの sendmail.cf では、ルールセット 1 および 2 は、定義されていませんでした。また、Mコマンドで定義されている配信エージェント esmtp は、
のようになっています。以上まとめると、
のようにテストすれば良いですね。例えば、ヘッダ用受信者アドレスは、
canonify ルールセットから呼び出された、Canonify2 ルールセットが、fedora.example.co.jpに書き換えていますね。
さて、ルールセット parse=0 を見てみます。
ずいぶんすっきりしています。要するに、
・ ルールセット Parse0 の呼び出し
・ 特殊ケースを local に配信し終了
・ ルールセット ParseLocal を呼び出し
・ ルールセット Parse1 の呼び出し
を行って、それまでに配信エージェントが決定される仕組みですね。
もう一つ Canonify2 ルールセットで変換に関わる部分を抜き出してみました。
なれないうちは、自分で作ったルールセットに Rコマンドを入れてテストするのが良いかと思います。最大の問題は、自分のケースでは必要ないように見える Rコマンドがいったい何に役立つのかほとんど分からないことです。
というわけで、sendmail.cf で既に書かれているルールセットの部分の修正は行わず、その結果が満足できない場合だけ、Rコマンドを継ぎ足していくのが無難ですね。
最初に sendmail がアドレスを書き換えるときのルールセットの順序を見てみます。
1) 受信者アドレス(送信先)を入力として、 canonify=3 を通って、更に parse=0 に行って、 配信エージェントを決める、Mコマンドを選択します。 2) 発信者アドレス(送信元)は、canonify=3 続いて 1 を通って、 Mコマンドの S= で指定されたルールセットを通り、最後に final=4 を通って、 メールメッセージのヘッダやエンベロープに現れます。 3) 受信者アドレス(送信先)は、canonify=3 続いて 2 を通って、 Mコマンドの R= で指定されたルールセットを通り、最後に final=4 を通って、 メールメッセージのヘッダやエンベロープに現れます。
要するに受信者アドレスから送信方法を決めて、発信者アドレスと受信者アドレスを書き換えて送信するのが sendmail の役割ですね。その際、アドレスはメールのヘッダ用とエンベロープ用があるので全部で4つ操作することになります。
特に 1) のテストは、どこにメールが送られるのかを決める重要な部分ですので、ほとんどのテストはここに集中するわけです。それで sendmail では、
$ /usr/sbin/sendmail -bt -C./sendmail.cf ............ > 3,0 テストするアドレス ............
のようにテストすることが多いわけですね。ちなみにそのアドレスが自分宛であることを確認するには、
> 3,0 espiya@fedora.example.co.jp ............... parse returns: $# local $: espiya >
のように 配信エージェントが$# local になれば良く、外部に送られる場合は、
parse returns: $# esmtp $@ hoge.co.jp $: abc < @ hoge . co . jp >
のように 配信エージェントが$# esmtp で、$@ の示す受信者ホスト名が期待する送り先になっていれば良いわけです。
先ほどの sendmail.cf では、ルールセット 1 および 2 は、定義されていませんでした。また、Mコマンドで定義されている配信エージェント esmtp は、
・ エンベロープ発信者アドレス EnvFromSMTP ・ ヘッダ用発信者アドレス HdrFromSMTP ・ エンベロープ受信者アドレス EnvToSMTP ・ ヘッダ用受信者アドレス EnvToSMTP
のようになっています。以上まとめると、
・ 配信エージェント決定テストは、 > 3,0 address ・ エンベロープ発信者アドレステストは、esmtp として、 > 3,EnvFromSMTP,final address ・ エンベロープ受信者アドレステストは、esmtp として、 > 3,EnvToSMTP,final address ・ ヘッダ用発信者アドレステストは、esmtp として、 > 3,HdrFromSMTP,final address ・ ヘッダ用受信者アドレステストは、esmtp として、 > 3,EnvToSMTP,final address
のようにテストすれば良いですね。例えば、ヘッダ用受信者アドレスは、
> 3,EnvToSMTP,final espiya@www.example.co.jp canonify input: espiya @ www . example . co . jp Canonify2 input: espiya < @ www . example . co . jp > Canonify2 returns: espiya < @ fedora . example . co . jp . > canonify returns: espiya < @ fedora . example . co . jp . > EnvToSMTP input: espiya < @ fedora . example . co . jp . > PseudoToReal input: espiya < @ fedora . example . co . jp . > PseudoToReal returns: espiya < @ fedora . example . co . jp . > MasqSMTP input: espiya < @ fedora . example . co . jp . > MasqSMTP returns: espiya < @ fedora . example . co . jp . > EnvToSMTP returns: espiya < @ fedora . example . co . jp . > final input: espiya < @ fedora . example . co . jp . > final returns: espiya @ fedora . example . co . jp >
canonify ルールセットから呼び出された、Canonify2 ルールセットが、fedora.example.co.jpに書き換えていますね。
さて、ルールセット parse=0 を見てみます。
Sparse=0 R$* $: $>Parse0 $1 initial parsing R<@> $#local $: <@> special case error msgs R$* $: $>ParseLocal $1 handle local hacks R$* $: $>Parse1 $1 final parsing
ずいぶんすっきりしています。要するに、
・ ルールセット Parse0 の呼び出し
・ 特殊ケースを local に配信し終了
・ ルールセット ParseLocal を呼び出し
・ ルールセット Parse1 の呼び出し
を行って、それまでに配信エージェントが決定される仕組みですね。
もう一つ Canonify2 ルールセットで変換に関わる部分を抜き出してみました。
入力:espiya < @ www . example . co . jp > R$* < @ $* $~P > $* $: $&{daemon_flags} $| $1 < @ $2 $3 > $4 途中:$| espiya < @ www . example . co . jp > R$* $| $* < @ $* > $* $: $2 < @ $[ $3 $] > $4 出力:espiya < @ fedora . example . co . jp . >
なれないうちは、自分で作ったルールセットに Rコマンドを入れてテストするのが良いかと思います。最大の問題は、自分のケースでは必要ないように見える Rコマンドがいったい何に役立つのかほとんど分からないことです。
というわけで、sendmail.cf で既に書かれているルールセットの部分の修正は行わず、その結果が満足できない場合だけ、Rコマンドを継ぎ足していくのが無難ですね。