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


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

[1] qmail

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

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

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

$ dpkg -l | grep exim
 
rc  exim4-daemon-light  4.96-15+deb12u5  amd64  lightweight Exim MTA (v4) daemon

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


[1.2] qmail のインストール

神戸大学のサイトを参考に作業を進める。

ディレクトリを作成する。

# mkdir /var/qmail

ユーザ・グループを追加する。qmail は専用のアカウントとグループを作成してその権限で起動する。

# groupadd -g 200 nofiles 
# adduser --system --ingroup nofiles --home /var/qmail/alias alias
# adduser --system --ingroup nofiles --home /var/qmail qmaild
# adduser --system --ingroup nofiles --home /var/qmail qmaill
# adduser --system --ingroup nofiles --home /var/qmail qmailp
# groupadd -g 201 qmail 
# adduser --system --ingroup qmail --home /var/qmail qmailq
# adduser --system --ingroup qmail --home /var/qmail qmailr
# adduser --system --ingroup qmail --home /var/qmail qmails

ソース、パッチの取得と展開を行う。 あてるpatch は以下のとおりである. ソース、パッチをインストール.
# cd /usr/local/src
# wget http://itpass.scitec.kobe-u.ac.jp/~itpass/server/2022/qmail/netqmail-1.06.tar.gz
# tar zxvf netqmail-1.06.tar.gz
# wget http://www.ckdhr.com/ckd/qmail-103.patch
# wget http://cobe.dogmap.org/qmail/qmail-1.03-realrcptto-2006.12.10.patch
# wget wget http://itpass.scitec.kobe-u.ac.jp/~itpass/server/2022/qmail/qmail-date-localtime.patch
# wget http://www.itpass.scitec.kobe-u.ac.jp/~itpass/server/2022/qmail/qmail-smtpd-relay-reject
# wget http://www.itpass.scitec.kobe-u.ac.jp/~itpass/server/2022/qmail/qmail-smtpd-auth-0.31.tar.gz
# tar zxvf qmail-smtpd-auth-0.31.tar.gz
qmail にパッチをあて, ビルド/インストールする.
# cd netqmail-1.06 
# patch -p1 < ../qmail-103.patch
# patch -p1 < ../qmail-1.03-realrcptto-2006.12.10
# patch -p1 < ../qmail-date-localtime.patch
# patch -p1 < ../qmail-smtpd-relay-reject
# make man
# make
# make setup check


[1.3]初期設定

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

qmail 制御ファイルに設定を書き込む. 制御ファイルは /var/qmail/control/ 以下に作成. それぞれの制御ファイルへ以下の情報を書き込む.

/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
/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 に登録がなされていないと正しく動作しないことに注意. (よくわからないのでとりあえず無視)

orange によって, ep.sci.hokudai.ac.jp の MX を向けられている場合,
ローカル処理すべきドメイン名に ep.sci.hokudai.ac.jp を追加する. orange によって 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 20000000 > /var/qmail/control/databytes
# chmod 644 /var/qmail/control/databytes
# echo 259200 > /var/qmail/control/queuelifetime
# chmod 644 /var/qmail/control/queuelifetime
# chmod 644 /var/qmail/control/defaulthost

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

# /var/qmail/bin/qmail-showctl

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

/var/qmail/control/databytes       ->  20000000
/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

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


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

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

# wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2024/dvlop/script/alias.sh
# chmod u+x alias.sh
# ./alias.sh

wget するとエラーが出る場合は, alias.sh を作成するか、以下を実行する.

# 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) .

[1.3.3]~/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.3.4]PATH を通す

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

# vim /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 を編集し, 同様に付け加える. PATH を記述した行が存在しなかったため, 以下をすべて書いた.

# vim /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/share/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/snap/man/var/cache/man/snap
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/y2024/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 を起動する.

  # reboot 
  # /etc/init.d/qmail start 

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

$ ps aux | grep qmail
# service qmail status 

[1.5]テスト

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

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

自分に送る準備をする.

$ cd ~
$ 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 を見て確認. 今回はgreyに配送.送信先がhoge@ep.sci.hokudai.ac.jp だと送れなかったので,hoge@grey.ep.sci.hokudai.ac.jp として送信した.
ep.sci.hokudai.ac.jp だと usuzumi 自身だと認識するらしい.
# 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
  8. https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?%5BMemo2024%5D%5BITPASS%5Dqmail+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9A

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://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
  # tar zxvf 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 の行のコメントアウトを外す

  # vim /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/bin/tcpserver -- -v -u 0 -g 0 0 pop3 \
        /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 の部分のコメントアウトも外す

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

