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 ルールセット呼び出しと arith

2007-04-26 22:31:24 | sendmail
sendmail.cf でルールセットからルールセットの呼び出しに挑戦してみます。

sendmail.mc で以下の行を追加します。

LOCAL_RULESETS
Slocal_test=9
# Test of R command
R$-+$-          $: $>PlusNum <$1><$2>
R$*             $@ RESULT : $1
SPlusNum
R<1><4>         $@ 5
R<2><4>         $@ 6
R<3><4>         $@ 7
R<4><4>         $@ 8
R<5><4>         $@ 9
R$*             $@ ERROR
#

早速テストしてみます。
$ ./sendmail -bt -C./sendmail.cf
.............
> 9 3+4
local_test         input: 3 + 4
PlusNum            input: < 3 > < 4 >
PlusNum          returns: 7
local_test       returns: RESULT : 7
> 9 4+4
local_test         input: 4 + 4
PlusNum            input: < 4 > < 4 >
PlusNum          returns: 8
local_test       returns: RESULT : 8
> 9 4+6
local_test         input: 4 + 6
PlusNum            input: < 4 > < 6 >
PlusNum          returns: ERROR
local_test       returns: RESULT : ERROR
> /quit
$

うまく変換されていますね。実際に計算が必要な場合は、Kコマンドでタイプ arith を使えばできます。

通常 sendmail.mc で作成されたものは、
Karith arith

が含まれています。これを使うには、sendmail.mc に以下の行を指定します。
Slocal_test=9
# Test of R command
R$+ $+ $+     $: $(arith $2 $@ $1 $@ $3 $: EXCEPTION $)
R$*             $@ RESULT : $1
#

sendmail.cf を作成し確かめてみます。
$ ./sendmail -bt -C ./sendmail.cf
..............
> 9 25+28
local_test         input: 25 + 28
local_test       returns: RESULT : 53
> 9 12*3
local_test         input: 12*3
local_test       returns: RESULT : 12*3
> 9 12 * 3
local_test         input: 12 * 3
local_test       returns: RESULT : 36
> 9 25 + 28
local_test         input: 25 + 28
local_test       returns: RESULT : 53
> 9 12 * 3
local_test         input: 12 * 3
local_test       returns: RESULT : 36
> 9 -12 / 3
local_test         input: -12 / 3
local_test       returns: RESULT : -4
> /quit
$

これは便利。マイナスも使えますね。それ以外に比較演算子みたいなのもあるので、IF文もどきのようなこともできるようです。

Kコマンドは、データベース・マップコマンドですから、/etc/passwd のようなテキスト型のものなど文字列の変換に色々利用できます。指定方法は、

Kname type switches file_or_map

で、定義された name は Rコマンドのrhs だけで使用できます。ちなみにクラス・マクロは Rコマンドの lhs だけでしか使用できず、定義マクロは lhs と rhs の両方で使用できます。

参照は、以下のように、$( と $) を使うそうです。

$(name key $: default $)
や
$(name key $@ text1 $@ text2 $: default $)

実際にテストする場合は、直接 sendmail.cf を修正すればよいのですが、今回はわざと sendmail.mc を使ってみました。だいぶテストも慣れてきましたので、メール転送関連の設定も調べてみたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail.mc と sendmail.cf とRコマンドテスト

2007-04-24 20:08:42 | sendmail
前回 sendmail.cf を簡単にまとめてみて、だんだん気分が盛り上がってきましたので、R(ルール)コマンドをいろいろ試して見たくなりました。

そのための準備として、sendmail.mc と sendmail.cf の関係を少し見てみます。

./cf/README によると、sendmail.mc は次のような構成で作ると良いみたいです。
  VERSIONID
  OSTYPE
  DOMAIN
  FEATURE
  local macro definitions
  MAILER
  LOCAL_CONFIG
  LOCAL_RULE_*
  LOCAL_RULESETS

ここで、local macro definitions は、GNU m4 の define() マクロで指定するタイプの設定です。

