メール・サーバー関連のインストール手順
#navi(OpenBlockS)

OpenBlockS に qmail とその仲間をインストールして、メール・サーバーを構築する手順
OpenBlockS に Postfix をインストールして、メール・サーバーを運用する

**目次
#contents

-関連リンク 
-qmail Quick reference 
-install 
--qmail 
--courier imap 
--daemontools 
--fetchmail 
--maildrop 
-日々の運用 
--前振り分け 
--ログイン名とメールアドレスの使い分け 
--携帯電話に出せない場合 
--コンソール通知 
--でたらめの差し戻し先 
-解決済みの問題点 

**関連リンク
-qmail djbdns by D. J. Bernstein - 配布ファイル・マニュアル 
-メイル管理入門 - 前野年紀氏による 
-[@IT] 連載記事 「実用qmailサーバ運用・管理術」 - 基本的な設置手順はここでかかれているとおり 
-[[ The Postfix Home Page:http://www.postfix.org/]] - 配布元
-[[Postfix のぺーじ:http://www.kobitosan.net/postfix/]] - 日本語のマニュアルやメーリングリストの案内

**qmail Quick reference
/var/qmail/control を書き換えたら、qmail-send を再起動 (sudo sh -c "svc -d /service/qmail; svc -u /service/qmail") する必要がある。locals と virtualdomains の変更だけなら -HUP を送れば良い。 
**Postfix Quick reference
:緊急停止|万が一 Postfix が spam を大量に送信していたり、ホストのリソースを異常に使用していることに気づいたら、postfix stop ではなく((stop では現在処理中のものは処理を続けてしまう)) abort を発行する。
 sudo /sbin/service postfix abort
:queueの再処理|
 sudo /sbin/service postfix flush
:aliasの変更|
 cd /home/otsuka/sys/postfix
 vi aliases
 diff -c /etc/postfix/aliases aliases
 sudo cp aliases /etc/postfix/
 sudo newaliases
 cp -p aliases aliases.`date +%Y%m%d`
:queue掃除|sudo /usr/sbin/postsuper -d '''Queue-ID'''
:main.cfの変更|
 cd /home/otsuka/sys/postfix
 vi main.cf
 diff -c /etc/postfix/main.cf main.cf
 sudo cp main.cf /etc/postfix/
 sudo /sbin/service postfix reload
 cp -p main.cf main.cf.`date +%Y%m%d`
:設定一覧を表示|
 /usr/sbin/postconf -n

|内容|コマンド|h
|キューの状態を調べる|sudo /var/qmail/bin/qmail-qstat|
|設定一覧を見る|/var/qmail/bin/qmail-showctl|
|どこかへメールを出す|echo to: someone@example.jp | /var/qmail/bin/qmail-inject|
:転送|.forwardを書けばよいが、メールボックスに残しつつ転送する場合、
semdmailのような \user 形式は使えない。メール・フォルダを直接
指定すればよい。[[Postfix Q and A:http://www.kobitosan.net/postfix/QandA.html#4.1.5]]


**install
qmail と付随するツール類が改竄されていないかチェックする方法が他のパッケージに比べて少ない。Frequently asked questions from distributors に MD5 checksum が掲載されているが、これごと改竄されていたら打つ手が無いような気がする。とりあえず、私のところで動いているものの MD5 を載せておく。
postfixというユーザーは、ssdlinuxに最初からあったので、これを流用することにした。
postdropというグループを作成。グループ番号は適当でよいが、最近のFedora Coreで
使われているものと合わせることにした。
 groupadd -g 90 postdrop

 e75842e908f96571ae56c3da499ba1fc  checkpassword-0.90.tar.gz
 1871af2453d6e464034968a0fbcb2bfc  daemontools-0.76.tar.gz
 622f65f982e380dbe86e6574f3abcb7c  qmail-1.03.tar.gz
 d566e8bd99b33efee0194e855b8d6995  qmail-date-localtime.patch
 39b619147db54687c4a583a7a94c9163  ucspi-tcp-0.88.tar.gz
適当なミラーサイトからダウンロード、署名を確認。
 cd ~/src
 tar xzvf ../01distfiles/postfix-2.1.5.tar.gz
 cd postfix-2.1.5
 make

***qmail
本体と、ヘッダに記録される日付・時間情報をローカルタイムに合わせるパッチを展開
予めssdlinuxのsendmailを退避
 su -
 cd /usr/bin
 mv mailq mailq.dist
 mv newaliases newaliases.dist
 cd ../sbin
 rm -i sendmail (qmail導入時に /var/qmail/bin/sendmail へのリンクになっている)
 mv sendmail sednmail.dist (qmailを導入していない場合)
 cd /home/otsuka/src/postfix-2.1.5
 /bin/sh postfix-install

 $ mkdir -p ~/src/01distfiles/qmail
 $ cd ~src/01distfiles/qmail
 $ wget ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz
 $ wget ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
 $ cd ../..
 $ mkdir qmail
 $ cd qmail
 $ tar xzvf ../01distfiles/qmail/qmail-1.03.tar.gz
 $ cd qmail-1.03
 $ patch -p1 < ../../01distfiles/qmail/qmail-date-localtime.patch
いろいろ聞いてくるが、全てデフォルトでよい。
install_rootを指定してローカル・パッケージを作ろうとしたが、
postfix-installのソースを見ると、install_rootを指定してある場合は、
/var/spool/postfixのchownやchmodの処理を
やってくれない((付属のPACKAGE_READMEや、http://www.kobitosan.net/postfix/readme/PACKAGE_README.jp にあるようにパッケージを解いてから post-install upgrade-package を実行するという手順になるようだ。))
ようなので、そのまま/へインストールすることにする。

make の前に、以下をrootで実行
/etc/postfix/aliasesを正しく設定する。
とりあえずqmailで使っていたサブアドレスは、aliasとして登録しておく。

 #!/bin/sh
 mkdir /var/qmail
 groupadd -g 600 nofiles
 useradd -g nofiles -d /var/qmail/alias -s /sbin/nologin -u 610 alias
 useradd -g nofiles -d /var/qmail -s /sbin/nologin -u 611 qmaild
 useradd -g nofiles -d /var/qmail -s /sbin/nologin -u 612 qmaill
 useradd -g nofiles -d /var/qmail -s /sbin/nologin -u 613 qmailp
 groupadd -g 601 qmail
 useradd -g qmail -d /var/qmail -s /sbin/nologin -u 614 qmailq
 useradd -g qmail -d /var/qmail -s /sbin/nologin -u 615 qmailr
 useradd -g qmail -d /var/qmail -s /sbin/nologin -u 616 qmails
/etc/postfix/main.cfを以下のように設定。
(プロバイダのsmtpサーバーを smtp.example.jpとする)
 $ /usr/sbin/postconf -n
 alias_database = hash:/etc/postfix/aliases
 alias_maps = hash:/etc/postfix/aliases
 command_directory = /usr/sbin
 config_directory = /etc/postfix
 daemon_directory = /usr/libexec/postfix
 debug_peer_level = 2
 home_mailbox = Maildir/
 html_directory = no
 inet_interfaces = all
 mail_owner = postfix
 mailq_path = /usr/bin/mailq
 manpage_directory = /usr/local/man
 mydestination = $myhostname, localhost.$mydomain, localhost
 mydomain = example.jp
 myhostname = example.jp
 mynetworks = 192.168.0.0/24, 127.0.0.0/8
 mynetworks_style = subnet
 myorigin = $mydomain
 newaliases_path = /usr/bin/newaliases
 queue_directory = /var/spool/postfix
 readme_directory = no
 recipient_delimiter = -
 relay_domains = $mydestination
 relayhost = [smtp.example.jp]
 sample_directory = /etc/postfix
 sendmail_path = /usr/sbin/sendmail
 setgid_group = postdrop
 unknown_local_recipient_reject_code = 550

コンパイル。DNSの準備が充分でなければ(MXレコードでサーバーが登録されているという意味で)、./config-fast を使う。make setup は、他のソース・ツリーで言えば make install に相当する。root で実行する必要がある。
sudo /usr/sbin/postfix startで動き出したことを確認。

 # make setup
 # make check
 # ./config-fast mail.example.jp
rootからotsukaにmailコマンドでローカル・メールが届くことを確認。

コントロール・ファイルの設定
再起動時や電源投入時に自動でpostfixを起動するために
/usr/local/etc/rc.d/postfix を追加。内容は以下のようにする。

 # cd /var/qmail/control
 # echo example.jp >defaultdomain
 # cat <<EOF >locals
 localhost
 localhost.example.jp
 host.example.jp
 example.jp
 EOF
 # cat <<EOF >rcpthosts
 localhost
 example.jp
 .example.jp
 EOF
 # echo mail.example.jp >me
 # echo example.jp >plusdomain
 # echo example.jp >defaulthost

alias の設定

 # cd /var/qmail/alias
 # touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
 # chmod 644 .qmail*

sendmail の駆逐

 # cd /usr/sbin
 # mv sendmail sendmail.dist
 # chmod 0 sendmail.dist
 # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

Maildir への移行

 # cp /var/qmail/boot/home /var/qmail/rc
 # vi /var/qmail/rc

s!/Mailbox!/Maildir/!g とする

alias のメール・ボックスを Maildir にする。

 # /var/qmail/bin/maildirmake ~alias/Maildir
 # chown -R alias ~alias/Maildir

新規ユーザーの追加 useradd foo -m の時、各ユーザーのホーム・ディレクトリに Maildir が作られるようにする。

 # mkdir /etc/skel
 # /var/qmail/bin/maildirmake /etc/skel/Maildir

tcpserver による SMTP daemon の起動

 $ cd ~src/01distfiles/qmail
 $ wget ftp://ftp.jp.qmail.org/qmail/ucspi-tcp-0.88.tar.gz
 $ cd ../../qmail
 $ tar xzvf ../01distfiles/qmail/ucspi-tcp-0.88.tar.gz
 $ cd ucspi-tcp-0.88
 $ su
 # make setup check
 # cd /etc
 # cat <<EOF >tcp.smtp
 192.168.0.:allow,RELAYCLIENT=""
 127.:allow,RELAYCLIENT=""
 EOF
 # /usr/local/bin/tcprules tcp.smtp.cdb tcp.smtp.tmp <tcp.smtp

起動スクリプトの設定
【後日談: daemontools による管理に変えたのでこの作業は不要になった】

 # mkdir -p /usr/local/etc/rc.d
 # cd /usr/local/etc.d
 # cat <<EOF >qmail
 #!/bin/sh
 #
 # qmail: /var/qmail
 PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
 
 [ -f /var/qmail/rc ] || exit 0
 
 case "$1" in
   start)
         # Start daemons.
         echo "Starting qmail."
         csh -cf '/var/qmail/rc &'
         tcpserver -v -u 611 -g 600 -x /etc/tcp.smtp.cdb \
           0 smtp /var/qmail/bin/qmail-smtpd 2>&1 \
           | /var/qmail/bin/splogger smtpd 3 &
         echo
         touch /var/spool/lock/qmail
         ;;
        # Start daemons.
        /usr/sbin/postfix start
        ;;
   stop)
         # Stop daemons.
         echo "Shutting down qmail."
         PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
         if [ ! -z "$PID" ] ;  then
             /bin/kill ${PID} 1> /dev/null 2>&1
         fi
         echo
         rm -f /var/spool/lock/qmail
         ;;
        # Stop daemons.
        /usr/sbin/postfix stop
        ;;
    *)
         echo "Usage: S99qmail {start|stop}"
         exit 1
        echo "Usage: S99postfix {start|stop}"
        exit 1
 esac
 
 exit 0
 EOF
 # chmod 755 qmail

立ち上げ時に自動起動するように /etc/rc.local に以下を加える
【後日談: daemontools による管理に変えたのでこの作業は不要になった】
**サブアドレスのフォルダ直接配信

 if [ -x /usr/local/etc/rc.d/qmail ]; then
        /usr/local/etc/rc.d/qmail start
 fi
qmailでできていたサブアドレスによるフォルダ直接配信ができなくなった。
ソースのツリー postfix-2.1.5/examples/qmail-local/qmail-local.txt
に、qmail-local をローカル配送エージェントとして使う方法(?)が
載っているようだか、意図がよく分からない。

メールが届くかどうか確認する。
  #!/bin/sh
  export PATH=$PATH:/usr/local/bin:/var/qmail/bin
  tail +2 | seekablepipe qmail-local -- \
    "$USER" "$HOME" "$LOCAL" "${EXTENSION:+-}" "$EXTENSION"
    "$DOMAIN""$SENDER" ./Maildir/
  e=$?
  (($e == 111)) && exit 75
  (($e == 100)) && exit 77
  exit $e

 # /usr/local/etc/rc.d/qmail start
 # ps aux | grep qmail
 # echo to: root | /var/qmail/bin/qmail-inject
 # ls -l /var/qmail/alias/Maildir/new
 # cat /var/qmail/alias/Maildir/new/*
これを /usr/local/libexec/postqmail-local として保存して、
main.cf の mailbox_command として使えということだろうか。
seekablepipe というコマンドは、[[conn-tools:http://www.skarnet.org/software/conn-tools/]]
の一部でインストールが結構めんどくさそうだ。
qmailのdaemonも動かし続けている必要があるため、
大掛かりになり過ぎるようだ。

届かないようなら、『メイル管理入門 実践編』を参考に調べる。
aliases に otsuka-123: /home/otsuka/Maildir/.Junk/ というエントリを
加えて、otsuka-123@example.jp に出すとどうなるかやってみたら、
 (maildir delivery failed: create 
 /home/otsuka/Maildir/.Junk/tmp/1106023024.P1317.minig: Permission denied)
というエラーでバウンスされてしまった。
aliasesにユーザーを指定しないときは、nobody で配送されるようだ。
Maildir の .Junk ディレクトリを go+rwx にしてみたが、だめなようだ。

**Courier IMAP
aliases に Maildir を直接指定するのはあきらめて、
/etc/postmaster/main.cf に 'recipient_delimiter = -' をセットして $HOME/.forward-123に /home/otsuka/Maildir/.Junk/ と書いてみたら
うまくいったようだ。
拡張アドレスを使う場合、otsuka-abc@exmaple.jp などの未定義アドレスに
送っても通常の受信フォルダに届いてしまう。.qmail-default のような
未定義アドレスをどこに配送するかは指定できないようだ。

Courier-IMAP server
foo-123@exmaple.jp というアドレスを、otsuka の Junkフォルダで受けたいときは、
aliases に foo-123: otsuka-junk と書いておき、$HOME/.forward-junk に
/home/otsuka/Maildir/.Junk/ を書いておけばよい。
 foo: otsuka-foo
 foo-123: otsuka-junk
 foo-456: otsuka-bbs
のように aliases に書いて目的別にアドレスを作ってから、
そのアドレスを相手に伝えれば、
漏洩元トレーサーの付いた自動振り分けメールボックスの出来上がりだ。

POP3とIMAPでアクセスできるように、courier を入れる。APOPにはそのままでは対応できないようだが、SSL が使えるので不要だと思われる。POP before SMTP についても、外から SMTP サーバーを使うことはないので、やらない。どうしても外から SMTP したければ、ssh 経由でできる。

http://www.courier-mta.org/download.php から ~/src/01distfiles に courier-imap-1.7.1.tar.bz2 をダウンロードする。パッケージ化も同時に行う。

 $ cd ~/src
 $ tar xjvf 01distfiles/courier-imap-1.7.1.tar.bz2
 $ cd courier-imap-1.7.1
 $ ./configure --prefix=/usr/local
 $ make
 $ mkdir -p ~/src/02locakpkg/courier/courier-imap-1.7.1/etc/pam.d
 $ make DESTDIR=~/src/02locakpkg/courier/courier-imap-1.7.1 install
 $ cd ~/src/02locakpkg/courier/courier-imap-1.7.1
 $ mv etc ..
 $ sudo /usr/sbin/chown -R root.wheel usr
 $ sudo tar czvf ../courier-imap-1.7.1.tar.gz usr
 $ sudo rm -rf usr
 $ cd ..
 $ sudo tar xzvf courier-imap-1.7.1.tar.gz -C /

/etc/pam.conf に以下を加える。imap エントリは元から存在するので session だけ加えることになる。

 #
 # The PAM configuration file for the `pop3' service
 #
 pop3    auth       required   pam_unix.so
 pop3    account    required   pam_unix.so
 pop3    session    required   pam_unix.so
 #
 # The PAM configuration file for the `imap' service
 #
 imap    auth       required   pam_unix.so
 imap    account    required   pam_unix.so
 imap    session    required   pam_unix.so

設定ファイルを初期化

 # cd /usr/local/etc
 # cp imapd.dist imapd
 # cp imapd-ssl.dist imapd-ssl
 # cp pop3d.dist pop3d
 # cp pop3d-ssl.dist pop3d-ssl
 # cp authdaemonrc.dist authdaemonrc
 # cp quotawarnmsg.example quotawarnmsg

サーバー鍵を適当に作るか、認証局で作ってもらう。(ssl を動かさないなら不要)

 # cd /usr/local/share
 # cp ~/mail.example.jp.pem imapd.pem
 # cp imapd.pem pop3d.pem

起動スクリプトを書く(ssl を動かさないならpop3d-ssl, imapd-ssl は削除する)

 # cd /usr/local/etc/rc.d
 # cat <<EOF >courier
 #!/bin/sh
 case "$1" in
   start)
         # Start daemons.
         /usr/local/libexec/authlib/authdaemond start
         /usr/local/libexec/pop3d.rc start
         /usr/local/libexec/pop3d-ssl.rc start
         /usr/local/libexec/imapd.rc start
         /usr/local/libexec/imapd-ssl.rc start
         ;;
   stop)
         # Stop daemons.
         /usr/local/libexec/pop3d.rc stop
         /usr/local/libexec/pop3d-ssl.rc stop
         /usr/local/libexec/imapd.rc stop
         /usr/local/libexec/imapd-ssl.rc stop
         /usr/local/libexec/authlib/authdaemond stop
         ;;
    *)
         echo "Usage: S99courier {start|stop}"
         exit 1
 esac
 
 exit 0
 EOF
 # chmod 755 courier

立ち上げ時に自動起動するように /etc/rc.local に以下を加える

 if [ -x /usr/local/etc/rc.d/courier ]; then
        /usr/local/etc/rc.d/courier start
 fi

MUA(mozilla 等がおすすめ)でアクセスしてみる

**daemontools
どうも、起動時や DNS がおかしい場合に、smtp が止まってしまうようなので、こうなったら毒を食らわば皿までよ、ってことで daemontools を入れることにした。@IT: daemontoolsによるロギングとプロセス監視(1-3) のとおりでうまくいった。毒とは失礼な表現だが、セキュリティ的な意味ではなく、ディレクトリの構成とかメンテナンスのしやすさ -- これも問題は文化の違いだけだと思われるが -- とかを見て、私が感じた表現である。

 $ cd ~/src/01distfiles/qmail
 $ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz 
 $ su
 # mkdir -p /package
 # chmod 1755 /package
 # tar -xzvpf daemontools-0.76.tar.gz -C /package
 # cd /package/admin/daemontools-0.76
 # ./package/install

 # vi /var/qmail/rc
 :s!qmail-start ./Maildir/ splogger qmail!qmail-start ./Maildir/!
 :w
 :q
 # mkdir /var/qmail/services
 # mkdir /var/qmail/services/qmail
 # mkdir /var/qmail/services/qmail/log
 # chmod +t /var/qmail/services/qmail 
 # cat <<EOF >/var/qmail/services/qmail/run
 #!/bin/sh
 PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
 exec /var/qmail/rc
 EOF
 # cat <<EOF >/var/qmail/services/qmail/log/run
 #!/bin/sh
 exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
 EOF
 # chmod +x /var/qmail/services/qmail/run
 # chmod +x /var/qmail/services/qmail/log/run
 # mkdir /var/log/qmail
 # chown qmaill.nofiles /var/log/qmail 
 # chmod 700 /var/log/qmail 
 # cd /service/
 # ln -s /var/qmail/services/qmail .
 # mkdir /var/qmail/services/smtpd
 # mkdir /var/qmail/services/smtpd/log
 # chmod +t /var/qmail/services/smtpd 
 # cat <<EOF >/var/qmail/services/smtpd/run
 #!/bin/sh
 PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
 tcpserver -v -u 611 -g 600 -x /etc/tcp.smtp.cdb \
 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
 EOF
 # cat <<EOF >/var/qmail/services/smtpd/log/run
 #!/bin/sh
 exec /usr/local/bin/setuidgid qmails /usr/local/bin/multilog t /var/log/smtpd
 EOF
 # chmod +x /var/qmail/services/smtpd/run
 # chmod +x /var/qmail/services/smtpd/log/run
 # mkdir /var/log/smtpd
 # chown qmails.nofiles /var/log/smtpd 
 # chmod 700 /var/log/smtpd 
 # cd /service/
 # ln -s /var/qmail/services/smtpd .

以前の起動スクリプトは動かないようにしておく。

 # cd /usr/local/etc/rc.d
 # mv qmail qmail.old
 # chmod 644 qmail.old

**Quick Reference (smtpd とか qmail/log とか個別でサービスを止めたりしなければならない)

|内容|コマンド|h
|サービスを止める|sudo svc -d /service/qmail|
|サービスを開始|sudo svc -u /service/qmail|
|ログを見る|sudo tail -50 /var/log/qmail/current &tate; tai64nlocal|

**fetchmail
Fetchmail Home Page - fetchmail(1) (JMで翻訳はまだのようだ) 

過去のいろんなところに作った POP3 アカウントのメールを自宅サーバーで一括して受けるために、fetchmail を入れてみる。

GNU gettext によって日本語のメッセージが出せるようだが、コンパイルが止まってしまうようなので、--disable-nls して使わないようにした。翻訳してくれた人には悪いが、どうせ cron で動かすのだから、エラーメッセージ等が日本語である必要はない。

WEB には、GPG の signature ファイルが存在するような記述があるのだが、落とせないようだ。checksums は落とせるので、これを gpg で検証して、本体は md5sum でチェックする。

 $ cd ~/src/01distfiles
 $ wget http://www.catb.org/~esr/fetchmail/fetchmail-6.2.3.tar.gz
 $ wget http://www.catb.org/~esr/fetchmail/checksums
 $ gpg --verify checksums
 $ grep tar checksums
 e131bdb6c3977fd47a3e122c43dcf19d fetchmail-6.2.3.tar.gz
 $ md5sum fetchmail-6.2.3.tar.gz
 e131bdb6c3977fd47a3e122c43dcf19d fetchmail-6.2.3.tar.gz
 $ cd ..
 $ tar xzvf 01distfiles/fetchmail-6.2.3.tar.gz
 $ cd fetchmail-6.2.3
 $ ./configure --disable-nls
 $ make
 $ mkdir ~/src/02localpkg/fetchmail
 $ make DESTDIR=~/src/02localpkg/fetchmail install
 $ cd ../02localpkg/fetchmail
 $ tar czvf fetchmail-6.2.3-ssdlinux-1.tgz --owner=root --group=wheel usr
 $ rm -rf usr
 $ sudo tar xzvf fetchmail-6.2.3-ssdlinux-1.tgz -C /

fetchmailconf を動かすには、python が必要だ。とりあえず、手で設定ファイルを書くことにする。smtpname を書かないと、現在のユーザー名@localhost というアドレスに転送されるようだ。/var/qmail/locals に localhost の記述がない場合、外に出て行ってしまうので注意。設定の記述方法に関しては、Red Hat Linux レファレンス・ガイドが参考になる。

 $ cat .fetchmailrc
 set no bouncemail
 
 defaults
  protocol pop3
  uidl
  no rewrite
  no keep
  no mimedecode
  smtpname "otsuka@example.jp"
 
 skip pop3.provider1.example.jp
  user "otsuka"
  pass "secret1"
  smtpname "otsuka-provider1@example.jp"
 
 poll pop3.provider2.example.jp
  user "abcd001"
  pass "secret2"
  smtpname "otsuka-provider2@example.jp"

smtpname で転送先を変えて、前振り分けでプロバイダごとに IMAP フォルダに直接配信している。再配送には、smtp (tcp/25) を使うようだ。この場合問題点として、localhost で qmail での配送に失敗した場合、差出人に返されてしまう。smtp の入り口でエラーになると fetchmail が set no bouncemail 設定に従って postmaster にエラーを報告するようにできるようだが、qmail の場合は、受け取った後でエラーになり、qmail 自身がエラー報告してしまうので、まずいことになる。(通常 pop3 から先は、配送経路とは関係ない場所なので、ここからエラーメールを返されても送信者は困惑するだろう)。

**maildrop
http://www.courier-mta.org/download.php から ~/src/01distfiles に maildrop-1.5.3.tar.bz2 をダウンロードする。パッケージ化も同時に行う。

 $ cd ~/src
 $ tar xjvf 01distfiles/maildrop-1.5.3.tar.bz2
 $ cd maildrop-1.5.3
 $ ./configure
 $ make
 $ mkdir ~/src/02localpkg/maildrop
 $ make DESTDIR=~/src/02localpkg/maildrop install
 $ cd ~/src/02localpkg/maildrop

courier-IMAP とファイルが重なっているようだ。

 $ cd ~/src/02localpkg/maildrop
 $ find usr -type f -print | (cd /; xargs file) | grep -v "can't stat"
 usr/local/man/man1/maildirmake.1: troff or preprocessor input text
 usr/local/man/man8/deliverquota.8: troff or preprocessor input text
 usr/local/bin/maildirmake: ELF 32-bit MSB executable, PowerPC or cisco 
 4500, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses 
 shared libs), not stripped

courier-IMAP のファイルを使うことにして、こちらのパッケージからは削除する。

 $ cd ~/src/02localpkg/maildrop
 $ rm usr/local/man/man1/maildirmake.1
 $ rm usr/local/man/man8/deliverquota.8
 $ rm usr/local/bin/maildirmake
 $ tar czvf maildrop-1.5.3-ssdlinux-1.tgz --owner=root --group=wheel usr

動作テスト

 $ cat ~/.mailfilter
 to "Maildir"
 $ chmod 600 ~/.mailfilter
 $ cat dummy-mail
 To: otsuka
 From: root
 Subject: test mail
 
 this is test
 $ maildrop <dummy-mail
 maildrop: Delivery complete.
 maildrop: signal 0x06

なぜか、signal 0x06 が出て異常終了となる。signal を受ける部分は、ソース maildrop/maildrop.C にあるのだか、どうも 0 から NSIG(=64) の全てにトラップをかけているようだ。signal 6 は、/usr/include/bits/signum.h にあるように SIGIOT なのだが、この signal はすでに使われていないような気がする[Linux GCC HOWTO]。~/.mailfilter を消せば正常終了するようだが、フィルタが書けなければ意味が無い。ちなみに ~/.mailfilter は、他人が読めるような属性になっているばあいは、読み込まれないので注意。

fetchmail の rc-file を以下のようにしてテスト

 $ cat test-fm
 set no bouncemail
 
 defaults
 protocol pop3
 uidl
 no rewrite
 no keep
 no mimedecode
 mda "maildrop .mailfilter"
 
 poll pop3.provider1.example.jp
 user "otsuka"
 $ fetchmail -v -f test-fm

**日々の運用
***前振り分け
+otsuka-123@example.jp というようなアドレスをホームページなどに書いておく 
+MUA で IMAP フォルダ Junk を作る 
+$HOME/.qmail-default に /home/otsuka/Maildir/.Junk/ と書いておけば、otsuka-xxx@example.jp のような宛先のメールは、全て Junk フォルダ直行となる。biff も吠えない。 
+メーリングリストへは、otsuka-ml@example.jp のようなアドレスで参加して、$HOME/.qmail-ml で特定の IMAP フォルダに振り分ければよい。 

***ログイン名とメールアドレスの使い分け
ログイン名をメールアドレスにしたくない場合は、対応表を作って対処できる。

 $ sudo sh -c "/var/qmail/bin/qmail-pw2u </etc/passwd >/var/qmail/users/assign"
 $ sudo vi /var/qmail/users/assign

ログイン名 otsuka で、メールアドレスを foo@example.jp とし、foo-xxx@example.jp でも受け取りたい場合は、

 +:alias:610:600:/var/qmail/alias:-::
 =alias:alias:610:600:/var/qmail/alias:::
 +alias-:alias:610:600:/var/qmail/alias:-::
 =otsuka:otsuka:32769:100:/home/otsuka:::
 =foo:otsuka:32769:100:/home/otsuka:::
 +foo-:otsuka:32769:100:/home/otsuka:-::
 .

とすれば良いだろう。最終行のピリオドを忘れないように。/var/qmail/users/assign を更新したら、qmail-newu で変更を反映しておく。

 $ sudo /var/qmail/bin/qmail-newu

拡張アドレス (foo-xxx@example.jp のようなアドレス) で受け取りたいときは、さらに $HOME/.qmail-default もしくは、$HOME/.qmail-xxx を書いておかないと、配送エラーで差出人に戻される。

 $ cat <<EOF >~/.qmail-default
 /home/otsuka/Maildir/
 EOF

***携帯電話に出せない場合
ADSLのアクセス・ポイントのアドレスでメール・サーバーを運用する場合、相手先のポリシーによっては断られることがある。その場合、プロバイダの smtp サーバーへ渡してしまえば良い。プロバイダの送信用のメール・サーバーが smtp.example.jp の場合、

 $ sudo sh -c "echo :smtp.example.jp >/var/qmail/control/smtproutes"

但し、プロバイダのメール・サーバーがメールの中継を許可している必要がある。幸い私のプロバイダは、アクセス・ポイントからの送信に限っては、中継してくれるようなので問題無かったが、POP3 でアクセスしてからでないとメールを出せないプロバイダの場合は、何らかの対策をする必要がある。

***コンソール通知
UNIXでは、login 時と shell のコマンド・プロンプトが出るタイミングでメールボックスをチェックしてくれて、"You have New Mail" とか出してくれる機能がある。これが、Maildir にすることによって機能しなくなっている。POP3 とか IMAP4 でアクセスできるのだから不要だといえば不要なのだが、設定できるのならしておきたい。

l/etc/login.defs にある QMAIL_DIR 環境変数をセットすれば、環境変数 MAILDIR=/home/otsuka/Maildir とセットしてくれるようになるが効能は不明。しかも、ssh を使ったログインだとセットされない。

bash が Maildir に対応しているのかどうか不明だが、どうもだめなようだ。mailbox 形式の場合は、環境変数 MAIL と MAILPATH にセットすればいいのだが、Maildir 形式の場合は設定できないようだ。

***でたらめの差し戻し先
最近のルータで、何か異常が起きたら特定のメールアドレスへメールを送ってくれるものがある。そのメールを受け取って、さらに携帯電話へも転送しようとしたら、問題が発生した。

まず最初、メールを出す機器が、差し戻し先 (Return-Path:) に、でたらめなアドレス (root@mailto.localhost など) を入れる。これは、メールは出せるが受け取ることが出来ないルータ等の機器の場合、しかたのないことかもしれない。転送先の携帯電話のメール・サーバーは、このでたらめな差し戻し先が気に食わないので、受け取りを拒否した。しかたが無いので、このような経緯を追加して差し戻しを行おうとしたら戻せない。最後に MAILER-DAEMON へ差し戻しとなってしまった。

あんまり良い対応とはいえないが、/var/qmail/control/locals に機器が設定してきたでたらめのドメイン名 mailto.localhost を加えて、外に出ないようにした。本来、メールが出せる機器で、差し戻し先も設定できるようにすべきだと思う。

加えて、携帯電話への転送は、dot-qmail でシェル・スクリプトを起動し、ここでメールを作り直してから qmail-inject へ投げなおしている。これなら、差し戻し先はこのサーバーなので問題ない。

**解決済みの問題点
shell からユーザー名だけでメールを出したとき、省略した From や、To にホスト名(/var/qmail/control/me の内容)が出てきてしまう。sudo sh -c "echo kubotek.jp >/var/qmail/control/defaulthost" とする。 
tcpserver で起動した smtp や pop3d が止まっていることがある。再起動を行った場合は smtp が必ず止まってしまうようだ。ログを見ても理由が書いてない。daemontools を使えば、止まったときには再起動してくれるようだ。qmail 教は寡黙なのを美としているようだ(勝手な思い込みかもしれない)が、これでは対策のしようが無い。起動スクリプト (/usr/local/etc/rc.d/qmail) で一旦止めてから動かすと、止まることは無いようだ。停電などの場合に自動復帰しないのは非常に困る。 
pop3 と smtp を ssl 化しようとしているが、stone や stunnel が動かない。 

#include(免責事項)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS