メールサーバ構築(qmail,dovecot)


  1. qmail
  2. pop
  3. imap
  4. smtp
  5. ezmlm

[1] qmail

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

qmail をインストールするにあたってかち合わないように Jessie に標準搭載されている exim4 をアンインストールする(パッケージの追加と削除で作業をしていない場合は以下を行うこと).

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

$ dpkg -l | grep exim
 
rc  exim4                          4.84-8                               all          metapackage to ease Exim MTA (v4) installation
rc  exim4-base                     4.84-8                               amd64        support files for all Exim MTA (v4) packages
rc  exim4-config                   4.84-8                               all          configuration for the Exim MTA (v4)
rc  exim4-daemon-light             4.84-8                               amd64        lightweight Exim MTA (v4) daemon

上の実行結果の一番初めのカラムが"rc" の場合は「パッケージは削除されたが, 設定ファイルは残っている」状態のこと."ii" の場合は「パッケージインストール済み」状態のこと. exim 関連パッケージを設定ファイルからアンインストールする.

# apt-get remove --purge exim4 exim4-base exim4-config exim4-daemon-light

[1.2] qmail のインストール

qmail をインストールする. 本年度はソースからビルドを試みる.
# wget http://www.qmail.org/netqmail-1.06.tar.gz
# tar zxf netqmail-1.06.tar.gz

展開後, patch をあてる.あてるpatch は以下のとおりである. パッチをインストール.
# wget http://www.ckdhr.com/ckd/qmail-103.patch
# wget http://www.asahi-net.or.jp/~aa4t-nngk/codes/qmail-date-localtime.patch
# wget http://www.qmail.org/qmail-smtpd-relay-reject
# wget http://tomclegg.net/qmail/qmail-smtpd-auth-0.31.tar.gz
# tar zxvf qmail-smtpd-auth-0.31.tar.gz
qmail にパッチをあて, ビルド/インストールする.
# cp -r netqmail-1.06 netqmail-1.06_smtp
# cd netqmail-1.06_smtp
# patch -p1 < ../qmail-103.patch
# patch -p1 < ../qmail-date-localtime.patch
# patch -p1 < ../qmail-smtpd-relay-reject
# make man
# make
# make setup check
qmail 関連のファイルは/var/qmail 以下に存在する.qmail の利用に必要なユーザの作成を行う.
# groupadd nofiles 
# useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
# useradd -g nofiles -d /var/qmail -s /bin/false qmaild
# useradd -g nofiles -d /var/qmail -s /bin/false qmaill
# useradd -g nofiles -d /var/qmail -s /bin/false qmailp
# groupadd qmail
# useradd -g qmail -d /var/qmail -s /bin/false qmailq
# useradd -g qmail -d /var/qmail -s /bin/false qmailr
# useradd -g qmail -d /var/qmail -s /bin/false qmails
# ps aux | grep qmail

[1.3]初期設定

[1.3.1]制御ファイル等の編集/確認

qmail 制御ファイルに設定を書き込む. 制御ファイルは /var/qmail/control/ 以下にある. それぞれの制御ファイルへ以下の情報を書き込む(今回は赤字のものを追記).

/var/lib/qmail/control/defaultdomain  ->   ep.sci.hokudai.ac.jp
/var/lib/qmail/control/locals         ->   localhost
                                       usuzumi.ep.sci.hokudai.ac.jp
/var/lib/qmail/control/me             ->   usuzumi.ep.sci.hokudai.ac.jp
/var/lib/qmail/control/plusdomain     ->   ac.jp
/var/lib/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

databytes と queuelifetime を作る.

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

設定がちゃんとされているか確認する.

# /var/qmail/bin/qmail-showctl

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

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

上記の設定ファイルはサーバ入れ替え時にusuzumi => grey に変える必要がある. 詳細はサーバ入れ替え手順書を参照.


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

システムのアドレスを設定する(自動で以下のコマンドを実行するスクリプトalias.shがあるのでメールサーバに持ってきてルートで実行する).

# chmod u+x alias.sh
# ./alias.sh
# cd /var/lib/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) .

[1.3.3]~/Mailbox への配送

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

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

export MAIL MAILDROP

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

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

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

[1.3.4]PATH を通す

/var/qmail/bin 以下のコマンドにパスを通す.
bash ユーザのために/etc/profile のPATH= の行(2 行存在)に/var/qmail/bin を付け加える.

# emacs /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/qmail/bin"
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/var/qmail/bin"

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

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

