そろそろメールの設定もしておこうかと思った。完成形としてはPostfix + PostfixAdmin + Courier-IMAPという感じ。最小の手数での動作を目指す。

メールの設定(Postfix Admin編)
まずはpostfixadminをインストールし、MySQL上にデータベースを作成する。
$ cd /usr/ports/mail/postfixadmin; make install clean
$ cd /usr/local/www/postfixadmin
$ mysql -uroot -p < DATABASE_MYSQL.TXT
データベースはpostfixという名前で、ユーザ名postfix、パスワードpostfixでアクセスできるように設定されている。変更したい場合にはDATABASE_MYSQL.TXTに適宜変更を加えてから読み込むという方法と、phpMyAdminなどを使って変更する方法がある。
/usr/local/www/postfixadmin/config.inc.phpを適宜編集する。いろいろ変更することも可能だが、変更を最小限に留めたければ、change-this-to-your.domain.tldとなっている部分を自分のドメイン名に変更するだけでよい。
/usr/local/www/postfixadmin/admin/.htaccessを若干修正。オリジナルには脆弱性がある。
--- .htaccess.bak Sun Feb 19 03:18:10 2006
+++ .htaccess Tue Feb 21 11:58:26 2006
@@ -3,6 +3,4 @@
AuthName "Postfix Admin"
AuthType Basic
-<limit GET POST>
require valid-user
-</limit>
/usr/local/www/postfixadmin/admin/.htpasswdにパスワードを登録しなおす。デフォルトはadmin:adminになっていて誰でもクラックできるので要注意。
# cd /usr/local/www/postfixadmin/admin
# mv .htpasswd .htpasswd.bak
# htpasswd -c -m .htpasswd name
httpd.confの適切な箇所に以下を追加する。
Alias /postfixadmin/ "/usr/local/www/postfixadmin/"
<Directory "/usr/local/www/postfixadmin">
Options Indexes
AllowOverride AuthConfig
</Directory>
apachectl restartしてapacheを再起動し、/postfixadmin/setup.phpをブラウザでアクセスしてセットアップの確認を行う。問題がなければ、setup.phpを削除またはリネームした上で、admin sectionにアクセスして初期設定を行う。
使い方に関してはグーグルに聞くこと。
メールの設定(Postfix編)
インストール
まず、/usr/port/mail/postfixでmake installする。私がインストールしたバージョンは2.2.8_2,1である。コンパイルオプションをいろいろ聞かれるが、ここでの設定を行うには、少なくともMySQLがenableになっていなければならない。
設定
無事にインストールできたら、/usr/local/etc/postfix/main.cfの末尾に以下をざっくり追加する。
mydomain = your.domain.name
myorigin = $mydomain
mydestination =
local_transport = virtual
mynetworks_style = host
mynetworks = 59.106.XXX.XXX 127.0.0.1
home_mailbox = Maildir/
alias_maps =
alias_databases =
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /var/mail
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 125
virtual_uid_maps = static:125
virtual_gid_maps = static:6
virtual_transport = virtual
# Additional for quota support
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
この設定では、Maildir形式のメールスプールが/var/mail/username@my.domain/というディレクトリに作られる。/var/mailのもともとのパーミッションに合わせて、ユーザpostfix(UID=125)、グループmail(GID=6)の権限で書き込むように設定している。/etc/passwd, /etc/groupを見て異なる値になっていたらその値に合わせる必要がある。
次にmain.cfで使っている4つのmysql_virtual_XX.cfファイルを用意する。各々の内容は以下の通り。
mysql_virtual_alias_maps.cf
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active='1'
mysql_virtual_domains_maps.cf
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0' AND active='1'
mysql_virtual_mailbox_maps.cf
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' and active='1'
mysql_virtual_mailbox_limit_maps.cf
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'
4つのファイルを作ったらmysql_virtual_XX.cfを人様に見られないようにchmod & chgrpしておく。
# chmod 640 mysql_*
# chgrp postfix mysql_*
SASLの設定などは後からでもできるので省略。
起動の設定
/etc/rc.confに以下の行を追加する。
postfix_enable="YES"
sendmail_enable="NONE" ("NO"ではなくて"NONE")
/etc/periodic.confに以下の行を追加する(なければ新規に作る)。
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
sendmailがまだ動いていたら停止+postfixをおもむろに起動。
# /etc/rc.d/sendmail stop
# /usr/local/etc/rc.d/postfix.sh start
メールの設定(Courier-IMAP編)
インストール
portinstallを使ってcourier-imapをインストールする。
$ portinstall -P courier-authlib-base courier-authlib-mysql courier-imap
Authdaemonの設定
/usr/local/etc/authlib/authdaemonrcを修正する。デフォルトでも問題ないかもしれないが、Postfix Adminで設定したアカウントだけでメールを授受するには以下のように設定する。
--- authdaemonrc.dist Tue Feb 21 09:06:33 2006
+++ authdaemonrc Tue Feb 21 09:20:18 2006
@@ -27 +27 @@
-authmodulelist="authuserdb authvchkpw authpam authldap authmysql authpgsql"
+authmodulelist="authmysql"
/usr/local/etc/authlib/authmysqlrcも修正する。postfixの設定では、メールスプールが/var/mail/username@my.domain/というディレクトリに作られるようにしていた。下記は、/var/mail/username@my.domain/以下にあるメールスプールをユーザpostfix(UID=125)、グループmail(GID=6)の権限で読み書きするように設定している。
--- authmysqlrc.dist Tue Feb 21 09:08:13 2006
+++ authmysqlrc Tue Feb 21 17:59:57 2006
@@ -26,3 +26,3 @@
-MYSQL_SERVER mysql.example.com
-MYSQL_USERNAME admin
-MYSQL_PASSWORD admin
+MYSQL_SERVER localhost
+MYSQL_USERNAME postfix (データベースのユーザ名)
+MYSQL_PASSWORD postfix (データベースのパスワード)
@@ -54 +54 @@
-MYSQL_DATABASE mysql
+MYSQL_DATABASE postfix
@@ -61 +61 @@
-MYSQL_USER_TABLE passwd
+MYSQL_USER_TABLE mailbox
@@ -70 +70 @@
-MYSQL_CRYPT_PWFIELD crypt
+MYSQL_CRYPT_PWFIELD password
@@ -91 +91 @@
-MYSQL_UID_FIELD uid
+MYSQL_UID_FIELD '125'
@@ -97 +97 @@
-MYSQL_GID_FIELD gid
+MYSQL_GID_FIELD '6'
@@ -106 +106 @@
-MYSQL_LOGIN_FIELD id
+MYSQL_LOGIN_FIELD username
@@ -111 +111 @@
-MYSQL_HOME_FIELD home
+MYSQL_HOME_FIELD '/var/mail/'
@@ -128 +128 @@
-# MYSQL_MAILDIR_FIELD maildir
+MYSQL_MAILDIR_FIELD maildir
Courier-IMAPの設定
Courier-IMAPでは、pop3d, pop3d-ssl, imapd, imapd-sslの4つのアクセスメソッドが用意されている。-sslが付いているのは通信経路が暗号化されるが、暗号化のために必要な証明書に(お金を払いたくなければ)自己署名しなくてはならない。また、自己署名した証明書を使ったpop3d-ssl, imapd-sslに対して接続のたびにWarningを表示するようなメーラーもままある。
つまり、私が言いたいのは「面倒だからpop3dとimapdの設定だけここではする。-sslが使いたければ後で考える。」ということだ。
Courier-IMAPの設定ファイルは/usr/local/etc/courier-imap以下にあるが、ここでは何も変更しないでおく。何もしなくてもpop3とimapdは使えるからだ。
起動の設定
次に/etc/rc.confに以下の行を追加する。
courier_authdaemond_enable="YES"
courier_imap_imapd_enable="YES"
courier_imap_imapd_ssl_enable="NO"
courier_imap_pop3d_enable="YES"
courier_imap_pop3d_ssl_enable="NO"
最後に必要なデーモンを起動する。
# /usr/local/etc/rc.d/courier-authdaemond.sh start
# /usr/local/etc/rc.d/courier-imap-pop3d.sh start
# /usr/local/etc/rc.d/courier-imap-imapd.sh start
メールの設定(Postfix編SMTP-Auth対応)
ここまで説明した設定では、mynetworksに指定したホストからしかメールの送信を行えない。mynetworksに自分の使用するすべてのIPアドレスを指定しておくのも一つの解だが、ここではSMTP-Auth対応にする方法を述べる。
まず、postfixをインストールする際にSASL2とMySQLがenableにしてあるものとする。また、上の設定はすでに行ってあるものとする。
/usr/local/etc/postfix/main.cfの末尾に以下の設定を追加する。
# SMTP-Auth and TLS
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes
次に/usr/local/lib/sasl2/smtpd.confというファイルを作る。内容は以下の通り。
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path: /var/run/authdaemond/socket
さらにsmtpd(postfixユーザ権限で動作する)が/var/run/authdaemond/socketにアクセスできるようにする必要がある。安直にこれを実現するには、/var/run/authdaemondディレクトリのパーミッションを緩めに設定する方法とpostfixユーザをcourierグループに追加する方法がある。前者の方がセキュリティ上のインパクトが大きい。後者を実現するには/etc/groupのcourierグループにpostfixを追加すればよい。
--- group.bak Thu Feb 23 21:13:19 2006
+++ group Thu Feb 23 21:14:04 2006
@@ -32 +32 @@
-courier:*:465:
+courier:*:465:postfix
以上の設定が済んだら、/usr/local/etc/rc.d/postfix.sh restartしてpostfixを再起動する。
ちなみに以上で説明したようにpwcheck_methodでauthdaemondを指定するには、cyrus-sasl2がWITH_AUTHDAEMONオプション付きでコンパイルされている必要がある。ただし、courier-authlibが先にインストールされていれば、オプションを明示的に設定されていなくても有効になる。うまく動かない場合にはcyrus-sasl2をインストールし直すことをお勧めする。
メーラーの設定はグーグルで調べること。残るは、pop3d, imapd, smtpdのTLS対応。