メールサーバーを導入します。
例によって、「ローカルネットワークで大げさ!」というご指摘あろうかと思いますが、httpやらなんやらが管理者にメールを出す時、ローカルのメール鯖が動いていると楽なんですよ。いろいろと・・・ (^^;)
さてさて、E-Mailと言えば sendmail ・・・・なんてもう古いぜ!!! これからは Postfix だい!! という声が聞こえてきそうですね。おまけにPostfixはバグも取れてきて、安定使用しておられるサイトも多いようですが、私は昔からqmailなので。
インストール
ではまず、qmailも持ってきて解凍します。あ、それと、checkpasswordも忘れずに。
http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
http://cr.yp.to/software/qmail-1.03.tar.gz
$ wget ftp://ftp.ntnu.no/pub/unix/mail/qmail/qmail-1.03.tar.gz --14:16:06-- ftp://ftp.ntnu.no/pub/unix/mail/qmail/qmail-1.03.tar.gz => `qmail-1.03.tar.gz.1' ftp.ntnu.no をDNSに問いあわせています... 129.241.56.118 ftp.ntnu.no|129.241.56.118|:21 に接続しています... 接続しました。 anonymous としてログインしています... ログインしました! ==> SYST ... 完了しました。 ==> PWD ... 完了しました。 ==> TYPE I ... 完了しました。 ==> CWD /pub/unix/mail/qmail ... 完了しました。 ==> PASV ... 完了しました。 ==> RETR qmail-1.03.tar.gz ... 完了しました。 長さ: 220,668 (215K) (確証はありません) 100%[====================================>] 220,668 61.07K/s ETA 00:00 14:16:14 (53.04 KB/s) - `qmail-1.03.tar.gz' を保存しました [220668] $ wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz --14:18:13-- http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz => `checkpassword-0.90.tar.gz.1' cr.yp.to をDNSに問いあわせています... 131.193.36.21 cr.yp.to|131.193.36.21|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 15,631 (15K) [application/x-gzip] 100%[====================================>] 15,631 30.39K/s 14:18:14 (30.31 KB/s) - `checkpassword-0.90.tar.gz.1' を保存しました [15631/15631] $ tar xzvf qmail-1.03.tar.gz ・ ・ ・ $ tar xzvf qmail-1.03.tar.gz $ tar xzvf checkpassword-0.81.tar.gz ・ ・ ・
さて、コンパイルも前。例によって、error.hを修正しましょうね。
( qmail-1.03/ と checkpassword-0.81/ に一個づつあります)
#ifndef ERROR_H #define ERROR_H /*extern int errno;*/ #include <errno.h> extern int error_intr; extern int error_nomem; ・ ・ ・
さて、このままコンパイル・・・・してはいけません。先にユーザーを作っておかなくてはいけないのです。qmailは、動作を担当するプログラムを細かく分け、かつ、おのおのができるだけ別のユーザー権限で動こうとするのです。万が一のアタックで一部のプログラムが落ちたり乗っ取られてしまっても安心なわけです。
で。とにかく、まずqmailのディレクトリを作り、以下のようにユーザーを作ってください。
# mkdir /var/qmail # groupadd nofiles # adduser -g nofiles -d /var/qmail/alias alias -s /bin/false # adduser -g nofiles -d /var/qmail qmaild -s /bin/false # adduser -g nofiles -d /var/qmail qmaill -s /bin/false # adduser -g nofiles -d /var/qmail qmailp -s /bin/false # groupadd qmail # adduser -g qmail -d /var/qmail qmailq -s /bin/false # adduser -g qmail -d /var/qmail qmailr -s /bin/false # adduser -g qmail -d /var/qmail qmails -s /bin/false #
qmailは、コンパイル時にこれらユーザーのUIDとGIDを記憶します。なので、ここで作ったユーザーやグループは、あとでUIDやGIDを変更したりしてはいけません
あとは、例によってこのパターンでコンパイルとインストールを行います。いつもの開発環境を入れますが、qmailだけはもう一個。groff というパッケージが必要です。あらかじめ入れておいてください。これはコンパイルの時だけに必要なので、インストールが終わったら削除してかまいません。
# apt-get install groff ・ ・ ・ # make ・ ・ ・ # make setup check ・ ・ ・ nroff -man addresses.5 > addresses.0 nroff -man envelopes.5 > envelopes.0 nroff -man forgeries.7 > forgeries.0 ./install ./instcheck #
DNSを引ける環境では、 ./config スクリプトを実行すれば、とりあえずの設定をいろいろとやってくれます。(ウチの鯖は当然DNSがちゃんと引けるようになっとります。(^^) )
# ./config
これで、qmailの設定ファイル郡である /var/qmail/control/* が一通り作られます。
次に、エイリアスを作ります。qmail は、root・postmastor・mailerdaemon 宛にやってくるメールを全て /var/qmail/alias/Mailbox に届けます。安全性の確保のためですね。そのための設定は、/var/qmail/alias 以下に、「.qmail」+ユーザー名 という名前でファイルを作っておくのです。具体的には、こうなります。
# cd /var/qmail/alias # touch .qmail-postmaster # touch .qmail-mailer-daemon # touch .qmail-root # chmod 644 ./.qmail*
さて、これで一通りの設定はできました。
動作テスト
動作テストをしてみます。まずは、qmail を、仮稼動させてみます。
# ps x ・ ・ ・ 526 ? S 0:00 login -- toyotomi 547 pts/0 S 0:00 su - 548 pts/0 S 0:00 -bash 2479 pts/0 R 0:00 ps x # /var/qmail/boot/home & #ps x ・ ・ ・ 526 ? S 0:00 login -- toyotomi 547 pts/0 S 0:00 su - 548 pts/0 S 0:00 -bash 2479 pts/0 S 0:00 qmail-lspawn ./Mailbox 2485 pts/0 R 0:00 ps x #
お?動いているようですね。
この状態で、ローカルにメールを配信してくれるかどうかテストしてみます。
# echo "to:toyotomi"|/var/qmail/bin/qmail-inject # ls /home/toyotomi/ Mailbox lib/ rpm/
おぉ!ちゃんと toyotomo ユーザーのホームに、Mailboxというファイルを作って配信してくれたみたいですね。
ひとまずこれでOKです。一旦 qmailを落とします。
# ps x ・ ・ ・ 526 ? S 0:00 login -- toyotomi 547 pts/0 S 0:00 su - 548 pts/0 S 0:00 -bash 2479 pts/0 S 0:00 qmail-lspawn ./Mailbox 2485 pts/0 R 0:00 ps x # kill 2479 # ps x ・ ・ ・ 526 ? S 0:00 login -- toyotomi 547 pts/0 S 0:00 su - 548 pts/0 S 0:00 -bash 2485 pts/0 R 0:00 ps x #
maildir形式にする
qmailは、特になにも設定しないと、今回のようにMailboxという形式でメールを配信します。これはようするに、全てのメールが ~/Mailbox という単一ファイルに書き込まれる形式です。この形式は一見便利なようで、様々な問題を含んでいるそうです。また、qmailの場合、この形式では POPアクセスが出来ませんので、「Maildir」形式にしてみましょう。まあようするに、あるディレクトリに、メールごとにファイルを作ってそこに格納するという形式です。
toyotomiユーザーを、Maildir形式で受信できるようにします。手順としては、
- まず、toyotomi ユーザーに su する。
- toyotomi ユーザーのホームに移動する。
- スクリプトを使って、自動でMaildir形式のディレクトリを作る
- 「俺にはMaildir形式で配ってね。」と設定する。
- toyotomi ユーザーから抜ける
以上です。では、具体的にやってみましょう。
# su toyotomi $ cd ~ $ /var/qmail/bin/maildirmake Maildir $ echo $HOME/Maildir/ >.qmail $ exit #
・・・以上です。(簡単でしょ?)
動作実験をしてみます。まず、さっきのMailboxファイルを削除しておきます。(わかんなくなっちゃうから)
# rm /home/toyotomi/Mailbox
Maildir の中身を確認してみます。
# ls /home/toyotomi/Maildir/new #
からっぽですね。
qmail を仮稼動させ、toyotomiにメールを送ってみます。
# /var/qmail/boot/home & [1] 2497 # echo "to:toyotomi"|/var/qmail/bin/qmail-inject # ls /home/toyotomi/Maildir/new/ 1098967425.2518.toyotomi.hideyosi.local
ほら! ちゃんと配信されてますね!。うまくいったようです。
動作確認ができたら、再び仮稼動のqmailを落としておきます。
# ps x ・ ・ ・ 526 ? S 0:00 login -- toyotomi 547 pts/0 S 0:00 su - 548 pts/0 S 0:00 -bash 2499 pts/0 S 0:00 qmail-lspawn ./Mailbox 2520 pts/0 R 0:00 ps x # kill 2499 # ps x ・ ・ ・ 526 ? S 0:00 login -- toyotomi 547 pts/0 S 0:00 su - 548 pts/0 S 0:00 -bash 2521 pts/0 R 0:00 ps x #
中枢部分をdaemontoolsで起動
さて。仮稼動でほぼ動作がうまくいっていることが確認できたら、この中枢部分をdaemontoolsで起動させましょう。
daemontoolsでの管理。DNSの時にやったのと同じようなパターンになります。
- デーモンを動かすユーザーの決定or新設
- ログを受け取るユーザーの決定or新設
- /var/service以下にディレクトリを作る
- 動作させるrunスクリプトを書く
- ログ用のディレクトリを作る
- ログ受け取り用のrunスクリプトを書く
- /servece に、リンクを張る
ちなみに、qmailの場合は動かすユーザーもログ用のユーザーももう決まっています。qmailqとqmaillです。
では、実際に設定してみましょう。
# cd /var/servicd # mkdir qmail # chmod +t qmail # cd qmail # touch run # chmod 755 run # mkdir log # chmod 755 log # chown qmaill:nofiles log # touch log/run # chmod 755 log/run
さて、それでは、 run と lig/run の中身を書きます。私はこういうふうに書きました。
/var/service/qmail/run
#!/bin/sh exec env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin " \ qmail-start ./Mailbox
/var/service/qmail/log/run
#!/bin/sh exec \ setuidgid qmaill \ multilog t ./main
さあ、それでは、/service にリンクを張ってください。数秒したら、先ほどの動作テストと同じことをして、配信がうまくいくかどうか確認します。
# cd /service # ln -s /var/service/qmail
ちゃんと動いているか、ログをチェックしておきます。
# cat /service/qmail/log/main/current @4000000048f5815f23f3b27c status: local 0/10 remote 0/20
どうやらうまく稼動しているようですよ??
SMTPサーバーの設置
qmailの中枢部分がうまく稼動したら、やっぱり別のマシン(Windowsとかの)から、送信をしてみたいですよね。そこで、qmailのSMTP部分を動かしてみます。
なに。例によってdaemontoolsでチョチョイのちょい!
・・・えー。そろそろ面倒くさくなってきたので、スクリプトだけ載せときます。
# cd /var/servicd # mkdir smtp # chmod +t smtp # cd smtp # touch run # chmod 755 run # mkdir log # chmod 755 log # chown qmaill:nofiles log # touch log/run # chmod 755 log/run # touch tcp.smtp
/var/service/smtp/run
#!/bin/sh #User = qmaild exec env - PATH="/var/qmail/bin:$PATH" \ tcpserver -v -R -H -l0 -x tcp.smtp.cdb -uxxx -gxxx 0 smtp qmail-smtpd 2>&1
-u と -g は、貴方のqmaildのUIDとGIDに置き換えてください
/var/service/smtp/log/run
#!/bin/sh exec \ setuidgid qmaill \ multilog t ./main
smtpサーバーはspamメールの温床になりかねませんね。 誰でも、どこからでもこのサーバーを使われてしまうとそれこそ大変です。(自分のsmtpサーバーから世界中にspamが配信されるなんて・・・((((;゜Д゜)))ガクガクブルブル )
そのため、qmailのsmtpサーバーは初期状態(つまりインスコして稼動させただけ)ではあらゆる配信を行わず拒否します。たぶん他のマシンから送信等のテストを行ったなら、こんなエラーが出ているのではないでしょうか?
553 sorry. that domain isn't in my list of allowed rcpthosts (#5.7.1)
ある部分に、「ウチのドメインからの送信要求は受け付けておくれ。他はいままで通り拒絶ね」という指定をしてやらないといけないのです。
我が家( *.hideyosi.local )からの送信要求を受け付けるように設定します。
qmailのコントロールファイル達
/var/qmail/control/ 以下にあるのがコントロールファイル郡です。
様々な設定ができますし、ある程度は自動で生成されているはずですので、最低限の設定を行います。
locals
ここに書かれているサーバー宛のものはローカルホスト(つまり他に通信をしないで内部のみで行えという意味)として扱われます。
例えばですが、我が家の鯖のように、一つのマシンで複数のIPやホスト名を稼動させているなんて場合ですね。
localhost www.hideyosi.local ftp.hideyosi.local dns.hideyosi.local pop.hideyosi.local hideyosi.local
こんなふうに書いておくと、
toyotomi@localhost hideyosi@www.hideyosi.local toyotomi@pop.hideyosi.local
こういった宛先のメールはローカルとして自分の内部への配信なんだと理解してくれます。
ちなみに、最後の行に注目してください。
現在では多くの場合、メールアドレスはドメインを指定し、サブドメイン部は書かないことが多いですね。(そのほうが解りやすいし)
最後のものは、 toyotomi@hideyosi.local こういう形式の場合、ローカルだよという意味になります。
rcpthosts
さあお待たせしました。
ここに書かれているドメイン宛のメール。qmailはそれだけを受け付けて配信しようとし、それ以外は全て拒絶します。
このおかげで、ウチの鯖がyahoo.co.jp等ヨソ宛のメールを配信したりがないわけです。
ウチのドメインは hideyosi.local なので、toyotomi@hideyosi.local等宛のメールは受付け、配信するようにここに書いておきましょう。
localhost .hideyosi.local hideyosi.local
さあ!
これで、 toyotomo@pop.hideyosi.local や lina@www.hideyosi.local は送信できるようになったはず!!
他のWindowsマシンとかから送信してみよう!!
サブドメイン省略型
・・・でも、イマイチ・・・・
そう。この状態だと、まだ toyotomi@hideyosi.local の形式の配信はしてくれないんだ!!
(rcpthostsで書いたって? おっと。誤解があるようです。あそこはあくまでも、smtpサーバーが受け付けるという設定。受け付けた結果、「こんなアドレスじゃ配信先がわからんぞ?」ということだってある。今はそれに近い状態なわけ。)
サブドメイン部が省略された場合、ちゃんと補完してくれればいいよね?
そのための設定が defaulthost というファイルなわけ。
このファイルは標準では生成されていないはず。自分で作ろう
この名前のファイルに
hideyosi.local
と書いておけばそれでOKなのだー!
このファイルはsmtpだけではなく、配信を司るqmailにも影響するので両デーモンを再起動しておこう
# echo hideyosi.local > /var/qmail/control/defaulthost # svc -t /service/smtpd # svc -t /service/qmail
さあ、これで、 toyotomi@hideyosi.local 形式のメールを送信・受付・配信できるようになったはずだよ!
POPサーバーの設置
# cd /var/servicd # mkdir pop # chmod +t pop # cd pop # touch run # chmod 755 run # mkdir log # chmod 755 log # chown qmaill:nofiles log # touch log/run # chmod 755 log/run # touch tcp.pop
/var/service/pop/run
#!/bin/sh exec env - PATH=/bin/:/usr/local/bin:/var/qmail/bin \ tcpserver -vRH -c 40 -x ./tcp.pop3.cdb 0 pop-3 \ qmail-popup pop.mana.local checkpassword qmail-pop3d Maildir 2>&1
/var/service/pop/log/run
#!/bin/sh exec env - PATH=/usr/local/bin:$PATH \ setuidgid qmaill \ multilog t ./main \ -'* status: *' \ -'* from 192.168.1.*' \ -'*' \ +'* status: *' \ =status