生成される sendmail.cf は、ここでの標準の sendmail.cf で大体次のようになっていました。
  バージョン情報
  C , F , D コマンド
  O コマンド
  Q コマンド
  P コマンド
  T コマンド
  H コマンド
  [ REWRITING RULES のコメント ]
     Scanonify=3 のルールセット
      Sfinal=4 のルールセット
      Sparse=0 のルールセット
      Slocaladdr=5 のルールセット
      Scheck_ 系のルールセット
      その他関連ルールセット
  [ MAIL FILTER DEFINITIONS のコメント ]
    [ Local and Program Mailer specification のコメント ]
      SEnvFromL ルールセット
      SEnvToL ルールセット
      SHdrFromL ルールセット
      SHdrToL ルールセット
      その他関連ルールセット
      Mlocal と Mprog の設定
    [ SMTP Mailer specification のコメント  ]
      SEnvFromSMTP ルールセット
      SEnvToSMTP ルールセット
      SHdrFromSMTP ルールセット
      SHdrToSMTP ルールセット
      その他関連ルールセット
      Msmtp とか Mesmtp の設定      

要するに膨大なオプションとルールセットの塊です。大まかな構成はしっかりしていますね。

さて、Rコマンドをテストするために、新たにルールセットを作りました。ここでは、使っていない番号 9 を利用します。こういう場合は、sendmail.mc の中で、LOCAL_RULESETS を使います。

この設定は、REWRITING RULES コメント下のルールセット群の一番下に展開されます。

例えば、

R<$+>       $1

をテストする場合は、sendmail.mc の最後に

LOCAL_RULESETS
Slocal_test=9
# Test of R command
R<$+>          $1
#
R$*            $@ RESULT : $1

を追加します。Rコマンドの lhs と rhs の間はタブ文字です。
この Rコマンドは括弧で囲まれた複数のトークンから括弧をはずすためのつもりです。ここで、
rhs の先頭の $@  は、それ以降の内容を出力として、そのルールセットを
                     終了させます。
                     つまり、サブルーチンのリターンですね。
                     配信エージェントを指定する $# も同じ動作
                     になっていますね。
rhs の先頭の $:  は、それ以降の内容を次のルールコマンドの lhs に渡し
                     ます。
                     Rコマンドのループ抑制です。

早速テストしてみます。sendmail は、コンパイルしたものを使います。
$ ln -s ../../obj.Linux.2.6.11-co-0.6.4.i686/sendmail/sendmail sendmail
$
$ sb Build sendmail.cf
$ ./sendmail -bt -C./sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 9 <abc>
local_test         input: < abc >
local_test       returns: RESULT : abc
> 9 <<<abc>>>
local_test         input: < < < abc > > >
local_test       returns: RESULT : abc
> /quit
$

うまくいきました。ここで、テストしたRコマンドがループとして動作し、複数の括弧( < > )がはずされたことがはっきり理解できます。この手のプログラム言語は、熟語のようなよく使う形式が現れますので、sendmail.cf のその他の Rコマンドを見ているうちになれてくるんじゃないかと思います。

coLinux なので、Rコマンドでルールセット呼び出し(サブルーチン呼び出し)なども気楽に試せます。ただし、外にメールを送る場合は正しく設定する必要があります。

ブログですから、次回もう少し遊んで見たいです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail.cf の簡単なまとめ

2007-04-22 18:12:06 | sendmail
sendmail の設定ファイル sendmail.cf は難しいと様々なところでいわれています。普通は、sendmail.mc から sendmail.cf を作るので、直接 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つの $* は、espiyaother . exampel . co . jp と 空値と一致して、rhs では、$1 , $2 , $3 として参照され、

$# esmtp $@ other . example . co . jp $: espiya < @ other . example . co . jp >

に変換されます。つまり lhs が入力と一致すれば、配信エージェント esmtp が選択されルールセットは完了します。rhs は、いわゆる配信エージェントの [3つ組]で、$# が配信エージェント $@ がホストを、$: がユーザを表します。

要するにここまでくればメールが送られるわけです。

やはり sendmail.cf は奥が深いです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail 8.14.1 インストール

2007-04-17 22:30:11 | sendmail
4月に入って、sendmail 8.14.1 がでました。早速インストールします。