[1.3.5]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]qmail 起動

qmail を起動する.その際, スタートスクリプトが必要だが,www サーバから取得する.

# cp /var/qmail/boot/home /var/qmail/rc 
# wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/dvlop/script/qmail
# cp qmail /etc/init.d/qmail 
# chmod +x /etc/init.d/qmail 

qmail の中身は以下のとおりである. コメントアウトの箇所は後の作業で外すことになる.

#!/bin/bash
#
# /etc/init.d/qmail : start or stop the qmail mail subsystem.
#
# source from http://www.atmarkit.co.jp/ait/articles/0211/02/news001.html
#
#
# updated by MIKAMI Takashi (2015/12/15)
# updated by MIKAMI Takashi (2014/06/12)
# created by MIKAMI Takashi (2014/06/11)

### BEGIN INIT INFO
# Provides:          qmail
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:      $network $syslog
# Should-Stop:       $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop qmail
# Description:       qmail is qmail
### END INIT INFO

PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin

#[ -f /var/qmail/rc ] || exit 0
[ -f /var/qmail/bin/qmail-start ] || exit 0
[ -f /var/qmail/bin/qmail-send ] || exit 0


case "$1" in
    start)
	# Start daemons.
	echo "Startig mail-transfer agent: qmail."
	sh -c '/var/qmail/rc &'

	# For SMTP
#        sh -c " /sbin/start-stop-daemon --start --quiet --user qmaild \
#        --pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
#        --exec /usr/local/bin/tcpserver -- -HRv -u ` id -u qmaild ` \
#        -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb 0 smtp \
#        /usr/local/bin/rblsmtpd -r bl.spamcop.net \
#	/var/qmail/bin/qmail-smtpd 2>&1 \
#	| /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"

	# For SMTP over SSL
#       sh -c "/sbin/start-stop-daemon --start --quiet --user qmaild \
#       --pidfile /var/run/tcpserver_ssmtp.pid --make-pidfile \
#       --exec /usr/local/bin/tcpserver-ssl -- -s -HRv -u \
#       ` id -u qmaild ` -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb \
#        -n /var/qmail/server.key/qmail.pem 0 ssmtp \
#        /usr/local/bin/rblsmtpd -r bl.spamcop.net \
#	/var/qmail/bin/qmail-smtpd-auth usuzumi.ep.sci.hokudai.ac.jp \
#        /bin/checklocalpwd /bin/true 2>&1 \
#	| /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"

	# For POP3
#	sh -c "/sbin/start-stop-daemon --start --quiet --user root \
#	--pidfile /var/run/tcpserver_pop3d.pid --make-pidfile \
#	--exec /usr/local/bin/tcpserver -- -v -u 0 -g 0 0 pop3 \
#	/var/qmail/bin/qmail-popup \
#	usuzumi.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 &"

	# For POP3 over SSL
#	sh -c "/sbin/start-stop-daemon --start --quiet --user root \
#	--pidfile /var/run/tcpserver_pop3s.pid --make-pidfile \
#	--exec /usr/local/bin/tcpserver-ssl -- -s \
#       -n /var/qmail/server.key/qmail.pem \
#      -v -u 0 -g 0 0 pop3s \
#	/var/qmail/bin/qmail-popup \
#	usuzumi.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)
	# Stop daemons.
	echo "Stopping mail-transfer agent: qmail"
	PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
	if [ ! -z "$PID" ] ; then
	    /bin/kill ${PID} 1> /dev/null 2>&1
	fi

#	/sbin/start-stop-daemon --user qmails --stop --quiet --oknodo --exec /var/qmail/bin/qmail-send # qmail-send
#	/sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_smtpd.pid --exec /usr/local/bin/tcpserver # smtp
#        /sbin/start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3d.pid --exec /usr/local/bin/tcpserver # pop3
#	/sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_ssmtp.pid --exec /usr/local/bin/tcpserver-ssl # smtp over SSL
#	/sbin/start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3s.pid --exec /usr/local/bin/tcpserver-ssl # pop3s


	;;

	# ===modified by Mikami Takashi (2014/06/11)===
    restart)
	$0 stop
	$0 start
	;;

	# ===modified by Mikami Takashi (2014/06/11)===
    cdb)
	echo "Rebuilding tcp.smtp.cdb"
	cd /etc
	/usr/local/bin/tcprules /etc/tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp
	;;

    *)
	echo 'Usage: /etc/init.d/qmail {start|stop|restart|cdb}'
	exit 1
esac

exit 0

ブート時に自動的に起動させるため, 以下のコマンドで各/etc/rc.X ディレクトリからシンボリックリンクを貼る.

# update-rc.d qmail defaults 

実際にqmail を起動する.

  # /etc/init.d/qmail start 

qmail の状態の確認にはps aux やservice コマンドを用いる.

$ ps aux | grep qmail
# service qmail status 

[1.5]テスト

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

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

自分に送る準備をする.

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

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

$ echo to: hoge | qmail-inject

確認する

$ lv ~/Mailbox
	From mondo4@usuzumi.ep.sci.hokudai.ac.jp Mon Nov 30 11:24:48 2015
	Return-Path: 
	  Delivered-To: mondo4@usuzumi.ep.sci.hokudai.ac.jp
	  Received: (qmail 7371 invoked by uid 1000); 30 Nov 2015 11:24:48 -0000
	  Date: 30 Nov 2015 11:24:48 -0000
	  Message-ID: <20151130112448.7370.qmail@usuzumi.ep.sci.hokudai.ac.jp>
	    From: mondo4@usuzumi.ep.sci.hokudai.ac.jp
	    to: mondo4@usuzumi.ep.sci.hokudai.ac.jp

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

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

$ echo to: nonexisten | qmail-inject
$ lv ~/Mailbox
From MAILER-DAEMON Mon Nov 30 11:34:46 2015
Return-Path: <>
  Delivered-To: mondo4@usuzumi.ep.sci.hokudai.ac.jp
  Received: (qmail 7387 invoked for bounce); 30 Nov 2015 11:34:45 -0000
  Date: 30 Nov 2015 11:34:45 -0000
  From: MAILER-DAEMON@usuzumi.ep.sci.hokudai.ac.jp
  To: mondo4@usuzumi.ep.sci.hokudai.ac.jp
  Subject: failure notice
  Hi. This is the qmail-send program at usuzumi.ep.sci.hokudai.ac.jp.
  I'm afraid I wasn't able to deliver your message to the following addresses.
  This is a permanent error; I've given up. Sorry it didn't work out.

  :
    Sorry, no mailbox here by that name. (#5.1.1)

    --- Below this line is a copy of the message.

    Return-Path: 
      Received: (qmail 7382 invoked by uid 1000); 30 Nov 2015 11:34:45 -0000
      Date: 30 Nov 2015 11:34:45 -0000
      Message-ID: <20151130113445.7381.qmail@usuzumi.ep.sci.hokudai.ac.jp>
	From: mondo4@usuzumi.ep.sci.hokudai.ac.jp
	to: nonexisten@usuzumi.ep.sci.hokudai.ac.jp

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

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

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

[1.6]文献

  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. pop

pop はtcpserver から起動する(2014 年度まではinetd/xinetd で起動確認した後,tcpserver へ 起動を移管していた).
また, pop でメールを読む際のパスワードの暗号化をするためにapop のインストールを行う.

[2.1] pop ソース取得・コンパイル, 準備

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

  $ wget http://sourceforge.net/projects/checkpw/files/checkpw/checkpw-1.03/checkpw-1.03.tar.gz
  $ tar zxvf checkpw-1.03.tar.gz
  $ cd chekpw-1.03/
  $ make
  # make setup check

/bin/checkapoppw ができる.

tcpserver をインストールする. tcpserver を起動するために最後に再起動を行う.

  # wget http://www.emaillab.org/djb/tools/ucspi-tcp/ucspi-tcp-0.88.tar.gz
  # wget http://www.qmail.org/rpms/patches/ucspi-tcp-0.88.errno.patch
  # tar zxf ucspi-tcp-0.88.tar.gz
  # cd ucspi-tcp-0.88
  # patch < ../ucspi-tcp-0.88.errno.patch
  # make 
  # make setup check
  # reboot 

[2.2] 設定

[2.2.1] tcpserver からの呼び出し

tcpserver からpop を呼び出すためには起動スクリプト /etc/init.d/qmail のpop の行のコメントアウトを外す

  # emacs /etc/init.d/qmail 

以下のコメントアウトを外す

        # For POP3
	        sh -c "/sbin/start-stop-daemon --start --quiet --user root \
        --pidfile /var/run/tcpserver_pop3d.pid --make-pidfile \
        --exec /usr/local/bin/tcpserver -- -v -u 0 -g 0 0 pop3 \
        /var/qmail/bin/qmail-popup \
        usuzumi.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 の部分のコメントアウトも外す

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

qmail を再起動

  # /etc/init.d/qmail restart

動作の確認(pop3 のプロセスがあれば問題なく起動している)

  # ps aux | grep qmail
	/usr/local/bin/tcpserver -v -u 0 -g 0 0 pop3 /var/qmail/bin/qmail-popup usuzumi.ep.sci.hokudai.ac.jp /bin/checkapoppw /var/qmail/bin/qmail-pop3d Maildir

[2.2.2] ~/Maildir/ への配送

[2.2.2.1] 環境変数の設定

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

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

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

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

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

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

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

[2.2.2.2]~/Maildir の作成

maildirmake のスクリプトでディレクトリを作成する. Maildir を作成する

  $ 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)が, pop でメールを読むときの認証パスワードとなる. パーミッションを600としないとpopが働かない.

[2.3] テスト

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

[2.4]文献

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

3. imap

EPMailサーバではimap サーバソフトとして Dovecot を使用する.

[3.1] 取得

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

  # apt-get install dovecot-imapd 

[3.2] dovecotの設定

Dovecot の設定は /etc/dovecot/conf.d 以下のファイルで行う.

  # cd /etc/dovecot/conf.d 

以下のように各ファイルにおいて設定する. 必要な部分のコメントアウトを外して設定する (なお, 初めからコメントアウトされている値はデフォルトの値となっている).

  # emacs 10-auth.conf 
	disable_plaintext_auth = no   #平文でのログインを許す
auth_mechanism = plain cram-md5
#include auth-system.conf.ext (コメントアウトする)
!include auth-passwdfile.conf.ext

  # emacs 10-mail.conf 
	mail_location = mbox:~/:INBOX=~/Mailbox   #保存形式
mail_privileged_group =mail
mbox_read_locks = flock
mbox_write_locks = dotlock flock

  # emacs 10-master.conf 
	service imap-login
port = 143

service imap
process_limit = 256

service Auth-worker
user = root

  # emacs 10-logging.conf 
	log_timestamp = "%Y-%m-%d %H:%M:%S "

  # emacs auth-passwdfile.conf 
	passdb
	args = scheme=CRAM-MD5 username_format=%u /etc/dovecot.cram-md5   #パスワードの認証方法. dovecot.crma-md5というパスワードファイルからパスワードを読み込む
userdb args = username_format=%u /etc/dovecot.cram-md5   #ユーザの認証方法. dovecot.cram-md5というパスワードファイルから読み込む

dovecot を再起動する.

  # service dovecot restart

dovecot の挙動を確認

  # service dovecot status
	● dovecot.service - Dovecot IMAP/POP3 email server
	Loaded: loaded (/lib/systemd/system/dovecot.service; enabled)
	Active: active (running) since 火 2015-12-01 13:55:13 JST; 2s ago
	Main PID: 15534 (dovecot)
	CGroup: /system.slice/dovecot.service
	├─15534 /usr/sbin/dovecot -F
	├─15536 dovecot/anvil
	├─15537 dovecot/log
	└─15539 dovecot/config

	12月 01 13:55:13 usuzumi dovecot[15534]: master: Dovecot v2.2.13 starting up for imap (cor...ed)
	Hint: Some lines were ellipsized, use -l to show in full.

[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]は自分のホーム領域のパス.

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

  # emacs /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
	mondo1:{plain}xxxxxx:40001:40001::/home/mondo1

# chmod 600 /etc/dovecot.cram-md5
# chown dovecot:dovecot /etc/dovecot.cram-md5

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

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

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

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

  # chmod 400 /etc/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 が更新される(毎時50分).

  $ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/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 は新しいものにどんどん書き換えられるため, 一定時間でパスワードが消えることに注意(毎時50分)

[3.4] テスト

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

[3.4.1] メールの配送

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

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

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

[3.5]ntpdate との関係

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

	service dovecot restart > /dev/null 2>&1

[3.6]文献

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

[4] smtp

smtp はtcpserver から起動する.

[4.1] tcpserver の設定

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

  # emacs /etc/tcp.smtp

この後の作業ではグローバルIP が必要となるので, epcore 宛に申請を行ったのちに以下の作業 を行う. 例えば,133.87.45.12 という IP アドレスのホストからの smtp 中継を許可するためには, 次の 1 行目のように書く. 2 行目の 127. はローカルホストを指す. これは常に書くこと.

	133.87.45.12:allow,RELAYCLIENT=""
	127.:allow,RELAYCLIENT=""

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

  # /etc/init.d/qmail cdb 

