更新履歴をはじめに書いておきます。
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 を使っておいた方が無難だわね。