462bc9e00fdbef3a71b046b967c9a157 sendmail.8.14.1.tar.gz
$gpg --verify sendmail.8.14.1.tar.gz.sig 
gpg: 2007年04月04日 11時41分33秒 JSTにRSA鍵ID 7093B841で施された署名
gpg: “Sendmail Signing Key/2007 <sendmail@Sendmail.ORG>”からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: D9 FD C5 6B EE 1E 7A A8  CE 27 D9 B9 55 8B 56 B6
$

$ tar xzf sendmail.8.14.1.tar.gz
$ cd sendmail-8.14.1
$ sh Build
..........
# sh Build install
..........
# cd cf/cf
# cp generic-linux.mc sendmail.mc
# sh Build sendmail.cf
Using M4=/usr/bin/m4
rm -f sendmail.cf
/usr/bin/m4 ../m4/cf.m4 sendmail.mc > sendmail.cf || ( rm -f sendmail.cf && exit 1 )
echo "### sendmail.mc ###" >>sendmail.cf
sed -e 's/^/# /' sendmail.mc >>sendmail.cf
chmod 444 sendmail.cf
# cp sendmail.cf sendmail.cf.original
# diff /etc/mail/sendmail.cf sendmail.cf
..........
130c130
< DZ8.14.0
---
> DZ8.14.1
439a440,442
> # issue temporary errors (4xy) instead of permanent error (5xy)?
> #O SoftBounce=False
>
# cp sendmail.cf /etc/mail/sendmail.cf

コメントになっていますが、少し修正がありますね。
後は、sendmail を再起動すれば終了です。

続いて、現在の sendmail の情報を表示してみます。
$ /usr/sbin/sendmail -bt -d0.1
Version 8.14.1
 Compiled with: DNSMAP LOG MATCHGECOS MILTER MIME7TO8 MIME8TO7
                NAMED_BIND NETINET NETUNIX PIPELINING SCANF XDEBUG

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = fedora
  (canonical domain name) $j = fedora.example.co.jp
         (subdomain name) $m = example.co.jp
              (node name) $k = fedora
========================================================

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> $=w
fedora.example.co.jp
fedora
www
[192.168.1.100]
localhost.localdomain
localhost
[localhost.localdomain]
[127.0.0.1]
example.co.jp
www.example.co.jp
> /quit
$

前回の設定も生きています。/etc/mail/local-host-names に従って、ちゃんと $=w の値は、IPアドレス、localhost、localhost.domain にファイル内容がマージされています。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

GNU m4

2007-04-09 20:18:40 | sendmail
sendmail の設定で、sendmail.mc から sendmail.cf を作成する場合に利用するのが
GNU m4 マクロプロセッサです。これには、マニュアルの日本語訳があります。
このシステムの GNU m4 は、Ver. 1.4.4 です。

m4 は、「1. 序論」にも書いてあるとおり、深入りすると健康をそこなうおそれがあるようですから、深入りせず sendmail で利用する機能に絞って、忘れないように調べてみます。

m4 は、入力をトークンに分割して処理するので、入力トークンの種類を見てみます。
・ 名前:
   _ または英文字で始まる、 _ または英数字の文字列。
  マクロ名かどうかはマクロ定義があるかどうかだけです。
・ クォートされた文字列:
   引用符 ` と ' (back quote,quote) のペアで囲まれた文字列で、一番外側のペアだけが有効です。
・ その他:
   上記2つ以外のすべての文字です。

さらに、コメントが次のように定義されています。

# と「改行文字」で区切られた部分で、その部分は何も処理されず、そのまま出力されます。

あとは、マクロの使い方を覚えるだけです。マクロは組み込みマクロとユーザ定義マクロがあります。m4 を使うには、このマクロ定義を行って、入力を変換して出力とすればよいわけです。ユーザ定義マクロの定義の方法ですが、
define(name[,  expansion])

のようにdefineマクロを使います。これで、name が expansion に展開されるよう
に定義されます。defineによるマクロ定義は出力されませんが、最後の改行文字は定義外ですのでそのまま出力されます。引数は、$1, $2 のように参照できます。

さて、マクロの呼び出しですが、
name                              引数なしの呼び出し
name(arg1, arg2, ... , argN)   N個の引数を伴った呼び出し
name()              空の文字列を1つだけ引数とする呼び出し

のようになり、name と ( の間は空けてはいけない決まりです。

・マクロ呼び出しで展開されて、再びマクロが現れたらもう一度そのマクロを呼び出します。
・マクロの引数がマクロなら、先にそのマクロを呼び出します。
・引数なしマクロを連続して展開し連結するなら、マクロ名の間は `' (空のクォートされた文字列)を挿入します。