[4.2] 起動スクリプト編集

起動スクリプトを編集(コメントアウト)する.

  # emacs /etc/init.d/qmail 

以下の行のコメントアウトをとる.

	start)
	...
	# For SMTP
	sh -c " /sbin/start-stop-daemon --start --quiet --user qmaild \
        --pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
        --exec /usr/local/bin/tcpserver -- -HRv -u ` id -u qmaild ` \
        -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb 0 smtp \
        /usr/local/bin/rblsmtpd -r bl.spamcop.net \
        /var/qmail/bin/qmail-smtpd 2>&1 \
        | /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &"
	...
	stop)
	/sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_smtpd.pid --exec /usr/local/bin/tcpserver # smtp

[4.3] tcpserver 起動確認

qmail を restart して tcpserver の起動を確認する.

  # /etc/init.d/qmail restart
	tcpserver -v -R -l usuzumi.ep.sci.hokudai.ac.jp -x /etc/tcp.smtp.cdb -c 20 -u 64011 -g 118 0 smtp qmail-smtpd

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

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

	2015-12-02 17:46:39.816372500 tcpserver: status: 1/40
	2015-12-02 17:46:39.816508500 tcpserver: pid 20808 from 133.87.45.12
	2015-12-02 17:46:39.816537500 tcpserver: ok 20808 usuzumi.ep.sci.hokudai.ac.jp:133.50.160.52:25 :133.87.45.12::53705
	2015-12-02 17:46:39.816948500 qmail-smtpd: pid 20808 from 133.87.45.12: New session
	2015-12-02 17:46:39.861504500 qmail-smtpd: pid 20808 from 133.87.45.12: Received EHLO [127.0.0.1]
	2015-12-02 17:46:39.924697500 qmail-smtpd: pid 20808 from 133.87.45.12: Sender 
	2015-12-02 17:46:39.955948500 qmail-smtpd: pid 20808 from 133.87.45.12: Recipient 
	2015-12-02 17:46:39.967623500 qmail-smtpd: pid 20808 from 133.87.45.12: Recipient 
	2015-12-02 17:46:40.052351500 qmail-smtpd: pid 20808 from 133.87.45.12: Message accepted, qp 20809 (2 recipients, 535 bytes)
	2015-12-02 17:46:40.054393500 qmail-smtpd: pid 20808 from 133.87.45.12: Remote end QUIT: quitting
	2015-12-02 17:46:40.054477500 tcpserver: end 20808 status 0
	2015-12-02 17:46:40.054478500 tcpserver: status: 0/40

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

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

list-2-tcp
  $ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/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

上で作成したtcp.smtp をデータベース化する必要がある. root への実行許可を忘れずに. gate の ip データベース更新時には, gate-system によってこの スクリプトが呼び出される.

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

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

[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://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.o エラー もしくは
ezmlm-return.o エラー とでたら,
ezmlm-manage.c またはezmlm-return.c の 先頭に #include "log.h" を書き込む.

  $ emacs ./error.h

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

	#include <errno.h>

  $ emacs ./ezmlm-manage.c 

先頭に以下を追加する

	#include "log.h"

  $ emacs ./ezmlm-return.c 

先頭に以下を追加する

	#include "log.h"

  $ make
  $ make man
  # make setup

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

  # emacs /etc/profile

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

	/usr/local/bin/ezmlm

反映する.

  $ source /etc/profile

csh にもパスを通す

  # emacs /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 の自動処理コマンドを確かめる.
始めに投稿アーカイブから記事を取り出すコマンドを試す. 記事が送られてくるかを確認する.

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

次に ML 参加者による自動登録抹消を試す. 確認メールが送られてくるので その指示に従い登録抹消する.

$ qmail-inject username-testlist-unsubscribe@usuzumi.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/y2015/dvlop/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 のコマンドバイナリ群に パスが通っているかを確認されたい.

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

  ezmlm-0.53$ chmod 755 ezmlm-test
  ezmlm-0.53$ sudo -s
  ezmlm-0.53# adduser eztest 
  ezmlm-0.53# su eztest
  eztest@:~hoge/ezmlm-0.53$ source /etc/profile
  eztest@:~hoge/ezmlm-0.53$ cd ezmlm-0.53/ 
  eztest@:~hoge/ezmlm-0.53$ ./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/


最終更新日:2015/12/17 (三上 峻) Copyright © 2000-2015 epcore