Postfix+postgreSQL+courier-imapによるバーチャル運用(その1)

qmail+vpopmailにて運用したことがある人であれば、「Unixの実アカウントを使わずにメールの運用ができれば…」と考えている方もたくさんいると思います。
そこで、PostfixとPostgreSQLとcourier-imapを使い、qmail+vpopmailのような環境を構成してみたいと思います。
(まとめになかなか時間がかかりました。。。)

[構築する環境]
OS:VineLinux4.0

[postgreSQLの設定など]
データベース名 : postfix
DB文字符号 : EUC_JP
DB所有者 : pgsql
PostfixからのDB接続ユーザ/パスワード : postfix / postfix
PostfixAdminからのDB接続ユーザ/PWD : postfixadmin / postfixadmin

[バーチャルアカウント宛メール受信用UNIXユーザ]
ユーザ名 : mailuser
UID : 10000
GID : 10000
HOME : /var/mail

1.PostfixをPgsql対応にする。

まずpostgreSQLを入れておきます。入れ方は任せます。(笑)

# apt-get install postgresql-server

次にPostfixをインストール…したいところですが、通常のインストールですとPostfixはpostgresqlに対応していませんので、postfixのrpmソースを準備し、パッケージを構築し直します。

# apt-get source postfix (Postfixのソースを取得)
# rpm -Uvh postfix-2.2.10-0vl6.src.rpm (ソースrpmを展開)
# cd /usr/src/vine/SPECS (展開されたソースrpmのspecファイルが置かれる場所)
# vi postfix.spec (specファイルを編集しましょう)

いろいろとこれは悩みましたが、Postfixをpostgresqlに対応させるため、specファイルは以下のように編集しました。

{postfix.spec 2行目あたり}
%define build_pgsql 1 ←とりあえず、1にして「pgsqlを使うぞっ」という意志を見せます。

その後、specファイルの編集を終え、rpmを作成します。

# rpm -ba postfix.spec (rpmができるまで、しばし待ちます…。)もし、構築中に、

エラー: ビルド依存性の失敗:
db4-devel >= 4.2.52 は postfix-2.2.10-0vl6.i386 に必要とされています
pam-devel は postfix-2.2.10-0vl6.i386 に必要とされています
gdbm-devel は postfix-2.2.10-0vl6.i386 に必要とされています
cyrus-sasl-devel は postfix-2.2.10-0vl6.i386 に必要とされています
openssl-devel は postfix-2.2.10-0vl6.i386 に必要とされています
postgresql-devel は postfix-2.2.10-0vl6.i386 に必要とされています
openldap-devel は postfix-2.2.10-0vl6.i386 に必要とされています
pcre-devel は postfix-2.2.10-0vl6.i386 に必要とされています

などでた場合、

# apt-get install db4-devel pam-devel gdbm-devel …

として、ビルドに必要なパッケージを組み込んでおきます。

しばらくすると、rpmパッケージができあがります。

# cd /usr/src/vine/RPMS/i386/ (rpmはここにできます。)
# ls -la
-rw-r–r– 1 root root 1217456 12月16日 00:04 postfix-2.2.10-0vl6.i386.rpm
-rw-r–r– 1 root root 23837 12月16日 00:04 postfix-ldap-2.2.10-0vl6.i386.rpm
-rw-r–r– 1 root root 14981 12月16日 00:04 postfix-mysql-2.2.10-0vl6.i386.rpm
-rw-r–r– 1 root root 18919 12月16日 00:04 postfix-pcre-2.2.10-0vl6.i386.rpm
-rw-r–r– 1 root root 19425 12月16日 00:04 postfix-pgsql-2.2.10-0vl6.i386.rpm

こんな感じで、rpmができあがっていればokかと。
あとは、このpostfixをインストールします。
# rpm -ivh –force postfix-2.2.10-0vl6.i386.rpm postfix-pgsql-2.2.10-0vl6.i386.rpm
※すでにPostfixがインストールされていた場合、先にアンインストールしてから実施のこと。

2.imapで必要になるものを入れる。

次は、courier-imapで必要となるものをインストールします。

# apt-get install courier-imap courier-authlib

この辺は特に難もなく入れられると思います。
なお、imapですが、実際にはpop3として使用します。

3.sasl系を入れる

昨今の迷惑メール対策で、SMTPはport25を使用して送ることがほとんど規制されてきています。
そこで、submission-port587を使用して送信できるよう、saslを入れておきます。
VineLinuxにはすでにsasldが入っていますが、これだとplain認証、md5認証ができない等のトラブルがあるため、一応以下のようにしてパッケージをインストールしておきます。

# apt-get install cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5

私は、cyrus-sasl-plainとcyrus-sasl-md5の2つが入っていないばっかりに、Postfixが意図した動きをしてくれなくて、数日悩みました…。

4.postgresqlのDBを作成する。

Postfixと、PostfixAdminから管理するためのDBを作成します。

# su – postgres (postgresユーザになる)
$ createuser -A -D -P postfix
(postfixユーザのパスワードを入力)
$ createuser -A -D -P postfixadmin
(postfixadminユーザのパスワードを入力)

$ createdb –encoding=EUC_JP postfix (DBを作成する)
CREATE DATABASE

$ /var/lib/pgsql/data/pg_hba.conf

local postfix postfix,postfixadmin password
host postfix postfix,postfixadmin 127.0.0.1 255.255.255.255 password
host postfix all 0.0.0.0 0.0.0.0 reject