また、空白文字に非常に敏感です。たとえば引数の前にある空白文字は無視されますが、引数の後ろの , までの空白文字は意味があります。また、引数の前なら改行文字があっても空白文字と同じに扱われるようです。つまり、マクロ定義中に改行可能です。

組み込みマクロの多くは、引数がないとマクロとみなされません。その場合は、そのまま出力されます。

名前の全部または一部をクォートすると、マクロとみなされなくなります。つまり展開されず、そのまま出力されます。

これで、m4 の説明はおしまいです。

さて、sendmail.mc の場合は、組み込みマクロ divert と dnl を知っておく必要があります。

dnl マクロは、最初の改行文字までにある文字をすべて捨てて出力しません。従って、
define(`x', `expansion')dnl

とすると、この行はまったく出力されず、先ほどの説明どおり後ろのdnl がなければ空行が出力されます。

divertマクロは、sendmail.mc の場合、sendmail.mc 自身のコメントを挿入するのに使います。
divert(-1)
複数行のコメント
.........
divert(0)dnl

とすれば、これらすべてが出力されません。

m4 の実行は単純で、入力ファイルが test.mc だとすると、以下のようになります。
$ m4 test.mc

標準出力に出力結果が出てきます。ためしにサンプルを作ってみます。
$ cat test.mc
divert(-1)
# TEST LINE No.1
# TEST LINE No.2
divert(0)dnl
test1 test2 dnl test3 test4 test5
test6 test7
define(`x',`expansion')dnl
define(`y',`dnl')
test8
x
test9
test10
y
test11
$ m4 test.mc
test1 test2 test6 test7

test8
expansion
test9
test10
test11
$

divert や dnl や macro 定義、参照が分かったでしょうか。

sendmail の cf/cf/Build は、
/usr/bin/m4 ../m4/cf.m4 sendmail.mc > sendmail.cf

です。OSTYPE とか、DOMAIN とかの mc ファイルの指定は、定義されたマクロであり、その定義は、cf/m4/cf.m4 から読み込まれる cf/m4/cfhead.m4 で行われています。

cf/m4/cfhead.m4 をチラッと見たところ、
OSTYPE は、cf/ostype 内の引数で指定された名前の .m4 ファイルを、
DOMAIN は、cf/domain 内の引数で指定された名前の .m4 ファイルを、
FEATURE は、cf/feature 内の引数で指定された名前の .m4 ファイルを、
MAILER は、cf/mailer 内の引数で指定された名前の .m4 ファイルを、
を展開するようです。

今後は、m4 を使って sendmail.mc から semdmail.cf を作成していろいろ調べたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail インストール その2

2007-04-05 00:39:40 | sendmail
前回、sendmail 8.14.0 でうまくメールが送れないと言いましたが、その辺を説明します。長い行は適当に改行してあります。

/etc/syslog.conf を見ると、
# Log all the mail messages in one place.
mail.*             -/var/log/maillog

ですから、何かメールを送って、/var/log/maillog を見てみます。
$ Mail espiya@www.example.co.jp
...........
# tail /var/log/maillog
...........
Apr  x xx:xx:xx fedora sendmail[7606]: l282UN7M007606: from=espiya, 
  size=54, class=0, nrcpts=1,
  msgid=<2007xxxx0230.l282UN7M007606@fedora.example.co.jp>,
  relay=espiya@localhost
Apr  x xx:xx:xx fedora sm-mta[7607]: l282UNVB007607: 
  from=<espiya@fedora.example.co.jp>, 
  size=353, class=0, nrcpts=1,
  msgid=<2007xxxx0230.l282UN7M007606@fedora.example.co.jp>,
  proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
Apr  x xx:xx:xx fedora sm-mta[7607]: l282UNVB007607: 
  to=<espiya@fedora.example.co.jp>,
  delay=00:00:00, mailer=local, pri=30353, stat=queued
Apr  x xx:xx:xx fedora sendmail[7606]: l282UN7M007606: 
  to=espiya@www.example.co.jp,
  ctladdr=espiya (201/200), delay=00:00:00, xdelay=00:00:00, 
  mailer=relay, pri=30054, 
  relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, 
  stat=Sent (l282UNVB007607 Message accepted for delivery)
#

ちゃんと送られているようですが、実はこれはキューに入ったままで、実際の配送は行われずいつまで待っても /var/spool/mail に書き込まれません。/var/spool/mqueue のファイルを見ると、aliase ファイルがないからみたいです。sendmail.cf で、
O AliasFile=/etc/mail/aliases

となっていますから、適当に /etc/mail/aliases を作成します。
# cat /etc/mail/aliases
postmaster:     root
MAILER-DAEMON:  postmaster
abuse:          postmaster
postmaster:     root
root:           espiya
#
# newaliases
Cannot rebuild aliases: no database format defined
Cannot create database for alias file /etc/mail/aliases
#

で、newaliase がうまくいきません。sendmail/map.c をみると、
  #if defined(NEWDB) || defined(NDBM)
  ..............
  #else /* defined(NEWDB) || defined(NDBM) */
  if (mode != O_RDONLY)
      usrerr("Cannot rebuid aliases: no database format defined");
  #endif /* defined(NEWDB) || defined(NDBM) */

というわけで、NEWDB か NDBM をコンパイル時に指定すれば解決みたいです。しかしデフォルトでそれがないということは、newaliases しなくても良いということです。データ量も小さいのでこれで OK です。
# /usr/sbin/sendmail -L sm-mta -bd -q1h
# /usr/sbin/sendmail -L sm-msp-queue -Ac -q30m

もう一度メールを送るとうまくいきました。/var/log/maillog は、次のようです。
sm-mta と表示されるのが最初の sendmail が出すメッセージです。
Apr  x xx:xx:37 fedora sendmail[8067]: l286NbM7008067: from=root, 
  size=55, class=0, nrcpts=1,
  msgid=<2007xxxx0623.l286NbM7008067@fedora.example.co.jp>, 
  relay=root@localhost
Apr  x xx:xx:38 fedora sm-mta[8068]: l286NcdY008068:
  from=<root@fedora.example.co.jp>, 
  size=357, class=0, nrcpts=1, 
  msgid=<2007xxxx0623.l286NbM7008067@fedora.example.co.jp>,
  proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
Apr  x xx:xx:38 fedora sendmail[8067]: l286NbM7008067:
  to=espiya@www.example.co.jp, 
  ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, 
  pri=30055, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, 
  stat=Sent (l286NcdY008068 Message accepted for delivery)
Apr  x xx:xx:38 fedora sm-mta[8069]: l286NcdY008068:
  to=<espiya@fedora.example.co.jp>,
  ctladdr=<root@fedora.example.co.jp> (0/0), delay=00:00:00, 
  xdelay=00:00:00, mailer=local, pri=30580, dsn=2.0.0, stat=Sent

mail 本体のヘッダも見てみます。
From root@fedora.example.co.jp  Thu Apr  x xx:xx:xx 2007
Return-Path: <root@fedora.example.co.jp>
Received: from fedora.example.co.jp (localhost [127.0.0.1])
   by fedora.example.co.jp (8.14.0/8.14.0) with ESMTP id l286NcdY008068
   for <espiya@fedora.example.co.jp>; Thu, x Apr 2007 xx:xx:xx +0900
Received: (from root@localhost)
   by fedora.example.co.jp (8.14.0/8.14.0/Submit) id l286NbM7008067
   for espiya@www.example.co.jp; Thu, x Apr 2007 xx:xx:xx +0900
Date: Thu, x Apr 2007 xx:xx:xx +0900
From: root <root@fedora.example.co.jp>
Message-Id: <2007xxxx0623.l286NbM7008067@fedora.example.co.jp>
To: espiya@fedora.example.co.jp
Subject: TEST
Status: RO

送り手は、root@fedora.example.co.jp です。受け手は、espiya@fedora.example.co.jp で、たとえ espiya@www.example.co.jp に送っても書き換えられます。

以上でインストール完了です。次回、m4 の使い方を調べてから、sendmail.mc 周りで遊んでみたいと思っています。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail 8.14.0 インストール

2007-04-01 11:01:32 | sendmail
3月はほとんどなにもしませんでしたので、4月からはいろいろ試してみたいと思います。

さて、メールサーバですが、最近は postfix 等が利用されるようになり、sendmail の利用が少なくなっているようです。sendmail は設定がコンピュータ言語みたいで、-bt オプションで起動されるルールテスト・モードがインタプリタみたいなので、触ってみると結構面白いと思います。しかも、sendmail.mc と sendmail.cf の間に m4 が絡んでいるので、コンピュータ言語としてみても是非試して見たい処理系の1つです。

そこで、sendmail を使ってみます。ただし、最近の spam メール状況から、直接外へメールが送れないため実際のメール送受信のテストは難しいです。

早速コンパイルしてみます。2007.1.31 に 8.14.0 が出たようです。いよいよ 8.14 になりましたね。しかも、
headers are 8 bit "transparent". です。

sendmail.8.14.0.tar.gz
$gpg --verify sendmail.8.14.0.tar.gz.sig
gpg: 2007年02月01日 14時27分08秒 JSTにRSA鍵ID 7093B841で施された署名
gpg: “Sendmail Signing Key/2007 <sendmail@Sendmail.ORG>”からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: D9 FD C5 6B EE 1E 7A A8  CE 27 D9 B9 55 8B 56 B6
$

coLinux の Fedora Core 5 では、既にsendmail8.13.8 がインストールされていますので、これは消して、
ユーザ smmsp と グループ smmsp はそのまま利用します。
# rpm -e sendmail-8.13.8-1.fc5
warning: /var/log/mail/statistics saved as /var/log/mail/statistics.rpmsave

$ tar xzf sendmail.8.14.0.tar.gz
$ cd sendmail-8.14.0
$ sh Build
..............
$ cd cf/cf
$ cp generic-linux.mc sendmail.mc
$ sh Build sendmail.cf
$ cp sendmail.cf sendmail.cf.original

# mkdir /etc/mail
# sh Build install-cf
# ls /etc/mail
sendmail.cf submit.cf
# cd ../..
# mkdir /usr/local/man/man8 
# ln -s /usr/local/man /usr/man
# sh Build install
# 

これで、/usr/sbin/sendmail にインストールできました。途中で generic-linux.mc を sendmail.mc にコピーしていますが、これが標準の sendmail.cf ということにし
て、sendmail.mc の修正はここから出発するのが近道だと思います。そこで、sendmail.cf を sendmail.cf.original にコピーしました。

sendmail/SECURITY を見て起動方法を調べます。
# mkdir /var/spool/clientmqueue
# mkdir /var/spool/mqueue
# chown smmsp.smmsp /var/spool/clientmqueue
# chmod 0770 /var/spool/clientmqueue
# chmod 0700 /var/spool/mqueue
# /usr/sbin/sendmail -L sm-mta -bd -q1h
451 4.0.0 /etc/mail/sendmail.cf: line 73: fileclass: cannot open 
         '/etc/mail/local-host-names': No such file or directory
#

/etc/mail/local-host-names が必要ですね。
# grep local-host-names /etc/mail/sendmail.cf
Fw/etc/mail/local-host-names

です。クラス設定コマンド F は、ファイルから読み込んだ値を w に設定の意味ですから、自分宛のホスト名リストを用意すればいいわけです。
# cat /etc/mail/local-host-names
fedora
fedora.example.co.jp
www
www.example.co.jp
example.co.jp
# /usr/sbin/sendmail -L sm-mta -bd -q1h
# ps -ef |grep sendmail
.................      sendmail: accepting connections

#

これで、とりあえず sendmail を動かすことができました。でも、このままだとメールがうまく遅れませんでした。

それに関しては、次回にお伝えしたいと思います。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする