Sendmail X で遊ぼう

更新履歴をはじめに書いておきます。

2005/09/08
X.0.0.Beta1.0 をちょっと試してみた記録をメモしてみました。。
2005/10/30
ついに正式版の X.0.0.0.0 がリリースされました。とりあえずインストールしてみましたが、ベータ版のときとほとんど変わってないようです。ということで、中身はいじってません。
2006/02/06
X.0.1.Beta1.0 をいじってみました。中身はそんなに変わってないようですが、いじる方の人間が慣れてきたので疑問だった部分がいくつか解決してます。ちょっと追記しましたけど、ほとんど変わってません。

はじめに

Sendmail X が出てます。いじってみましょう。

従来の Sendmail とはいろんなところが違ってます。変更点はいろいろありますが、以下の2点を挙げるだけでも、もう従来の Sendmail とはまったく異なることがわかるでしょう。

いずれも、従来の Sendmail で批判を浴びてた部分です。各モジュールの役割分担を見ると、従来の Sendmail よりも Postfix にずっと近い構造になってます。キュー管理モジュールの名前が Postfix と同じ qmgr だったりするし。それ以外のモジュールの役割を見ても、postfix によく似ている(qmail とはちょっと違う)。……だったら postfix を使えばいいじゃん、というツッコミはなしで。

今のところ、ドキュメントは以下のふたつと、インストール後に man で見られるいくつかのドキュメントだけだと思います。たぶん。

これだけ。あんまり読みやすくはないです。

ところで、X はエックスなのかテンなのか、どっちなんでしょうかね。ドキュメントのどっかに書いてあるのかもしれないけど、まだそんなに読みこんでないのでわからんです。

以下、Sendmail X を sm-X と略記することがあります。


入手〜コンパイル〜インストール

ソースの取得

ソースはここのページから入手します。いちおう Beta の文字は取れましたけど、0.0.0.0 というバージョンなんであまり期待はできません。0.1 に向けてのβテストもやってます。

コンパイル

んでは、ビルドしましょう。ちなみに、実験環境は coLinux 上の Debian(sarge) です。

% tar xvfz smX-0.1.Beta1.0.tar.gz
% cd smX-0.1.Beta1.0

従来の Sendmail はソースディレクトリの下の devtools/Site/site.config.m4 というファイルでコンパイル時のオプションを決めていましたが、Sendmail X では最近の流行にしたがって configure を使います。ここでは SASL や TLS なんかの有効/無効を決められますが、sm-X をちょっと体験してみるだけの目的なので、このへんはぜんぶ無効にしておきます。また、ちょっと体験してみるだけの目的なので、飽きたら簡単に消せるように、--prefix で専用ディレクトリに隔離してやることにします。

% ./configure --prefix=/usr/local/smx

ちなみに、いっしょに BerkeleyDB 4.3 もコンパイル、インストールされます。prefix を指定しない場合は BerkeleyDB の標準どおり /usr/local/BerkeleyDB4.3/ にインストールされますが、prefix を指定すると BerkeleyDB もこの prefix 以下に入っちゃいます。ま、特に問題ないでしょう。すでに BerkeleyDB がインストールされている場合は、そちらを使うようにして sm-X のソースに同梱の BerkeleyDB は使わないようにすることもできるようです。

コンパイルしましょう。

% make

はい、できました。make check はやってもいいけど時間がかかるのですっとばします。お試しなので。

インストール

make install の前に、sm-X の動作に必要なユーザ/グループを作成しておきます。役割分担がはっきりしてますね。いっぱいあります。従来の Sendmail では信じられません。smxs、smxq、smxc、smxm、smx の5グループと、それぞれのグループ名と同名のユーザ5つを作成します。さらに、smxs ユーザはそれ以外にも smxc と smxm のグループに、smxq ユーザはsmxm グループにそれぞれ所属させます。つまり、こういうこと

んでは、準備ができたらインストールしましょう。

# make install

あー、prefix を /usr/local/smx に指定したのに、設定ファイル置き場は /etc/smx、キューディレクトリは /var/spool/smx と、prefix の外に置かれてしまいました。まあ、そこにあるとわかってれば、困ることはないか。ちなみに、キューディレクトリではなく、CDB (content database) というのが sm-X の正式な用語のようです。


設定する……のは後まわし

