Sendmail に代わるべき次世代のメールサーバーと言われているqmailをインストールしましょう。既にsendmailがインストールされているものとして話を進めます。さらに、日本製メーリングリストサーバーである、fmlをqmail上に導入する際の注意点を挙げておきます。
1.qmailのインストール
まず、ソースをダウンロードして、適当なディレクトリ(例:/usr/local/src)に置きます。また、localtime用のpatchもここから取ってきます。同時にtcp_wrappersと.frowardをそのまま使うためのdot-forwardもダウンロードしてしておきましょう。あるいは、tcp_wrappersの代わりにtcperver(後述)を利用するのもいいでしょう。まず、qmailインストールのための準備としてgroupとuserを作成します。
# pw groupadd nofiles # pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent # pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent # pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent # pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent # pw groupadd qmail # pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent # pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent # pw useradd qmails -g qmail -d /var/qmail -s /nonexistent
次に展開してpatchを当てます。
# cd /usr/local/src # tar zxvf qmail-1.03.tar.gz # cp qmail-date-localtime.patch ./qmail-1.03 # cd qmail-1.03 # patch -s -p1 < qmail-date-localtime.patch
そしてmake
# make setup check # ./config
そして~alias以下に3つのファイルを作ります。
# cd ~alias # touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
次に、自動起動用のファイルをコピーして起動script(例:/etc/rc)に書き加えます。同時に sendmailの起動部分をコメントアウトします。ここでは基本のhomeを使いますが、procmailやdot forwardを使う場合はprocやproc+dfなどををコピーします。
# cp /var/qmail/boot/home /var/qmail/rc # ee /etc/rc ----- . . #case ${sendmail_enable} in #[Yy][Ee][Ss]) # if [ -r /etc/mail/sendmail.cf ]; then # echo -n ' sendmail'; /usr/sbin/sendmail ${sendmail_flags} # fi # ;; #esac. # qmail csh -cf '/var/qmail/rc &' -----
ホスト名を省略した、ユーザー名@ドメイン名で受信できるように、localsとrcpthostsファイルにドメイン名を書き加えます。
# vi /var/qmail/control/locals ----- . . . fujie.org ----- # cp /var/qmail/control/locals /var/qmail/control/rcpthosts
rc.confファイルのsmtpの部分をコメントアウトします。
# ee /etc/rc.conf ----- # sendmail_flags="-bd -q30m" ==> 行頭に#を付けてコメントアウト -----
sendmailをkillしてリンクします。
# ps -ax # kill 189(例) # chmod 0 /usr/sbin/sendmail # mv /usr/sbin/sendmail /usr/sbin/sendmail.bak # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
2.Mail directory
qmail はデフォルトでは、メール形式は従来のMailbox形式で配送されます。しかし、作者も書いているようにセキュリティの面からもMaildir形式が推奨されています。これだとメールが一通毎のファイルになりより安全です。Maildir形式に変えるには2つの方法があります。まず、起動ファイルを変更する方法で例えば、
# ee /var/qmail/boot/home として ----- qmail-start ./Mailbox splogger qmail を qmail-start ./Maildir/ splogger qmail に変更する。 これを、前記のように、/var/qmail/rc にコピーする。 ----- # cp /var/qmail/boot/home /var/qmail/rc
もうひとつの方法としては、ホームディレクトリに次のような配送ファイルを置きます。
$ cd ~ $ ee .qmail ----- ./Maildir/
いずれにせよ、ホームディレクトリにMaildir(他の名前でも構いません)を置かなくてはなりません。maildirmakeコマンドを利用します。
$ cd ~ $ /var/qmail/bin/maildirmake Maildir
これで、~/Maildir/new にメールが貯まります。
3.TCP-wrapper
次にtcp_wappersをインストールします。これは不正な中継を拒否するために必須です。次に述べる tcpserver でも構いません。FreeBSDに元からインストールされている、あるいはportsでインストールしたtcp_wrappersでは、hosts.allowが効かないので、ソースからインストールしました。
# cd /usr/local/src # tar zxvf tcp_wrappers_7.6.tar.gz # cd tcp_wrappers_7.6 # make # make REAL_DAEMON_DIR=/usr/libexec STYLE=-DPROCESS_OPTIONS freebsd # cp tcpd /usr/sbin/
inetd.confを以下のように書き換えます。
# ee /etc/inetd.conf ----- smtp stream tcp nowait qmaild /usr/sbin/tcpd /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd (1行で) -----
次に、hosts.allowを以下のように書き換えます。今まで書いてあるものは消します。
# ee /etc/hosts.allow
----- tcp-env: 127.0.0. : setenv = RELAYCLIENT tcp-env: 203.183.84. : setenv = RELAYCLIENT tcp-env: 192.168.1. : setenv = RELAYCLIENT tcp-env: .wind.ne.jp : setenv = RELAYCLIENT tcp-env: .uncle.or.jp : setenv = RELAYCLIENT tcp-env: .fujie.org : setenv = RELAYCLIENT tcp-env: ALL ALL : 127.0.0. : allow -----
これは、中継を許可するサイトで、203.183.84.*** や ***.wind.ne.jp などからの中継を許可します。 最後のALLは中継はしないが受信はすべてするという意味です。
4.tcpserver
tcpserverはqmailの作者と同じ人が作ったソフトで、inetdに代わるべきものと言われています。確かにinetdより速く安全のようです。詳しくは http://cr.yp.to/ucspi-tcp.html を参照してください。まずucspi-tcpをダウンロードして、/usr/local/src/に起きます。そしてmakeします。
# cd /usr/local/src # tar zxvf ucspi-tcp-0.88.tar.gz # cd ucspi-tcp-0.88 # make # make setup check
これで、/usr/local/binにtcp*がインストールされます。次に、smtpのアクセスをコントロールする /etc/tcp.smtp.cdb を作成します。最初にルールを/etc/tcp.smtpに記述します。
# cd /etc # ee tcp.smtp ----- 192.168.:allow,RELAYCLIENT="" 203.183.:allow,RELAYCLIENT="" 127.0.0.:allow,RELAYCLIENT="" =.wind.ne.jp:allow,RELAYCLIENT="" =.uncle.or.jp:allow,RELAYCLIENT="" =.fujie.org:allow,RELAYCLIENT="" :allow
これは先に書いたhosts.allowと同じ意味になります。さらに、
# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
として /etc/tcp.smtp.cdb を作成します。/etc/tcp.smtpを変更したときは、必ずこのコマンドを実行して、/etc/tcp.smtp.cdbを作り直す必要があります。次に、inetd.conf のsmtpに関する行をコメントアウトします(行頭に#を付けて無効にする)。最後にtcserverでqmail-smtpを起動できるように、次のような起動スクリプトをrc.localなどに記載します。
# ee /etc/rc.local ----- # tcpserver smtp /usr/local/bin/tcpserver -hp -u 1005 -g 1004 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd & -----
この場合、1005と1004はqmaildのUIDとGIDです。これで次回起動時から有効になります。
5.qmail-pop3d
sendmail + qpopper で動かしていた pop3d も qmail-pop3d に変更し、Maildir に対応させます。まず、checkpassword をインストールします。ここからソースをダウンロードして展開して make します。
# cd /usr/local/src # tar zxvf checkpassword-0.90.tar.gz # cd checkpassword-0.90 # make # make setup check
tcp_wrappers を使用する場合、inetd.conf のqpopperの部分はコメントアウトし、次のような行を1行で追加します。
# ee /etc/inetd.conf pop3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup ns.fujie.org /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir
tcpserver で qmail-pop3d を起動したいばあいは、inetd.conf の pop3dの部分をコメントアウトして、次のようなスクリプトを起動ファイル( /etc/rc.local など)に追加します。
# tcpserver qmail-pop3d /usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup ns.fujie.org /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
6.procmail
sendmailの時に使っていたprocmailをqmailでも使ってみましょう。ホームディレクトリの .qmail に記載する方法と、いままで使っていた .forward を利用する方法がありますが、どうも、.qmail の方法だと、受信時刻がGMTになってしまうので、.forwardを再利用する方法でゆきます。まず、.forwardを利用できるようにする、dot-forwardをインストールします。
# cd /usr/local/src/ # tar zxvf dot-forward-0.71.tar.gz # cd dot-forward-0.71 # make setup check
.forwardファイルは、ホームディレクトリに置きます。内容は、参考までに僕のを載せておきます。
"|IFS=' ' && p=/usr/local/bin/procmail && test -f $p && exec $p -Yf- || exit 75 #masao"
さらに起動ファイルをhomeからproc+dfに変更します。
# cp /var/qmail/boot/proc+df /var/qmail/rc
これで今までどおりのディレクトリに受信メールを振り分けられるはずです。
7.fml
深町さん作成のメーリングリストサーバーです。インストール方法は深町さんのページが詳しいのでそちらを参照してください。qmailとの組み合わせで補足事項を中心に書きます。まず、念のためmlディレクトリの所有者をfmlにします(僕はfmlというユーザーでfmlをインストールしました)。
# cd /var/spool # chown -R fml ml # chgrp -R fml ml
alias ディレクトリに見本ができていると思いますので、それを確認します。
# cd /var/spool/ml/etc/qmail/alias # ls .qmail-test-ml .qmail-test-ml-admin .qmail-test-ml-ctl .qmail-test-ml-default .qmail-test-ml-request
次に、パスワードファイルからassignファイルを作り出すコマンドを使います。
# /var/qmail/bin/qmail-pw2u < /etc/passwd > /var/qmail/users/assign
そして、assignファイルの最後に次の行を追加します。最後のドットを忘れずに。メーリングリスト名は test-ml としています。
# ee /var/qmail/users/assign ----- . . +test-ml:fml:1003:1003:/var/spool/ml/etc/qmail/alias:-:test-ml: . -----
1003はfmlのUIDとGIDです。そしてこのassignを有効にします。
# /var/qmail/bin/qmail-newu
これで動くはずです。
投稿メールをhtml化する際に、SHIFT-JISとして保存するために(デフォルトはJISです)、次のような行をconfig.phに追加しています。
----- $HTML_OUTPUT_FILTER = "/usr/local/bin/nkf -s"; -----
-sを-eに変更するとEUCに変換されます。
さらにhtmlファイルのヘッダ部分を代えるために、次のような部分を、config.phやsite_forces.phなどに追加します。なお、これはfml-helpメーリングリストの村下さんのお返事を参考にしました(ほとんどそのままです)。深謝。
----- #HTML化するときのMETAタグの変更 $mypreamble = q#<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS"> #; $HTML_FORMAT_PREAMBLE = $mypreamble; $INDEX_HTML_FORMAT_PREAMBLE = $mypreamble; -----
メーリングリストなのに、reply-to を自分のアドレスに変える輩が絶えないので、また、メンバーリストが盗まれないように、スパムの排除のため、またhtmlメールを排除するため、次のようにcfに付け足しています。
----- # YOU CAN EDIT MANUALLY AFTER HERE. # FOR SECURITY, Disable user to retrieve member list # fml 3.0 style # @DenyProcedure = ('member','active','members','actives','status','stat'); # # fml 4.0 style &DENY_PROCEDURE('member'); # _this_line_is_added_by_makefml_ &DENY_PROCEDURE('active'); # _this_line_is_added_by_makefml_ &DENY_PROCEDURE('members'); # _this_line_is_added_by_makefml_ &DENY_PROCEDURE('actives'); # _this_line_is_added_by_makefml_ &DENY_PROCEDURE('status'); # _this_line_is_added_by_makefml_ &DENY_PROCEDURE('stat'); # _this_line_is_added_by_makefml_ ########## $DISTRIBUTE_FILTER_HOOK = q# if ($e{'Body'} =~ /Content-Disposition:\s*attachment/i) { return 'THIS ML NOT PERMIT ATTACHMENT'; } #; $DISTRIBUTE_FILTER_HOOK = q# if ($e{'h:received:'} =~ /from spam.co.jp/) { return 'from a host in spam blacklist'; } if ($e{'Body'} =~ /http-equiv=3DContent-Type/) { return 'mail with appended HTML documents'; } #; &DEFINE_FIELD_FORCED('reply-to', $MAIL_LIST); $FILTER_NOTIFY_REJECTION = "1"; -----
最後にウィルス対策として、http://www.fml.org/software/fml/Japanese/examples/virus_check.phを参考にsite_force.ph を置いています。