こんなところでしょうか。

5.PostfixAdminをインストールする。

qmailにも、qmail-adminっていうwebベースの管理画面がありましたよね。
それとだいたい同じことをやれるのがPostfixAdminです。
せっかくDB化したのですから、インストールしておくと便利ですよ。

# cd /var/www/html/ (apacheのドキュメントルートにでも移動します。)
# wget http://high5.net/page7_files/postfixadmin-2.1.0.tgz (downloadします。)
# tar xvzf postfixadmin-2.1.0.tgz (ファイルを展開…ってわかりますよね。)
# wget http://troels.arvin.dk/db/postfixadmin/postfixadmin-arvin.patch (パッチのdownload)
# patch -p0 < postfixadmin-arvin.patch (パッチをあてます。)

ついでに、日本語化ファイルもdownloadし配置しておきます。
PostfixAdmin日本語化ファイル
これを、/var/www/html/postfixadmin-2.1.0/languages/ja.langとして置いておきます。

PostfixAdminのスクリプトが動作するよう、パーミッションを適切になおしておきます。

# cd /var/www/html
# chown -R apache:apache postfixadmin-2.1.0
# cd postfixadmin-2.1.0
# chmod 640 *.php *.css
# cd admin/
# chmod 640 *.php .ht*
# cd ../images/
# chmod 640 *.gif *.png
# cd ../languages/
# chmod 640 *.lang
# cd ../templates/
# chmod 640 *.tpl
# cd ../users/
# chmod 640 *.php

また、PostfixAdminを日本語で運用した際にきちんと表示がなされるよう、.htaccessで文字コードを強制的にEUCへ指定しておきます。

{/var/www/html/postfixadmin-2.1.0/.htaccess}
# for PostfixAdmin
php_flag magic_quotes_gpc On
php_value default_charset EUC-JP
php_flag file_uploads On
php_flag mbstring.encoding_translation ON
php_value mbstring.language Japanese
php_value mbstring.internal_encoding EUC-JP
php_value mbstring.http_input auto
php_value mbstring.http_output EUC-JP
php_value mbstring.detect_order auto
php_value mbstring.substitute_character none
php_value output_handler mb_output_handler

日本語ファイルも編集しておきます。

# cd /var/www/html/postfixadmin-2.1.0/language
# cp ja.lang ja.lang.orim
# nkf –euc ja.lang.orim >ja.lang (EUCに変換しておく。)

{ja.langの最初の方にある部分もEUCに指定しておく。}
$PALANG[‘charset’] = ‘euc-jp’; //(EUCに)
//$PALANG[‘charset’] = ‘Shift_JIS’; //(コメントアウトしておく)

また、Welcomeメールが送信された際、EUCだとメールが文字化けしてしまうので、以下を修正しておきます。

$PALANG[‘pSendmail_subject_text’] = ‘(TEST-MAIL) Welcome Mail’;

また、php.iniのMagicQuotesをonにしておきます。(GET/POSTなどができるように?)
なお、今回使用したphpのversionはphp5.2.0です。

{/etc/php5/php.ini}
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On

config.inc.phpを作成し、PostfixAdminが使用するDBなどを設定します。

# cd /var/www/html/postfixadmin-2.1.0
# cp config.inc.php.sample config.inc.php (サンプルからコピーして使用する。)

config.inc.php内にある項目を、以下のように書き換えます。

$CONF[‘database_type’] = ‘pgsql’;
$CONF[‘database_host’] = ‘127.0.0.1’;
$CONF[‘database_user’] = ‘postfixadmin’;
$CONF[‘database_password’] = ‘postfixadmin’;
$CONF[‘database_name’] = ‘postfix’;
$CONF[‘database_prefix’] = ”;

ほか、

$CONF[‘default_language’] = ‘ja’;

としておくと、日本語になります。

だいたいPostfixAdminの設定も終盤にさしかかってきました…が、pgsqlで使用する際、そのままではユーザの権限で実行できないSQLなどがあるため、以下の修正をしておきます。
(GRANTで、postfixadminとpostfixユーザに権限を与えておきます。)

{/var/www/html/postfixadmin-2.1.0/DATABASE_PGSQL.TXTの最後の行}
GRANT SELECT,INSERT,UPDATE,DELETE ON admin,alias,domain,domain_admins,log,mailbox,vacation TO postfixadmin;
GRANT SELECT,INSERT,UPDATE,DELETE ON admin,alias,domain,domain_admins,log,mailbox,vacation TO postfix;

そして、今ほど編集したDATABASE_PGSQL.TXTのSQL文をpgsqlへ発行します。

# su – postgres
$ psql postfix

PostgreSQL の会話型ターミナル、psql 8.1.5 へようこそ

\copyright とタイプすると、配布条件を表示します。
\h とタイプすると、SQL コマンドのヘルプを表示します。
\? とタイプすると、psql コマンドのヘルプを表示します。
\g と打つかセミコロンで閉じると、クエリーを実行します。
\q で終了します。

postfix=# \i /var/www/html/postfixadmin-2.1.0/DATABASE_PGSQL.TXT
:
(SQL文が入力される)
:
postfix=# \q

これでPostfixAdminが動作する環境ができあがってきました。

http://127.0.0.1/postfixadmin-2.1.0/setup.php などにアクセスし、動作しているか確認してください。

(つづく)