設定ファイルは /etc/smx/smx.conf です。sendmail.cf は存在しません。もちろん、m4 のマクロも存在しません。ぱっと見でどんな設定がされているのかほとんど判別不能だった sendmail.cf とは大きく異なり、初見でもなんとなーく意味はわかります。もちろん正確にどんな意味なのか、修正するにはどうすればいいのかなんてことはドキュメントを読まんとわからんですけど。

んー、英語のドキュメント読むのめんどくさいなー。サイズ大きいし。とりあえずデフォルトのまま起動しちゃおうか。おかしなところを後から直していけばいいよね。

あ、グローバルアドレスで外から SMTP に直接アクセスできるような環境では、こんないいかげんなことやっちゃダメです。きちんと設定してから晒してくださいね。


起動するよ

まず、Sendmail X 以外の MTA が停止していることを確認しましょう。中身をちゃんと理解してれば複数の MTA を同時に動かすのなんてワケないことですが、初めてさわる MTA でこれをやると混乱するだけです、ハイ。

make install したときに、起動スクリプトもインストールされます。そいつを使いましょう。でもなんでキューディレクトリにあるんでしょうね。

# cd /var/spool/smx
# ./mcp.sh start

ちゃんと起動したかプロセスをを確認しましょう。

root     22427  0.0  0.5  1820  684 pts/2    S    16:48   0:00 /usr/local/smx/sbin/mcp -l -p mcp.pid /etc/smx/smx.conf
smxm     22428  0.0  1.3 27764 1668 ?        Ss   16:48   0:00 smar -f /etc/smx/smx.conf
smxq     22429  0.0  2.1 28564 2680 ?        Ss   16:48   0:00 qmgr -f /etc/smx/smx.conf
smxc     22430  0.0  1.0  3004 1320 ?        Ss   16:48   0:00 smtpc -f /etc/smx/smx.conf
smxs     22431  0.0  0.8  2776 1016 ?        Ss   16:48   0:00 smtps -f /etc/smx/smx.conf

いろんなのが起動してますね。ほんとにこれが Sendmail ですか。

mcp というのが Sendmail X の中心となるプロセスです。でも、いろんなプロセスの管理をしてるだけで、mcp 自身はメール配送には関係しません。postfix の master プロセスみたいな存在。

smar はアドレスレゾルバ、だそうです。postfix では trivial-rewrite みたいな役割かな? 配送経路ルーティングなんかもこれの担当のようです。

qmgr はキュー管理をするプロセス。postfix の qmgr と同じ名前で役割もほぼ同じ。

smtpc、smtps はそれぞれ SMTP クライアントとサーバ。メールを送る担当と、メールを受ける担当。

起動ログを確認しましょう。

Sep  8 16:48:56 colinux smar: sev=WARN, func=smar_init1, map=/etc/smx/aliases.db, type=hash, open=No such file or directory
Sep  8 16:48:56 colinux smar: sev=WARN, func=smar_init1, map=/etc/smx/access.db, type=hash, open=No such file or directory
Sep  8 16:48:56 colinux smar: sev=INFO, status=ready_to_serve
Sep  8 16:48:57 colinux smtps: sev=INFO, func=ss_load_configs, pid=22431, configuration=loaded, just=kidding
Sep  8 16:48:57 colinux smtps: sev=INFO, func=ss_start_threads, pid=22431, where=start, threads=8, addr=0.0.0.0, port=-1
Sep  8 16:48:57 colinux smtpc: sev=INFO, index=0, pid=22430, configuration=loaded, just=kidding
Sep  8 16:48:57 colinux smtpc: sev=INFO, func=sc_start_threads, index=0, pid=22430, threads=8

ありゃ、警告でてますね。aliases.db と access.db が存在してません。ちゃんと設定しましょうか。


設定するよ

まず、aliases.db の方から。テキスト形式の aliases の方は make install したときに作成されてます。バイナリ形式がないのがいけないんですね。とりあえずテキスト形式のファイルの中身を見てみましょう。

% cat /etc/smx/aliases
# Replace user with a valid user who is responsible for this MTS
postmaster:     user
root:   user
user: local:

なんだコリャ。これまでよく知ってる aliases とは形式は違いますですよ。 user: の右辺の local: って何だ? ……えーと、

To list valid local addresses in the alias map the right hand side must be the string ``local:''

だそうです

とりあえず、aliases のコメントに従って、"user" を MTS (message transfer system)の管理者ユーザに書き換えておきます。

