coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

sendmail.cf を覗く

2007-04-30 23:17:28 | sendmail
前回までで、sendmail.cf の遊び方が少し分かったので、実際のメール転送の設定をここで標準としている sendmail.cf で見てみます。

最初に 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コマンドを継ぎ足していくのが無難ですね。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« sendmail.cf ルールセット呼... | トップ | sendmail.mc の SMART_HOST »
最新の画像もっと見る

コメントを投稿

sendmail」カテゴリの最新記事