はじめ,Debian のパッケージになっている imapd をインストールしたのだが,どうしても imap 要求を受け付けなかった.そこで文献調査をした結果,以下のことがわかり,方針をきめた.このドキュメントは,この方針に沿って作業を行うためのものである.
qmail がメールを配送する ~/Mailbox に imapd を対応させるためのパッチ (ftp://summersoft.fay.ar.us/pub/linux/qmail/qmail-imap/qmail-imap-4.5.BETA-qmail.patch) が存在する. このパッチが何をするのかは,文献 1 に解説されている. これによれば,このパッチは,imap_4.5BETA のソースにあたる. imap の現在の最新版(http://mirror.nucba.ac.jp/mirror/imap/imap-4.5.tar.Z) のバージョンは 4.5 なので,qmail-imap-4.5.BETA-qmail.patch を直接あてることはできない. そこで,文献 1 での解説に従って,手動でこれにパッチをあて,コンパイルする.
http://mirror.nucba.ac.jp/mirror/imap/imap-4.5.tar.Z を取得,展開.imap-4.5/src/osdep/unix/env_unix.c を 文献 1 の解説(以下に引用)に従って編集.
このパッチが行っていることを具体的に説明します。まず、~userid/Mailbox を使うための方法を示します。imap-4.5.BETA/src/osdep/env_unix.c の関数 char *sysinbox () において
sprintf (tmp,"%s/%s",MAILSPOOL,myusername ());
を
sprintf (tmp,"%s/Mailbox",myhomedir ());
に書き換えます。次に、ホームディレクトリ直下のファイルを見せなくするための方法を示します。先と同じファイル env_unix.c の関数 char *mailboxdir (char *dst,char *dir,char *name) において
else strcpy (dst,myhomedir());/* no arguments, wants home directory */
を
else strcpy (dst,myhomedir()), strcat( dst, "/mail" );/* no arguments, wants home directory */
に書き換えます。さらに関数 char *mailboxfile (char *dst,char *name) において
sprintf (dst,"%s/%s",dir,name);
を
sprintf (dst,"%s/mail/%s",dir,name);
に書き換えます。
imap-4.5/Makefile を見ると,
# The following plaintext login types are defined:
# afs AFS authentication database
# dce DCE authentication database
# md5 MD5 database (must also have md5 as an authenticator)
# nul no plaintext authentication (note: this will break some secure
# authenticators -- don't use without checking first!!)
# std system standard (typically passwd file), determined by port
PASSWDTYPE=std
とあるので,
PASSWDTYPE=md5
に書き換える.imap-4.5/docs/md5.txt には,MD5 を用いた認証について書かれている.これによれば,この認証方式はパケット盗聴に対してセキュアだそうだ.PASSWDTYPE=std としてコンパイルした場合,imap 認証にはログインに使うパスワードと同じ物が用いられる.これはアンセキュア!
imap-4.5/README に従って,
$ cd imap-4.5/ $ make slx
su になって,
# cp imap-4.5/imapd/imapd /usr/local/sbin/imapd
imap2 143/tcp # Interim Mail Access Proto v2
imap2 143/udp
があることを確認.
/etc/inetd.conf に以下の一行を加える.余談:はじめ,imap-4.5/docs/BUILD に従ってプロトコル名を "imap" としていたのだが,うまく動作しなかった."imap2" に改めたのは,/etc/services にそう表記されていたため.
imap2 stream tcp nowait root /usr/local/sbin/imapd imapd
inetd に HUP を送る.
# kill -HUP xxxxxxxx: inetd のプロセス番号.
一般ユーザ毎に ~/.qmail を編集.以下の一行を加える.
./Mailbox
メールが ~/Mailbox へ配送されるようになる.
# CRAM-MD5 authentication database
# Entries are in form <user><tab><password>
# Lines starting with "#" are comments
kyoma xxxxxxxx
ユーザ名と imap 用パスワードの間は tab で区切るとされている.
root 以外のパーミッションは,0 とする.
スクリプトは以下.これを,/etc/cron.daily/imappwdbg とした.パーミッションは,744.
#!/usr/bin/perl #Kyoma TAKAHASHI 1999.7.9 #Thanks for Toyoda's help. $chmodbin = '/bin/chmod'; $imappwdb = '/etc/cram-md5.pwd'; $userpwfile = 'Maildir/.password'; system "$chmodbin 600 $imappwdb"; open(DBFILE,"> $imappwdb"); print DBFILE '# CRAM-MD5 authentication database',"\n"; print DBFILE '# Entries are in form <user><tab><password>',"\n"; print DBFILE '# Lines starting with "#" are comments',"\n"; print DBFILE "\n"; while (($user,$passwd,$uid,$gid,$quota,$comm,$gcos,$dir) = getpwent) { open(PWFILE,"< $dir/$userpwfile"); $pass = ''; $pass = $_ while(<PWFILE>); chop($pass); close(PWFILE); if($pass ne '') { print DBFILE $user; print DBFILE "\t"; print DBFILE $pass; print DBFILE "\n"; } } close(DBFILE); system "$chmodbin 400 $imappwdb";