qmail によるメールサーバ構築


  1. qmail
  2. apop
  3. imap
  4. smtp
  5. tcpserver 設定
  6. tcpserver の起動確認
  7. 接続制御データベース自動生成
  8. apop の起動も tcpserver へ移す
  9. 文献
  10. ezmlm

[1] qmail

[1.1] exim4 のアンインストール

qmail をインストールするにあたってかち合わないように squeese の標準搭載されている exim4 をアンインストールする.

exim4 関連のパッケージを確認する.

$ dpkg --list | grep exim
 
 exim4               4.72-6+squeeze2  metapackage to ease Exim MTA (v4) installation
 exim4-base          4.72-6+squeeze2  support files for all Exim MTA (v4) packages
 exim4-config        4.72-6+squeeze2  configuration for the Exim MTA (v4)
 exim4-daemon-light  4.72-6+squeeze2  lightweight Exim MTA (v4) daemon

exim 関連パッケージをアンインストールする.

# aptitude remove exim4 exim4-base exim4-config exim4-daemon-light
bsd-mailx パッケージもアンインストールされるが気にせず続行する.

exim4 の起動スクリプトを無効にする.

# chmod 000 /etc/init.d/exim4
# mv /etc/init.d/exim4 /etc/init.d/exim4.bak

cron から呼び出されないようする.

# vim /etc/cron.daily/exim4-base
以下を加える
 # by TOYODA Eizi, 1999-09-22. We need not exim.
  if [ ! -f /etc/exim.conf ]; then
      exit 0
  fi

[1.2] qmail-src パッケージの取得

qmail-src をダウンロードするために /etc/apt/sources.list に non-free を追加する.

# vim /etc/apt/sources.list
以下を加える.
 deb http://dennou-h.gfd-dennou.org/debian/ squeeze main non-free

qmail-src パッケージをダウンロードする.

# aptitude update
# aptitude install po-debconf
※  このパッケージは qmail ビルド時に必要になる
# aptitude install qmail-src
qmail-src をダウンロード中 /var/qmail ディレクトリがないと警告されるが無視して続行する.

[1.3] qmail のコンパイルとインストール

ucspi-tcp のビルドとインストールをする.

# build-ucspi-tcp
Enter a directory where you would like to do this [/tmp/ucspi-tcp] Enter 

Press ENTER to continue... Enter

Do you want to remove all files in /tmp/ucspi-tcp, except ucspi-tcp_0.88-15_i386.deb now? [Yn] Y

Do you want to install ucspi-tcp_0.88-15_i386.deb now? [Yn] Y

Do you want to purge ucspi-tcp-src now? [yN] N

qmail のビルドとインストールをする.
# build-qmail
Enter a directory where you would like to do this [/tmp/ucspi-tcp] Enter 

Press ENTER to continue... Enter

Do you want to remove all files in /tmp/ucspi-tcp, except qmail_1.03-49.2_i386.deb now? [Yn] Y

Do you want to install qmail_1.03-49.2_i386.deb now? [Yn] Y

Do you want to purge qmail-src now? [yN] N

[1.4]初期設定

[1.4.1]制御ファイルの作成

qmail 制御ファイルに設定を書き込む. 詳細は文献 2を見よ.
制御ファイルは /var/qmail/control/ 以下にあり, 制御ファイルの詳細は
qmail-control に記述されている.

パッケージでインストールしたので自ホスト名の設定などは自動でされているがもしされていなかったら以下のコマンドで設定する.

# cd /var/qmail/control/
# ./config

このスクリプトは,ホスト名を DNS 検索し, それぞれの制御ファイルへ以下の情報を書き込む.

/var/qmail/control/defaultdomain  ->   ep.sci.hokudai.ac.jp
/var/qmail/control/locals         ->   localhost
                                       usuzumi.ep.sci.hokudai.ac.jp
/var/qmail/control/me             ->   usuzumi.ep.sci.hokudai.ac.jp
/var/qmail/control/plusdomain     ->   ac.jp
/var/qmail/control/rcpthosts      ->   localhost
                                       usuzumi.ep.sci.hokudai.ac.jp

DNS に登録がなされていないと正しく動作しないことに注意されたい.

yellow によって, ep.sci.hokudai.ac.jp の MX を向けられてい る場合,
別ホストあてのメイルも受け取りたい」に従って ローカル処理すべきドメイン名に ep.sci.hokudai.ac.jp を追加する.

# echo ep.sci.hokudai.ac.jp >> /var/qmail/control/locals
# echo ep.sci.hokudai.ac.jp >> /var/qmail/control/rcpthosts

また,「 ホスト名を隠したい」に従って,ドメイン部のないアドレスにつける ホスト名を設定する.

# echo ep.sci.hokudai.ac.jp > /var/qmail/control/defaulthost
# chmod 644 /var/qmail/control/defaulthost

databytes と queuelifetime を作る.

# echo 10000000 > /var/qmail/control/databytes
# chmod 644 /var/qmail/control/databytes
# echo 259200 > /var/qmail/control/queuelifetime
# chmod 644 /var/qmail/control/queuelifetime

設定がちゃんとされているか確認する. (詳細はqmail-showctl(8)

# /var/qmail/bin/qmail-showctl

それぞれのファイルには最終的に以下のように書き込まれていればよい.

/var/qmail/control/databytes       ->  10000000
/var/qmail/control/defaultdomain   ->  ep.sci.hokudai.ac.jp
/var/qmail/control/defaulthost     ->  ep.sci.hokudai.ac.jp
/var/qmail/control/locals          ->  localhost
                                       usuzumi.ep.sci.hokudai.ac.jp
                                       ep.sci.hokudai.ac.jp
/var/qmail/control/me              ->  usuzumi.ep.sci.hokudai.ac.jp
/var/qmail/control/plusdomain      ->  ac.jp
/var/qmail/control/queuelifetime   ->  259200
/var/qmail/control/rcpthosts       ->  localhost
                                       usuzumi.ep.sci.hokudai.ac.jp
                                       ep.sci.hokudai.ac.jp

./config でエラー出力される場合

以前, gate 登録システムによって DNS 登録を行った直後に
サーバの構築を行ったことがあるがエラーが出力された.
これは DNS の逆引きができなかった事が原因となっていた.
(DNS の逆引きは EP サーバではサービスしていない.
しばらくすると北大大計の DNS サーバで逆引きできるようになる)
このような場合,DNS 検索をしないスクリプトを用いて設定を行う.

# ./config-fast usuzumi.ep.sci.hokudai.ac.jp

[1.4.2]各種エイリアスアドレス

システムのアドレスを設定する.

# cd /var/qmail/alias
# echo '&epmail' > .qmail-root
# echo '&root' > .qmail-postmaster
# echo '&root' > .qmail-mailer-daemon
# echo '&root' > .qmail-bin
# echo '&root' > .qmail-daemon
# echo '&root' > .qmail-games
# echo '&root' > .qmail-ingres
# echo '&root' > .qmail-nobody
# echo '&root' > .qmail-system
# echo '&root' > .qmail-toor
# echo '&root' > .qmail-uucp
# echo '&root' > .qmail-usenet
# echo '&root' > .qmail-anonymous
# echo '&root' > .qmail-mail
# echo '&epwww' > .qmail-www
# echo '&epdns' > .qmail-dns

# chmod 644 .qmail-*

以上により,
postmaster, mailer-daemon, bin, daemon, games, ingres,
nobody, system, toor, uucp, usenet, anonymous, mail
あてのメールは root に転送され,root あてのメールは epmail に転送される. 詳細は dot-qmail(5) . 面倒な人ようにエイリアスアドレスの設定をしてくれるシェルスクリプトを書いた. alias.sh メールサーバに持ってきてルートで実行して欲しい.

# chmod u+x alias.sh
# ./alias.sh

[1.4.3]パスを通す

/var/qmail/bin 以下のコマンドにパスを通す.
bash ユーザのために /etc/profile の PATH= の行を編集し,/var/qmail/bin を付け加える.

# vim /etc/profile
PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/var/qmail/bin"

csh ユーザのために,/etc/csh.cshrc を編集し,同様に付け加える.

# vim /etc/csh.cshrc
setenv PATH /usr/local/bin:/usr/bin:/bin:/var/qmail/bin

[1.4.4] man を有効にする

パッケージなので追加しなくても自動で追加してくれるが, もし man が有効になっていなかったら, /etc/manpath.config を編集し以下の赤い部分を付け加える.

# vim /etc/manpath.config
#MANDATORY_MANPATH/usr/src/pvm3/man
......
MANDATORY_MANPATH/usr/local/man
MANDATORY_MANPATH/var/qmail/man
...
#*PATH**MANPATH*
.........
MANPATH_MAP/opt/sbin/opt/man
MANPATH_MAP/var/qmail/bin/var/qmail/man
...
#*PATH**CATPATH*
.........
MANDB_MAP/opt/man/var/cache/man/opt
MANDB_MAP/var/qmail/man/var/qmail/man

[1.4.5]~/Mailbox への配送

Mailbox へ配送するために /etc/profile に以下を書き加える.

# vim /etc/profile
MAIL="$HOME/Mailbox"
MAILDROP="$HOME/Mailbox"

export MAIL MAILDROP

同様に /etc/csh.cshrc に以下を書き加える.

# vim /etc/csh.cshrc
setenv MAIL $HOME/Mailbox
setenv MAILDROP $HOME/Mailbox

なお,各ユーザのホームディレクトリのパーミッションは
755 でないとメール配送時にエラーが出るらしい.

[1.5]qmail 起動

パッケージで入れたので勝手に起動スクリプトが存在する. qmail が自動で起動していなければ手動で起動する.

# /etc/init.d/qmail start

起動したか確かめる qmail 関係が存在すれば動いている

$ ps aux | grep qmail

[1.6]テスト

文献 6 に従い,配送テスト (ローカル配送,リモート送り出しテスト) を行う. 以下ではルートを抜け自分のアカウントで作業を行う.

[テスト1] ローカル配送テスト part1

自分に送る準備をする.

$ echo ./Mailbox > ~/.qmail
$ touch ~/Mailbox

自分へメールを送ってみる. hoge は自分のユーザ名に変え,以下のコマンドを実行する.
~hoge/Mailbox にメールが送られることを確認.

$ echo to: hoge | /var/qmail/bin/qmail-inject

確認する

$ lv ~/Mailbox

[テスト2] ローカル配送テスト part2

存在しない宛先に送ってみる. バウンスメールが~hoge/Mailbox に送られてくるのなら OK.

$ echo "to: nonexisten" | qmail-inject
$ lv ~/Mailbox

[テスト3] リモート送り出しテスト

他のホスト上のアカウントへ送ってみる.届いていれば OK . 届かなければ,/var/log/syslog を参照して原因を追求する.

$ echo to: hoge@gfd-dennou-org | /var/qmail/bin/qmail-inject
もし届いていなければ
# lv /var/log/syslog

[1.7]文献

  1. http://man.qmail.jp/jinstall/install1.html
  2. http://man.qmail.jp/jinstall/install.ctl.html
  3. http://www.y-min.or.jp/~nob/qmail/install.html
  4. http://man.qmail.jp/jinstall/install3.html
  5. http://man.qmail.jp/jinstall/remove.sendmail.html
  6. http://man.qmail.jp/jinstall/test.deliver.html
  7. http://man.qmail.jp/jinstall/test.receive.html

2. apop

[2.1] 取得・コンパイル

http://jaist.dl.sourceforge.net/sourceforge/checkpw/より,checkpw-1.02.tar.gz を取得,展開.
checkpw-0.80/INSTALL に従ってコンパイルする.

$ tar zxvf checkpw-1.02.tar.gz
$ cd chekpw-1.02/
$ make
# make setup check

/bin/checkapoppw ができる.

[2.2] 設定

[2.2.1] inetd からの呼び出し

/etc/inetd.conf を編集する.

# vim /etc/inetd.conf

以下を一行で追加する.

pop-3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup grey.ep.sci.hokudai.ac.jp /bin/checkapoppw  /var/qmail/bin/qmail-pop3d Maildir

inetd のプロセス番号を探す.

$ ps aux | grep inetd
hoge      xxxx  0.0  0.0   1956   608 ?        Ss   Oct19   0:00 /usr/sbin/inetd
※         ↑
※        これがプロセス番号

inetd を再起動する

# kill -HUP xxxx
kill コマンドの主要なシグナルの意味は以下
HUP終了後再起動
KILL強制終了
TREM通常終了(デフォルトだとこれ)

inetdの代わりにxinetdを用いる場合
もし, intedではなくxinetd で行うのならば /etc/xinetd.conf を編集する.
# vim /etc/xinetd.conf
以下を追加する.

service pop3
{
socket_type     = stream
wait            = no
user            = root
server          = /var/qmail/bin/qmail-popup
server_args     = grey.ep.sci.hokudai.ac.jp /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir
}

再起動する.

# /etc/init.d/xinetd restart

[2.2.2] ~/Maildir/ への配送

[2.2.2.1] 環境変数の設定

すでに ~/Mailbox へ配送するための環境変数は設定した.
apop によるメールの読み出しは EP サーバでは maildir 形式を用いる.

はじめに,環境変数 MAILDIR を設定する. 環境変数の設定は ~/Mailbox への配送でも行ったが,
bash は /etc/profile,csh は /etc/csh.cshrc に書き込む.

/etc/profile に次の 1 行を加える.

# vim /etc/profile
MAILDIR="$HOME/Maildir/" 
export MAILDIR

/etc/csh.cshrc には次の 1 行を加える.

# vim /etc/csh.cshrc
setenv MAILDIR $HOME/Maildir/

次に配送テストのために一般ユーザで次の設定を行う.

[2.2.2.2]~/Maildir の作成

mildirmake のスクリプトを取得する. 現 mail サーバから取得する.

# scp hoge@grey.ep.sci.hokudai.ac.jp:/var/qmail/bin/maildirmake /var/qmail/bin/

Maildir を作成する

$ /var/qmail/bin/maildirmake ~/Maildir
[2.2.2.3] .qmail の編集

次に ~/Maildir への配送を qmail に指示する (.qmail へ配送先ディレクトリを記述する).

$ echo ./Maildir/ >> ~/.qmail
$ chmod 600 ~/.qmail

.qmail のパーミッションは,600 か 644 でなければならない. 要は,実行許可が出ていないことと
オーナー以外に書き込みが許可されていないことが要求される.

以上の作業は各ユーザごとに行わねばならないが, /etc/skel/ 以下 に, .qmail や Maildir/ を置いておけば, adduser コマンドを用いてアカウ ントを新規に作ったときにできるホームディレクトリ内にこれらは自動で入る. こうすることによって, 新規にアカウントを取得する一般ユーザは, 以上の作 業が不要になる.

[2.2.2.4] [認証パスワードの設定]

~/Maildir/.password ファイルを作る. APOPPASSWORDの部分は自分で考えた適切なパスワードに変えること.

$ echo 'APOPPASSWORD' > ~/Maildir/.password
$ chmod 600 ~/Maildir/.password

この中身(APOPPASSWORD)が, apop でメールを読むときの認証パスワードとなる. パーミッションを600としないとapopが働かない.

[2.3] テスト

grey の外のホストから apop 対応メーラー(例. Thunderbird)を用いて apop サーバを grey に指定して grey 上の自分のアカウントあてに届いたメールを読んでみる.

[2.4]文献

  1. http://checkpw.sourceforge.net/checkpw/
  2. http://www.y-min.or.jp/~nob/qmail/qmail-pop3d.html

3. imap

以前は UW-IMAP を用いていたが, 2011年より機能が不安定になった. よって, Dovecot を使用する.

[3.1] 取得

Dovecot をパッケージからインストールする

# apt-get install dovecot-imapd 

[3.2] dovecotの設定

Dovecot の設定は /etc/dovecot/dovecot.conf によって行う.

# vim /etc/dovecot/dovecot.conf 

以下のように設定する. dovecot.conf にはファイル設定の仕方が載っている. 必要な部分のコメントアウトを外して設定する(なお, 初めからコメントアウトされている値はデフォルトの値となっている).
protocols = imap imaps   #用いるプロトコル
disable_plaintext_auth = no   #平文でのログインを許す
log_path = /var/log/dovecot   #ログファイルの場所
log_timestamp = "%Y-%m-%d %H:%M:%S #ログファイルの行最初の部分
login_max_connections = 256 #ログインプロセスの最大数
mail_location = mbox:~/:INBOX=~/Mailbox   #保存形式
mail_privileged_group = mail
mbox_read_locks = flock
mbox_write_locks = dotlock flock    #uw-imap形式のファイルロック
auth defautl{ mechanisms = plain cram-md5   #認証の方法, 平文とCRAM_MD5 を許す.
passdb passwd-file { args = /etc/dovecot.cram-md5   #パスワードの認証方法. dovecot.crma-md5というパスワードファイルからパスワードを読み込む }
userdb passed-file { args = /etc/dovecot.cram-md5   #ユーザの認証方法. dovecot.cram-md5というパスワードファイルから読み込む }
user = root } 以下はコメントアウトしておく. # passdb pam { # ===略=== # }
# userdb passwd { # ===略=== # }

dovecot を再起動する.

# /etc/init.d/dovecot restart

[3.3] MD5 認証データベースファイル

[3.3.1] 認証データベースファイルの作成

パスワードファイルである /etc/dovecot.cram-md5 を書く.
これが CRAM_MD5 の認証データベースファイルとなる. 以下がその書式.であり, passwd ファイルと同じ形式で書く.
[acount]:{パスワードの形式(plainなら平文,CRAM-MD5ならCRAM_MD5で暗号化されたパスワード}[PASSWORD]:[uid]:[gid]::[home]

[acount]には自分のアカウント名.
PASSWORDが imap 用パスワード. そのまえの{}によって書き方が変わる.
[uid] と [gid] にはそれぞれ自分の uid と gid を入れる.
最後の[home]は自分のホーム領域のパス.

具体的に書いてみる.

# vim /etc/dovecot.cram-md5

以下を書く. 今回は平文方式で書く.
# CRAM-MD5 authentication database
# Entries are in form <user>:{plain}<password>:<uid>:>gid<::>Home dir<
# or <user>:{CRAM-MD5}<cram_md5 password>:<uid>:>gid<::>Home dir<
# Lines starting with "#" are comments
mondo4:{plain}xxxxxx:40004:40004::/home/mondo4

# chmod 600 /etc/dovecot.cram-md5

赤く強調されているところが実際のパスワードとユーザ情報である. xxxxxxxはパスワード.

このままだと /etc/dovecot.cram-md5 に直接見える形でパスワードが書かれてしまう. しかし, このパスワードを暗号化して書くこともできる.
なお, これをやるときは以前に書いた{plain}でのパスワードは消すこと.

# pass=`dovecotpw -s CRAM-MD5 -p xxxxxx`
# echo "mondo4:${pass}:40004:40004::/home/mondo4" >> /etc/dovecot.cram-md5

dovecotpw は 引数を暗号化するコマンドである. それを用いてdovecot.cram-md5 に直接暗号化したパスワードを書き込んでいる.

[3.3.2] MD5 認証データベースファイル自動生成

CRAM_MD5 の認証データベースファイル /etc/dovecot.cram-md5 の書き込みには root 権限が要る.
そのため imap 認証のパスワードを各ユーザが編集することはできない.
そこで apop 認証パスワード ~/Maildir/.password を読み出して
/etc/cram-md5.pwd を生成するスクリプト dovecotpwdbg を書いた.
これを root 権限で定期的に実行すれば(遅れはあるものの)/etc/dovecot.cram-md5 が更新される.

$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2011/dvlop/script/dovecotpwdbg
$ sudo -s
# cp dovecotpwdbg /etc/cron.daily/dovecotpwdbg
パーミッションを755にするのを忘れないこと!
(以前の構築作業では追加したスクリプトに対して実行許可を与えるのを忘れて
エラーが出ることが多かった)

# chmod 755 /etc/cron.daily/dovecotpwdbg

より頻繁にこのデータベースを更新するために cron を用いる. root で以下作業を行う.

# crontab -e

以下の 1 行を追加する.

50 * * * *   /etc/cron.daily/dovecotpwdbg

パスワードファイル /etc/dovecot.cram-md5 は新しいものにどんどん書き換えられるため,一定時間でパスワードが消えることに注意.

[3.4]購読リストを更新する

ここでは UW-IMAP の購読リスト.mailboxlist から Dovecot の購読リスト .scbscriptions への変更の仕方を書く. 一度 UW-IMAP から Dovecot へ変更しているならばもう行う必要はない.

購読リスト変換スクリプトuw2dovecot.shを取得する.

$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2011/dvlop/script/uw2dovecot.sh 
# cp uw2dovecot.sh /etc/dovecot/

パーミッションを変更する

# chmod 774 /etc/dovecot/uw2dovecot.sh

実行する

# /etc/dovecot/uw2dovecot.sh

[3.5] テスト

usuzumi の外のホストから, imap 対応メーラー(例. Thunderbird)を用いて imap サーバを usuzumi に指定して, usuzumi 上の自分のアカウントあてに届いたメールを読んでみる. メーラの設定や.qmail の設定などは読み書きのするためのメールサーバでの準備を参照.

[3.5.1] メールの配送

imap でのメール読みだしは ~/Mailbox から行なわれる.
ここでテストメール受信を行なうため, 管理者自身のホームディレクトリの ~/.qmail を編集する.

~/.qmail を編集. ./Mailbox を追加する. (ただし過去に.qmail に./Mailbox を追加した場合はやらない)

$ echo "./Mailbox" >> ~/.qmail 

メールが ~/Mailbox へ配送されるようになる.

[3.6]ntpdate との関係

dovecot はntpdate 等で時刻を調節する際に,5 秒ほどずれているとサービスを停止してしまう.そのため,cron.daly でntpdate を実行させる場合にはdovecot が停止してもrestart できるようにする.具体的には/etc/cron.daily/ntpdate に以下の行を追加する.

/etc/init.d/dovecot restart > /dev/null 2>&1

[3.7]文献

  1. Dovecot
  2. Dovecot Wiki
  3. Dovecot 翻訳プロジェクト

[4] smtp

パソコンのメールソフトを使ってメールを利用するユーザは多いと考えられることから
mail が smtp 要求を受けるべきは

  1. mail にあるアカウント宛に届くメール
  2. 地惑内のホスト(サブドメイン取得後なら *.ep.sci.hokudai.ac.jp か)からの送られてきたメール
であろう.

qmail の FAQ 5.4「特定のクライアントにだけリレーとして使わせたい」 (文献 1)に従って作業を行う.
この FAQ では tcpserver を使うやり方と tcp-wrappers を使うやり方の二つが述べられている.
tcpserver の導入によって, 同時に多くの smtp 要求を受け付けられ
接続の記録が取れるようになる (文献 2) という利点から tcpserver を使うことにする.

[4.1] tcpserver の配信確認

qmail をパッケージから入れた場合 smtp は初めから tcpserver によって立ち上がるようになっている.

telnet によって smtp の配信テストを行う(参考 [1.7]文献-7)

# apt-get install telnet 
$ telnet 127.0.0.1 25
Trying 127.0.0.1 25
       Connected to 127.0.0.1.
       Escape character is '^]'.
       220 usuzumi.ep.sci.hokudai.ac.jp ESMTP
打つ-> helo lemon.ep.sci.hokudai.ac.jp
       250 usuzumi.ep.sci.hokudai.ac.jp
打つ-> mail <mondo4@usuzumi.ep.sci.hokudai.ac.jp>
       250 ok
打つ-> rcpt <mondo4@usuzumi.ep.sci.hokudai.ac.jp>
       250 ok
打つ-> data
       354 go ahead
打つ-> Subject: testing
打つ->
打つ-> This is a test.
打つ-> .
       250 ok 812345679 qp 12345
打つ-> quit
       221 usuzumi.ep.sci.hokudai.ac.jp
       Connection closed by foreign host.
       %


メールが届いている確認する.

$ lv ~/Mailbox
以下があれば良い.
From mondo4@usuzumi.ep.sci.hokudai.ac.jp Thu Apr 05 04:22:27 2012
Return-Path: <mondo4@usuzumi.ep.sci.hokudai.ac.jp>
Delivered-To: mondo4@usuzumi.ep.sci.hokudai.ac.jp
Received: (qmail 4986 invoked from network); 5 Apr 2012 13:22:09 +0900
Received: from unknown (HELO lemon.ep.sci.hokudai.ac.jp) (127.0.0.1)
  by localhost with SMTP; 9 Spt 2012 13:22:09 +0900
Subject: testing

This is a test.

[4.2] tcpserver 設定

smtp 中継(smtpを使ったメールの送信)を許可するホストを指定する. まず, 文献 1 に従って, /etc/tcp.smtp を書く.

# vim /etc/tcp.smtp

例えば,133.87.52.40 という IP アドレスのホストからの smtp 中継を許可するためには,
次の 1 行目のように書く. 2 行目の 127. はローカルホストを指す. これは常に書くこと.
133.87.52.40:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

次に以下のコマンドを実行する.tcp.smtp を元に /etc/tcp.smtp.cdb ができる.

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

[4.3] tcpserver 起動確認

usuzumi を reboot して tcpserver の起動を確認する.

# reboot
# ps aux | grep smtp
qmaild    4137  0.0  0.0   6000   660 ?        S    Sep14   0:00 /usr/bin/tcpserver -R -H -u 64011 -g 65534 -x /etc/tcp.smtp.cdb 0 smtp /usr/sbin/qmail-smtpd

先ほど /etc/tcp.smtp に書いた IP アドレス(ここでは, 133.87.52.40)を持つパソコンから
メーラー (例. Thunderbird) を使って, smtp サーバを usuzumi に設定し,
usuzumi 以外の任意のサーバにあるアカウント宛のメールを発信してみる.

/var/log/syslog に残るログは, 以下のようなものとなる事を確認する.

Mar  6 10:28:29 usuzumi smtpd: 1141608509.874210 tcpserver: status: 1/40
Mar  6 10:28:29 usuzumi smtpd: 1141608509.874295 tcpserver: pid 1896 from 133.87.45.145
Mar  6 10:28:55 usuzumi smtpd: 1141608535.898609 tcpserver: ok 1896 usuzumi.ep.sci.hokudai.ac.jp:133.50.160.52:2
Mar  6 10:28:55 usuzumi smtpd: 1141608535.952798 tcpserver: end 1896 status 0
Mar  6 10:28:55 usuzumi smtpd: 1141608535.952857 tcpserver: status: 0/40

[4.4] 接続制御データベースファイル /etc/tcp.smtp.cdb 自動生成

gate-system から登録 IP アドレス一覧を受け渡してもらい /etc/tcp.smtp.cdb を自動生成する.
そのために, 標準入力から IP アドレスリストを読み込み, /etc/tcp.smtp を書くスクリプトを書いた.
これを /usr/local/sbin/list-2-tcp とする. root への実行許可を忘れずに.

list-2-tcp
$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2011/dvlop/script/list-2-tcp 
$ sudo -s
# cp ./list-2-tcp /usr/local/sbin/list-2-tcp 
# chmod 755 /usr/local/sbin/list-2-tcp

/usr/local/sbin/tcp_smtp_cdb を以下のスクリプトのように書く. root への実行許可を忘れずに. gate の ip データベース更新時には, gate-system によってこのスクリプトが呼び出される.

tcp_smtp_cdb
$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2011/dvlop/script/tcp_smtp_cdb
$ sudo -s
# cp ./tcp_smtp_cdp /usr/local/sbin/tcp_smtp_cdb
# chmod 755 /usr/local/sbin/tcp_smtp_cdb

gate-ip-show, gate-ip-list は gate-system のコマンドである.

[4.5] apop の起動を tcpserver へ移す

inetd から呼び出されていた pop の受付を tcpserver に移すには
/etc/inetd.conf の pop の行をコメントアウトした上で
tcpserver 起動スクリプト /etc/init.d/qmail に pop の行を加えて (一行で)再起動する.

[4.5.1] inetd の停止

# vim /etc/inetd.conf

pop-3 の設定のところをコメントアウトする
#pop-3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup grey.ep.sci.hokudai.ac.jp /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir

inetd を止める

# ps aux | grep inetd
# kill -HUP xxxx

xxxxは inetd のプロセスIDである.

inetdの代わりにxinetdを用いる場合
もし, intedではなくxinetd で行っているのならば /etc/xinetd.conf を編集する.
# vim /etc/xinetd.conf
以下のようにコメントアウトする.

#service pop3
#{
#socket_type     = stream
#wait            = no
#user            = root
#server          = /var/qmail/bin/qmail-popup
#server_args     = grey.ep.sci.hokudai.ac.jp /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir
#}

再起動する.

# /etc/init.d/xinetd restart

[4.5.2] 起動スクリプトへの記入

smtp と同様に pop も /etc/init.d/qmail に起動スクリプトを記入する.

# vim /etc/init.d/qmail

sh -c "start-stop-daemon --start --quiet --user qmaild \
--pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
--exec /usr/bin/tcpserver -- -R -H \
-u `id -u qmaild` -g `id -g nobody` -x /etc/tcp.smtp.cdb 0 smtp \
$rblsmtpd /usr/sbin/qmail-smtpd 2>&1 \
| $logger &"
の文を以下のように書き直す.
sh -c "start-stop-daemon --start --quiet --user qmaild \
   --pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
   --exec /usr/bin/tcpserver -- -R -H \
   -u `id -u qmaild` -g `id -g nobody` -x /etc/tcp.smtp.cdb 0 smtp \
   $rblsmtpd /usr/sbin/qmail-smtpd 2>&1 \
   | /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"

さらにその文の下に以下を追加する.

sh -c "start-stop-daemon --start --quiet --user root \
   --pidfile /var/run/tcpserver_pop3d.pid --make-pidfile \
   --exec /usr/bin/tcpserver -- -v \
   -u 0 -g 0 0 pop-3 /var/qmail/bin/qmail-popup grey.ep.sci.hokudai.ac.jp \
   /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
   | /var/qmail/bin/splogger pop3d 3 > /dev/null 2>&1 &"

また,
stop)
echo -n "Stopping mail-transfer agent: qmail" $rblmsg
if [ "`pidof /usr/sbin/qmail-send`" ] ; then
start-stop-daemon --user qmails --stop --quiet --oknodo --exec /usr/sbin/qmail-send
start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_smtpd.pid --exec /usr/bin/tcpserver
の下に以下を追加する.

start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3d.pid --exec /usr/bin/tcpserver

qmail を再起動する

# /etc/init.d/qmail restart

動いているか確認する

# ps aux | grep tcp

以下のようになっていれば大丈夫

/usr/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 64011 -g 65534 0 smtp /usr/sbin/qmail-smtpd
/usr/bin/tcpserver -v -u 0 -g 0 0 pop-3 /var/qmail/bin/qmail-popup usuzumi.ep.sci.hokudai.ac.jp /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir

[4.6] 文献

  1. http://man.qmail.jp/faq/faq5.html#5.4.
  2. http://man.qmail.jp/faq/faq5.html#5.1.

5. ezmlm

[5.1] ezmlm 導入

http://www.ezmlm.org/から http://cr.yp.to/software/ezmlm-0.53.tar.gz を取得,展開する. ezmlm-0.53/INSTALL に従って作業を行う.

$ wget http://cr.yp.to/software/ezmlm-0.53.tar.gz
$ tar zxvf ezmlm-0.53.tar.gz
$ cd ezmlm-0.53
$ make

auto-str エラー とでたら, error.h の
extern int errno; を
#include <errno.h> に書き換える.
ezmlm-manage.c エラー もしくは
ezmlm-return.c エラー とでたら,
先頭に #include "log.h" を書き込む.

$ vim ./error.h

extern int errno; を以下に書き換える

#include <errno.h>

$ vim ./ezmlm-manage.c 

先頭に以下を追加する

#include "log.h"

$ vim ./ezmlm-return.c 

先頭に以下を追加する

#include "log.h"

$ make
$ make man
# make setup

qmail のコマンドにパスを通したのに習って /usr/local/bin/ezmlm/ 以下の ezmlm のコマンドバイナリ群にパス通す.
(具体的には PATH=... の行に/usr/local/bin/ezmlm を追加するだけ) .

bash にパスを通す

# vim /etc/profile

PATH=...の一番最後に:でつないで以下を書く

/usr/local/bin/ezmlm

反映する.

$ source /etc/profile

csh にもパスを通す

# vim /etc/csh.cshrc

setenv PATH の一番最後に:でつないで以下を書く

/usr/local/bin/ezmlm

[5.1.1] テスト

メーリングリスト(ML)を作成する.詳細はezmlm-make の man 参照.

メーリングリストである testlist を作成する.

$ ezmlm-make ~/testlist ~/.qmail-testlist username-testlist usuzumi.ep.sci.hokudai.ac.jp

testlistには適当なメーリングリストの名前を,usernameには適当な作業ユーザのアカウント名を入れる.


次に作成した ML に ML 主催者が手動で購読者を追加する.詳細は ezmlm-sub の man 参照.

$ ezmlm-sub ~/testlist username@usuzumi.ep.sci.hokudai.ac.jp

登録が終了したら ML へ投稿してみる.先程登録したアドレスへ届くか確かめる.

$ echo subject:testing | qmail-inject usrname-testlist@usuzumi.ep.sci.hokudai.ac.jp 

次に ML の自動処理コマンドを確かめる.
始めに投稿アーカイブから記事を取り出すコマンドを試す. 記事が送られてくるかを確認する.
ep ドメインの MX が張られていない場合は /var/qmail/control/defaulthost をホスト名までいれた
ドメイン(フルドメイン)にする必要がある.

$ qmail-inject username-testlist-get.1@ep.sci.hokudai.ac.jp < /dev/null

次に ML 参加者による自動登録抹消を試す. 確認メールが送られてくるので その指示に従い登録抹消する. ep ドメインの MX が張られていない場合 /var/qmail/control/defaulthost をホスト名までいれたドメイン(フルドメイン)にする必要がある.

$ qmail-inject username-testlist-unsubscribe@ep.sci.hokudai.ac.jp < /dev/null

Mailbox に来たメールに従って登録を消す.

$ lv Mailbox 

メールの内容の以下の部分に従う.

removed from this mailing list, please send an empty reply to this address:

username-testlist-uc.1318325352.njdckeaplgokjdbinace-username=usuzumi.ep.sci.hokudai.ac.jp@usuzumi.ep.sci.hokudai.ac.jp

$ qmail-inject username-testlist-uc.1318325352.njdckeaplgokjdbinace-username=usuzumi.ep.sci.hokudai.ac.jp@usuzumi.ep.sci.hokudai.ac.jp < /dev/null

登録を抹消できたかどうかの確認は ML 登録アドレス一覧を見る. 詳細は ezmlm-list の man を見よ.

$ ezmlm-list ~/testlist

5.2 ezmlm-idx 導入

[5.2.1] ezmlm-idx の取得からコンパイル

http://www.ezmlm.org/archive/0.40/ezmlm-idx-0.40.tar.gz
を取得,展開する. いつの間にか本家がなくなっていた(2012/04/05 現在)のでネット上から取得したファイルをサーバに挙げておいた ezmlm-idx-0.40.tar.gzこれを使ってほしい. ezmlm-idx-0.40/INSTALL.idx に従って作業する. (2011/10/12 での最新版は 7.1.1 だが今回は 0.40 を使用する)

$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2011/script/ezmlm-idx-0.40.tar.gz
$ tar zxvf ezmlm-idx-0.40.tar.gz

ezmlm をビルドした時のディレクトリに持っていく.

$ cp -r ezmlm-idx-0.40/* ezmlm-0.53/
$ cd ezmlm-0.53/

パッチを充てる

$ patch < idx.patch 

crontab のありかを調べる.

$ which crontab

/usr/bin にあれば先へ進む. 違う場所にある場合は conf-cron にありかを書き込む.

/usr/bin/crontab

MySQL(解説は http://www.mysql.com/) を使うか否かを決定.
ここでは使わないこととして先に進む. 使う場合にはこの段階でやるべき作業がある.

$ make clean
$ make; make man
$ make jp

最後の行は使用言語を選ぶものである. jp は日本語を意味する.
これによって自動管理要請に ezmlm が応えてユーザに送る文言 が日本語になる.

[5.2.2] コンパイル

MySQL を使わない場合は以下を実行する(使う場合には異なる作業が要る).

# make std
# make
# make setup

[5.2.3] テスト

ユーザ eztest を作って ezmlm-idx のコマンドバイナリ群が実行できるか確かめる (ezmlm-testコマンド).
ezmlm-test を実行する前に ezmlm-idx のコマンドバイナリ群に パスが通っているかを確認されたい.

テストユーザを作成する.

$ chmod 755 ezmlm-test
$ sudo -s
# adduser eztest 
# su eztest
eztest@:$ source /etc/profile
eztest@:$ cd ezmlm-0.53/ 
eztest@:$ ./ezmlm-test

以下のように出たら成功.

         testing ezmlm-idx:    ezmlm-idx-0.40
         Using FQDN host name: usuzumi.ep.sci.hokudai.ac.jp
         ezmlm-make (1/2):     OK
         Using RDBMS support:  No.
         testing for qmail:    >=1.02
         ezmlm-reject:         OK
         ezmlm-[un|is]sub[n]:  OK
         ezmlm-send (1/2):     OK
         ezmlm-tstdig:         OK
         ezmlm-weed:           OK
         ezmlm-make (2/2):     OK
         ezmlm-clean (1/2):    removed mod queue entry 3 that wasn't due

ここで su eztest と行ったが sudo コマンドを用いる場合はデフォルトでは環境変数 $HOME が
ログインしたユーザとなったままとなり正しく実行されないので -H オプションをつけて実行する.

テストユーザを削除する.

# userdel -r eztest

5.3 文献

  1. http://mlm.qmail.jp/ezmlm/
  2. http://mlm.qmail.jp/idx/




最終更新日:2013/01/30 (三上 峻) Copyright © 2001-2013 epcore