postmaster:     yamaya
root:   yamaya
yamaya: local:

続いて、access を書きます。こいつはひながたがないのでゼロから書きます。このへん。えーと、とりあえず単純にローカルのネットワークからの送信を許可するには こんな感じでいいのかな。

cltaddr:127.0.0.1	relay
cltaddr:192.168.0	relay

んでは、aliases と access を aliases.db と access.db に変換しましょう。従来の sendmail では前者は newaliases、後者は makemap でしたが、sendmail X ではどっちも createmap のようです。でも、/etc/smx に Makefile があるから、createmap を直接起動する必要はなさそうね。

# cd /etc/smx
# make

Makefile に echo "kill -USR1 smar" などという意味不明な謎のコマンドが記述されてる。従来の sendmail と違ってファイルを書き換えるだけじゃダメで、SIGUSR1 を送らないとファイルを読み直してくれないってことなのかな? ためしにやってみたけどログには何も出力されなくて効果あるのか不明。わからんので、いったんプロセスを全停止してから再起動してみた。

# cd /var/spool/smx
# ./mcp.sh restart

ログを確認。先ほどのような WARN の行はなくなった。


メールを送ってみる

SMTP でつないでみるよ。SMTP の文法をかなり厳密に解釈するようで、けっこうハマる。

% telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 colinux.local ESMTP sendmail X.0.0.Beta1.0
ehlo hoge
250-colinux.local ESMTP Hi there
250-PIPELINING
250-SIZE 67108864		← デフォルトでは 64MB まで受け付けるようです
250-ENHANCEDSTATUSCODES
250 HELP
mail from: yamaya			← @ 以降がないと蹴られる?
501 5.1.7 Bad sender's mailbox address syntax.
mail from: yamaya@localhost		← @ 以降をつけても蹴られる?
501 5.1.7 Bad sender's mailbox address syntax.
mail from:<yamaya>		← じゃ、厳密に <> で囲ってないから?
501 5.1.7 Bad sender's mailbox address syntax.
mail from:<yamaya@localhost>	← @ も <> で必要みたい
250 2.1.0 Sender ok
rcpt to:<yamaya>
550 5.1.1 Recipient rejected.
rcpt to:<yamaya@localhost>
250 2.1.5 Recipient ok
data
354 Go
subject: test
from: yamaya
to: yamaya

test
.
250 2.0.0 got it id=S000000000000001200
Connection closed by foreign host.	← quit する前に切れちゃったよオイ

mail from:[SPC]<yamaya@localhost> のように、mail from: とアドレスの間にスペースが入るのもダメみたい。厳密なのは spam よけにはいいかも。なお、quit せずに切れたのはたぶん設定がおかしかったから。後述するような問題点をひとつずつ解決していったらいつのまにか正常になった。

では、ちゃんと送れたかログを見てみよう。

Sep  8 17:37:54 colinux smtps: sev=INFO, func=ss_hdl_session, ss_sess=S000000000000000A00, client_ipv4=127.0.0.1, client_name=Hostname_Not_Determined
Sep  8 17:38:27 colinux smtps: ss_sess=S000000000000000A00, ss_ta=S000000000000001200, mail=<yamaya@localhost>, stat=0
Sep  8 17:38:41 colinux smtps: sev=INFO, func=ss_rcpt, ss_sess=S000000000000000A00, ss_ta=S000000000000001200, rcpt=<yamaya@localhost>, idx=1, stat=0
Sep  8 17:38:56 colinux qmgr: func=qmgr_sched_dlvry, ss_ta=S000000000000001200, da_sess=C010000000000000000, da_ta=C010000000100000000, rcpt=<yamaya@localhost>, idx=1, state=1, ip=127.0.0.1, i=0
Sep  8 17:38:56 colinux smtpc: sev=WARN, func=sc_sess_open, thread=0, da_sess=C010000000000000000, where=connection, status=failed, state=0x164, ret=talking to myself

ありゃ、ローカル配送じゃなくてリレーしようとしてる。んで、自分自身に接続してコケてる(この後さらにバウンスを配送しようとしてさらにコケてるログが続く)。

ローカル配送じゃなくて、外に送らせるとどうなんだべ?

……送れました。ログが長ったらしいので成功したと判断できる部分だけ抜粋するとこんな感じ。

Sep  8 17:55:29 colinux smtpc: sev=INFO, func=sc_data, thread=0, da_sess=C010000000000000000, da_ta=C010000000100000000, ss_ta=S000000000000001B00, where=final_dot, size=259, stat=0, reply=250 Ok: queued as 32546C60B6

INFO となってるけどさ、デバッグログといってもいいぐらい細かい情報が記録されてますですね。


ローカル配送

localhost に送れない問題。smx.conf にも、/etc/smx/mt (mt = mailertable) にもローカル配送の設定がないから。しかし、なんと Sendmail X にはローカル配送エージェントが付属してない! β版だから? とりあえず汎用品(LMTP 限定??)を使えということらしい。

まず、/etc/smx/mt に localhost 宛をローカル配送させる設定を追加する。

localhost       lmtp:

smx.conf に LMTP の設定を追加する(デフォルトでコメントアウトされている部分を有効にする)。

lmtp {
        listen_socket { type=unix;
                path = lmtpsock; umask = 007;
                user = root; group = smxc; }
        start_action = nostartaccept;
        min_processes = 1;
        max_processes = 8;
        user = root;
        #path = /usr/local/bin/procmail;
        #arguments = "procmail -z+";
        path = /usr/lib/sm.bin/mail.local;
        arguments = "mail.local -l";
}

デフォルトのコメントアウト部分は procmail を使う設定だけど、これは機能が多すぎてわかりにくいので、とりあえずなじみの sendmail 8.x に入ってる mail.local を LMTP モードで起動する設定にしておいた。たぶんなってると思う。

で、これで localhost 宛のメールも送れるようになったよっ。mbox の中身。

From yamaya@localhost Thu Sep  8 18:26:27 2005
Return-Path: <yamaya@localhost>
Received: from hoge (Hostname_Not_Determined [127.0.0.1])
	by colinux.local (sendmail X.0.0.Beta1.0) with SMTP
	id S000000000000002D00; Thu,  8 Sep 2005 18:21:53 +0900
subject: test
from: <yamaya@localhost>
to: <yamaya@localhost>
Content-Length: 5

test

Message-ID: が存在していないことに注意。ローカル宛だけでなく、リモートに送ったメールでも、sm-X は Message-ID を付加していなかった。また、subject、from、to がいずれも小文字のままであることにも注目。従来の Sendmail では To のようにキャピタライズしていた。つまり、sm-X はメッセージ本文にはできるだけ手を加えない方針であるようだ。これは qmail に近いね。なお、Content-Length は mail.local が付加したもの。

ところで、127.0.0.1 は /etc/hosts にも存在してるし、DNS からも検索できるのに、なんで Hostname_Not_Determined なんだろね(ログにもいっぱい出てるの)。よくわからんね。

……えーと、わかりました。smtps はデフォルトではクライアントの逆引きをおこなわないようです。smtps の設定に access というフラグを追加してやると Sendmail 8.x の FEATURE(access_db) 相当になり、これの副作用(?)で逆引きがおこなわれて、ヘッダやログにちゃんとした逆引きホスト名が載るようになります。smx.conf にこんな感じで書いておきましょう。

smtps {
    ...
    flags { access }
    ...
}

というわけで

Sendmail X でひとまずメールを送れるようになるまでのお試しレポートでした。名前こそ Sendmail だけどさ、これまでの Sendmail とはぜーんぜん違う MTA だよね。継承しているところがほとんどない。

えっと、以下のものがありません。

これからもないことに確定してるのか、この先作るつもりがあるのか、どっちなんでしょうね。いちおう、this version of sendmail X にはない、とありましたけど、future version のことは書いてないです。とりあえず、ローカル配送は自前でサポートしないので .forward が使えない。これは procmail のような汎用品を使うという回避策がなくもないが、コマンドラインから送る手段がない、SMTP でのみ受け付けってのはどうなんですかね。MTA 自身の設定はどうでもいいけど、これまで書からたメール送信をおこなうスクリプト類のほとんどが動かかくなっちゃう。困ったね。

UNIX でよく使われる MTA のうち、sendmail の互換性が特に低いと言われるのが qmail であるが、その qmail でも /var/qmail/bin/sendmail は提供しているし、.forward を扱うためのその名も dot-forward という拡張パッケージもある。各種 MTA のうち sendmail 8 ともっとも互換性の低い MTA が sendmail X なんじゃないですかね。

ま、よほどの物好きでもなければ postfix を使っておいた方が無難だわね。


もどる
<y@maya.st>