さらに,コマンド群を以下のように修正.

        # 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 に次の 2 行を加える.

  # 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 の作成

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] テスト

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

まとめてテストするため後回し.

[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 install dovecot-imapd 

[3.2] dovecotの設定

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

  # cd /etc/dovecot/conf.d 

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

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

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

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

service imap
process_limit = 256

service auth-worker
user = root

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

  # vim auth-passwdfile.conf.ext 
	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はパスワード.

  # 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
	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/y2024/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を使ったメールの送信)を許可するホストを指定する. /etc/tcp.smtp を書く.

  # vim /etc/tcp.smtp

この後の作業ではグローバルIP が必要となるので, epcore 宛に申請を行ったのちに 以下の作業を行う. 本年度はグローバル IP を持つ情報実験機の 3N 機 (joho24) を用いた. 例えば,133.87.45.76 という IP アドレスのホストからの smtp 中継を許可するためには, 次の 1 行目のように書く. 2 行目の 127. はローカルホストを指す. これは常に書くこと.

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

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

  # /etc/init.d/qmail cdb 

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

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

  # vim /etc/init.d/qmail 

以下の行のコメントアウトをとる. また, /usr/bin を /usr/local/bin に修正する.

	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
 ping を打ち, ネットワークが繋がっていることを確認した. ネットワークに繋がらない場合, 以下のコマンドで確認する. 
# ip addr show 
# less /etc/network/interfaces 
tcpserver が起動しているか確認する.
# ps aux | grep tcpserver 
smtp が起動していない. user qmaild のジョブも確認できない. #コマッタ
とりあえずの再起動.
# reboot 
# ps aux | grep tcpserver 
smtp が起動してしまった. とりあえず先に進む. 
/usr/local/bin/tcpserver -HRv -u 108 -g 200 -x /etc/tcp.smtp.cdb 0 smtp /usr/local/bin/rblsmtpd -r bl.spamcop.net /var/qmail/bin/qmail-smtpd

[4.4] 受信・送信テスト

メーラーを使った受信・送信テストを行う. 本年度は Thunderbird を用いる. 先ほど /etc/tcp.smtp に書いたグローバル IP アドレスを持つパソコン (本年度は joho24) に Thunderbird をインストールする.

hogehoge@joho24:~$ sudo apt install thunderbird 
hogehoge@joho24:~$ thunderbird & 
apop, imap, smtp サーバを usuzumi に設定し, usuzumi 以外の任意のサーバ (本年度は grey) にあるアカウントと メールを送受信してみる. それぞれ, hogehoge@grey.ep.sci.hokudai. ac.jp, herogero@usuzumi.ep.sci.hokudai.ac.jp と書く. @ep.sci.hokudai.ac.jp だと (grey, usuzumi がないと) 各々は自身のアドレス だと認識し、メール配送がうまくいかない.

apop の場合
imap の場合
imap のアカウント設定は上手くいかない. これは, dovecotpwdbg が
uid が 1000 より大きく 29999 以下のユーザの apop パスワードのみ
dovecot.cram-md5 に書き込むためだと推測される. #たぶん
(追記) 手作業で CRAM-MD5 で暗号化して書き込んでもログイン できない ... plain で書き込んだらログインできたが ... #コマッタ
手作業で imap 用パスワードを書き込んでも良いが, 本年度は省略.
grey, usuzumi 間でメールの送受信が行えることを確認した.

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

#less /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/y2024/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/y2023/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つのコマンドを実行し、先に進むことにした.gateデーターベースの作成云々かんぬんと書いてあるのだが、今それをやるべきなのかが分からない.おそらくgateの運用を開始してから、gateのip更新が行われたときに、上の二つのスクリプトが動くようになればよいだろうと判断し、この段階ではこれ以上何もせず先に進むことにした.

[4.5] 文献

  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" を書き込む. 具体的には以下のようにする.

  $ 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

/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 参照.

メーリングリストである test を作成する(testはメーリングリスト名).

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

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


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

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

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

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

次に ML の自動処理コマンドを確かめる.
始めに投稿アーカイブから記事のコピーを取り出すコマンドを試す. 記事が送られてくるかを確認する.

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

次に ML 参加者による自動登録抹消を試す. 確認メールが送られてくるので その指示に従い登録抹消する. (指定されたアドレスに空メールを送る指示が あるハズ)

$ qmail-inject username-test-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-test-uc.1691131688.mfllkpaenammmladliji-username=usuzumi.ep.sci.hokudai.ac.jp@usuzumi.ep.sci.hokudai.ac.jp

$ qmail-inject username-test-uc.1691131688.mfllkpaenammmladliji-username=usuzumi.ep.sci.hokudai.ac.jp@usuzumi.ep.sci.hokudai.ac.jp < /dev/null

メーラーを使う場合は, 宛名中のドメイン名が usuzumi.ep.sci. ... に なっているか注意すること.

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

$ ezmlm-list ~/test

5.2 ezmlm-idx 導入

[5.2.1] ezmlm-idx の取得/設定

http://untroubled.org/ezmlm/archive/7.2.2/ezmlm-idx-7.2.2.tar.gz
を取得,展開する.

  $ wget http://untroubled.org/ezmlm/archive/7.2.2/ezmlm-idx-7.2.2.tar.gz
  $ tar zxvf ezmlm-idx-7.2.2.tar.gz

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

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

makeする.

  $ make clean
  $ make; make man

[5.2.4] テスト

ユーザ eztest を作って ezmlm-idx のコマンドバイナリ群が実行できるか確かめる (ezmlm-testコマンド).

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

  $ chmod 777 ~hoge
  $ chmod 777 ~hoge/ezmlm-0.53
  $ cd ~hoge/ezmlm-0.53
  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 ~hoge/ezmlm-0.53/ 
  eztest@:~hoge/ezmlm-0.53$ ./ezmlm-test

以下のように表示された.

         getconfopt library:   OK
         ezmlm-make:           OK
         Using subdb plugin:   std
         ezmlm-reject:         OK
         ezmlm-[un|is]sub[n]:  OK
         ezmlm-checksub:       OK
         ezmlm-send:           OK
         ezmlm-tstdig:         OK
         ezmlm-weed:           OK
         ezmlmrc contents:     OK
         ezmlm-clean:          OK
         ezmlm-store:          OK
         ezmlm-return:         OK
         ezmlm-warn (1/2):     OK
         ezmlm-manage (1/2):   OK
         ezmlm-request:        OK
         ezmlm-split:          OK
         ezmlm-gate:           OK
         ezmlm-idx:            OK
         ezmlm-get (index):    OK
         ezmlm-get (get):      OK
         ezmlm-get (thread):   OK
         ezmlm-get (digest):   OK
         ezmlm-manage (2/2):   OK
         ezmlm-moderate:       OK
         ezmlm-warn (2/2):     OK
         ezmlm-archive:        OK
         ezmlm-dispatch:       OK
         dispatch editor:      OK
         decode sender:        OK
         Verifying message header and body contents...
	 flags:		       OK
	 substitutions:        OK
	 messages:             OK
	 subscribe nop:        OK
	 unsubscribe nop:      OK
	 subscribe probe:      OK
	 subscribe:            OK
	 unsubscribe:          OK
	 moderated subscribe:  OK
	 moderated sub:        OK
	 subscribe by mod:     OK
	 unsubscribe by mod:   OK
	 copylines:            OK
	 ezmlm-send:           Header is missing or wrong From: line:
         From: "test1.example.org via __tstlist" <__tstlist@example.com>
         .............: Header is missing or wrong From: line:
         From: "test2.example.org via __tstlist" <__tstlist@example.com>
         .............: Headers contained extra lines:
         Cc: test2@example.org
         OK
	 ezmlm-send (from):    OK
	 ezmlm-send trailer:   OK
	 omitbottom (-manage): OK
	 omitbottom (-get):    OK
         Cleaning up...

         The headers generated by one or more ezmlm-idx programs
         did not match their expected values.  Please see above
         for more details.

ezmlm-send がおかしい. #(泣)
一旦作業を中断.

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

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

  # userdel -r eztest

5.3 文献

  1. http://mlm.qmail.jp/ezmlm/
  2. http://mlm.qmail.jp/idx/
  3. http://untroubled.org/ezmlm/


最終更新日:2023/09/21 (髙橋 聖輝) Copyright © 2000-2023 epcore