この章はsendmailのみに関する内容です。qmailの章はHOWTOの次のバージョン で追加します(訳注:Qmailに関するマニュアルは「Qmail+MH」などが出て います)。
現在、仮想メールのサポートに関する要求はますます増えています。Sendmailは
仮想メールをサポートすると言っていますが、その内容は異なるドメインからの
メール取り込みのことのようです。
メールをどこかにフォワードさせるということができます。しかしもしローカル
マシンにフォワードしたりbob@domain1.com、bob@domain2.com
にメールが
来る場合などでは同じメールフォルダにたまってしまうでしょう。これは
bob宛のメールが実際は違う人宛で中身も違うのだから問題です。
ユーザー名に番号を追加(例えばbob1, bob2など)したり、頭に文字を入れて
dom1bob, dom2bobにしたりすることによってユーザーの一意性(unique)を
保証することはできます。これを裏で変換するように mailやpop をハック(hack)
することもできますが汚い(messy)方法です。
出ていく方のメールもまたバーナー(ヘッダ)にmaindomain.com
がついていて
各サブドメインのメールバーナーも違ったものにしたいのです。
各仮想ファイルシステムに各ドメイン用の/etc/passwd
を用意してい
ます。これはbob@domain1.com
とbob@domain2.com
が、別々の
/etc/passwd
上の違うユーザーであり、メールのトラブルはないという
ことになります。このユーザー達には自分用のspoolディレクトリが用意されていて、
各仮想ファイルシステム上のメールフォルダは互いに違うものであることになりま
す。
しかし、sendmailはちょっとしたソースコードの修正が必要です。
sendmailは/etc/sendmail.cw
と呼ばれるファイルを持っています。
これはsendmailが他のホストに転送しないでローカルに配送する全ての
ホスト名を含んでいるファイルです。
sendmailはマシン上の全デバイスの内部チェックを、ローカルIPでこのリストを 初期化するために行います。 もし同じマシン上の仮想ドメイン間でメールを送る場合、問題が出てきてしまい ます。sendmailには他の仮想ドメインがローカルアドレスであり、メールもロー カルにスプールするという考えはないのです。
例えばbob@domain1.com
さんがfred@domain2.com
にメールを送ったと
します。domain1.com
のsendmailはdomain2.com
がローカルであると
判断するのでdomain1.com
にメールをスプールしてしまい、結果として
domain2.com
にメールが届くことはありません。
そこでsendmailを修正してやります(著者はv8.8.5のsendmailでこれを行い、特に
問題はありません)。src/main.c
の494行辺りを編集します。
sendmailのソースは適当なサイトやディストリビューションCDROMから入手できま
す。
vi v8.8.5/src/main.c # Approximately Line 493として、
load_if_names();という箇所を
/* load_if_names(); Commented out since hurts virtual */とコメントアウトしてしまいます(訳注:この関数はインターフェースの 走査と追加名の場所をしめす関数でconf.c line 4399にこの関数自体が あります。IPリストのスキャンなどを行っています)。 もし仮想ドメイン間のメール送信が必要ならこれを行うだけでよいことに注意して 下さい。
問題は解決されたのですが、メインのイーサネットデバイスeth0は削除されていま
せん。そこで、もし同一マシンの仮想IPからeth0上のIPにメールを送る場合は
ローカルに送られます。著者はダミーIPvirtual1.domain.com (10.10.10.157)
として使っています。このホストにはメールを送らないのでどの仮想ドメイン
もいりません。これはシステムが大丈夫かどうかチェックするために sshでログイン
する時に使うIPでもあります。
/etc/sendmail.cw
の編集
vi /etc/sendmail.cw mail.domain1.com domain1.com domain1 localhostm4を使って
/etc/sendmail.cf
を好きなように作ります。
著者は以下のようなものを使いました。
divert(0)dnl VERSIONID(`@(#)tcpproto.mc 8.5 (Berkeley) 3/23/96') OSTYPE(linux) FEATURE(redirect) FEATURE(always_add_domain) FEATURE(use_cw_file) FEATURE(local_procmail) MAILER(local) MAILER(smtp)(訳注:m4はUNIXマクロプロセッサで、たいていのシステムに入っています。 最新バージョンは
ftp://prep.ai.mit.edu/pub/gnu/
から
入手できます。m4 linux.mc > /etc/sendmail.cf
などとして使います。
m4の例が/usr/lib/m4-example
にあります。オプションはm4 --help
で調べて下さい)
/etc/sendmail.cf
を仮想ドメイン応答するように編集。
vi /etc/sendmail.cf # 86行辺りを編集 # my official SMTP hostname (defined automatically) #Dj$w.Foo.COM という箇所があるので、これを # my official SMTP hostname (defined automatically) Djdomain1.com としておきます。
sendmailはそれ自身ではそのサービスを始めることができず、inetdを 通して起動する必要があります。これは役に立つことでもなく起動時間を 遅くしているだけでしょう。読者が高速なサイトを管理しているなら 仮想マシン上に他のドメインを占有させるべきではないかもしれません。
-bd
フラグを付けて起動することは決してしないで下さい。
(訳注:このフラグはsendmailをデーモンとして起動するオプションです。
くわしいことはman sendmail
して下さい)。
また各ドメインで配送していないメールを送り出す(queue up)するために
sendmail -q
と実行する必要があることに注意してください。
#!/bin/sh # Source function library. . /etc/rc.d/init.d/functions case "$1" in start) echo -n "Starting sendmail: " daemon sendmail -q1h echo echo -n "Starting virtual sendmail: " for i in /virtual/* do if [ ! -d "$i" ] then continue fi if [ "$i" = "/virtual/lost+found" ] then continue fi chroot $i sendmail -q1h echo -n "." done echo " done" touch /var/lock/subsys/sendmail ;; stop) echo -n "Stopping sendmail: " killproc sendmail echo rm -f /var/lock/subsys/sendmail ;; *) echo "Usage: sendmail {start|stop}" exit 1 esac exit 0
popは特に何もせずにインストールしてしまいます。virtualdのパートを追加した上で inetdのエントリーをすることが必要です。sendmailとpopに関するinetd.confの エントリは、
pop-3 stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.pop in.qpop -s smtp stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.mail sendmail -bsとなります。