PostfixとDovecotでバーチャルメールボックスの設定をする


今回は下記バージョンでの設定手順になります。

* Postfix: 2.9.6
* Dovecot: 2.0.19

## 1. Postfixをインストール

yumなりaptなりportsなりソースからmakeするなり環境に合わせてインストールしてください。

## 2. Postfixで外部とメールの送受信を出来るようにする

1. `/etc/postfix/main.cf`でPostfixの設定を変更

	変更するのは下記のとおり

	1. myhostnameパラメータ
		サーバのホスト名(FQDN)を指定する。
		
		````/etc/postfix/main.cf
		myhostname = myhost.example.com
		````
	
	2. mydomainパラメータ
		メールの送受信を行うドメイン名を指定する。

		``` /etc/postfix/main.cf
		mydomain = example.com
		
		```

	3. inet_interfaces
		メールを受信するネットワークインターフェースを指定する。
		デフォルトは`all`(全ネットワークインターフェースからのメールを受け付ける。)
		ローカルからのメールしか受け付けたくないなどといった場合に設定する

		``` /etc/postfix/main.cf
		inet_interfaces = all
		```

	4. inet_protocols
		通信に使用するIPプロトコルを指定する。

		``` /etc/postfix/main.cf
		inet_protocols = all
		```

	5. myorigin
		メールの送信元アドレスに追加するドメインを指定する。

		```/etc/postfix/main.cf
		myorigin = $myhostname  # -> user@myhost.example.com
		myorigin = $mydomain    # -> user@example.com
		```

	6. mydestination
		ローカルに配信するドメインを指定する。
		カンマ or 半角スペース区切りで複数指定可能。

		``` /etc/postfix/main.cf
		mydestination = $myhostname, localhost.$mydomain, localhost  # 自サーバに割り当てられたドメインのみ、ローカルに配信する
		```		

	7. mynetworks_style
		mynetworksパラメータの生成に使用されるパラメータ。 		mynetworksパラメータでは、信頼できるネットワーク、つまり他のメールサーバへのメール転送を受け付けるサーバを指定する。
		
		``` /etc/postfix/main.cf
		mynetworks_style = host  # 自サーバのみ。他のサーバからのメール転送は受け付けない
		```

	8. relayhost
		
		~~外部からのメールを受け付けるドメインを指定する。~~
		~~デフォルトは空なので外部のメールはすべて受け付ける。~~
		
		外部へメールを転送するときに利用するメールサーバを指定する。
		プロバイダのSMTPサーバなどを使用する場合は、こちらで指定する。
		インターネットへ直接配送する場合は空でいい。（デフォルト）
		
		``` /etc/postfix/main.cf
		relayhost =  # インターネットへ直接配送するので空のまま
		```

	9. home_mailbox

		受信したメールの保存形式と保存先を指定する。
		末尾に'/'を付けるとMaildir形式で保存されるようになり、メール1通に付き1ファイルとなる。
		逆に、'/'をつけないと、1ユーザーにつき1ファイルとなり、今までに受信したメール全部が1つのファイルとして保存されるので、パフォーマンスなどいろいろと残念な感じになります。

		``` /etc/postfix/main.cf
		home_mailbox = Maildir/
		```	


2. 設定を反映させるためにpostfixのサービスを(再)起動

	各OSに応じて`service`,`kill`, `systemctl`, `/etc/init.d/postfix reload`など使って再起動してください。

3. ファイヤーウォールの設定

	TCP 25番ポートを空けといてください。


## 3. Dovecotをインストールする。

yumなりaptなりportsなりソースからmakeするなり環境に合わせてインストールしてください。
POP, IMAPを外部から使いたい場合はそれなりに設定をお願いします。
今回の解説対象外とします。

## 4. バーチャルメールボックスの設定

1. バーチャルメールボックス用のOSユーザーとOSグループを作成する
	受信したメールのOS上のオーナーとなるユーザーを作成する。

	``` console
	# groupadd -g 10000 mailuser
	# useradd -u 10000 -g mailuser mailuser
	```

2. メールの保存先ディレクトリを作成

	今回は`/var/spool/virtual`ディレクトリにメールを保存するようにする。
	
	``` console
	# mkdir /var/spool/virtual
	# chown -R mailuser:mailuser /var/spool/virtual
	```

3. postfixの設定変更

	下記のように設定を変更して、メールの送受信に使う **仮想的なユーザ** (*OSのユーザーではない!!*)を作成する。

	``` /etc/postfix/main.cf
	# 仮想的なユーザーが所属するドメイン。mydestinationと同様にカンマor半角スペース区切りで複数指定可能。
	virtual_mailbox_domains = example1.com, example2.com
	# メールの保存先
	virtual_mailbox_base = /var/spool/virtual
	# 仮想的なユーザーとメールの保存先・ディレクトリがマッピングhash形式のファイル
	virtual_mailbox_maps = hash:/etc/postfix/vmailbox
	# 保存するメールのOS上のオーナーとグループを指定
	virtual_uid_maps = static:10000
	virtual_gid_maps = static:10000
	```

4. Postfix側で仮想ユーザーの作成

	下記仮想ユーザーを作成したい場合、
	* info@example1.com
	* support@example1.com
	* testuser@example2.com
	* info@exaple2.com

	下記のようにテキストファイルを作成して

	``` /etc/postfix/vmailbox
	info@examle1.com     example1.com/info/Maildir/
	support@examle1.com  example1.com/support/Maildir/
	testuser@examle2.com example2.com/testuser/Maildir/
	info@examle2.com     example2.com/info/Maildir/
	```

	下記コマンドでハッシュファイルに変換

	``` console
	# postmap /etc/postfix/vmailbox
	```

	これで仮想ユーザーへのメールがローカルに転送されるようになる。

5. Dovecot側で仮想ユーザーの設定

	4.で設定した仮想ユーザー宛のメールを、ローカルからPOP3でメールが受信できるようにする。
	そのためにはPostfix上ででっち上げた仮想ユーザーの情報をDovecotにも設定する必要がある。

	1. 仮想ユーザーの情報が記載された設定ファイルを作成

		``` /etc/dovecot/conf.d/10-auth.conf
		auth_mechanisms = cram-md5 plain
		!include auth-passwdfile.conf.ext
		!include auth-static.conf.ext
		```
		``` /etc/dovecot/conf.d/auth-passwdfile.conf.ext
		passdb {
			driver = passwd-file
			args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
		}
		userdb {
			driver = passwd-file
			args = username_format=%u /etc/dovecot/passwd
		}
		```
		``` /etc/dovecot/conf.d/auth-static.conf.ext
		userdb {
			driver = static
			args = uid=10000 gid=10000 home=/var/spool/virtual/%d/%n
		}
		```

	2. ファイルを作成したらDovecotを再起動

	3. 仮想ユーザーに対するパスワードを設定する
	
		1. 下記コマンドを実行して、/etc/dovecot/passwdに書き込むパスワードのハッシュ値を取得する

			``` console
			doveadm pw
			Enter new password:
			Retype new password:
			{CRAM-MD5}913331d8782236a8ecba7764a63aa27b26437fd40ca878d887f11d81245c2c6b
			```
		
		2. /etc/dovecot/passwdにユーザーとパスワードを書き込み

			``` /etc/dovecot/passwd
			info@example1.com:{CRAM-MD5}913331d8782236a8ecba7764a63aa27b26437fd40ca878d887f11d81245c2c6b
			```


## 参考資料
http://www.postfix.org/
http://d.hatena.ne.jp/heihoo/20101208/p1
http://www.unix-power.net/linux/centos_postfix_virtual.html
http://dovecot.org/


### 補足

メールを1通も受信していない状態でPOP3でメールを受信しようとすると、`Internal error occurred.`などとエラーとともに通信が切断されます。
サーバのログを見ると、下記のようなログが出力されています。

> Error: user info@example1.com: Initialization failed: Namespace '':　Mail storage autodetection failed with

単純にメールを保存するディレクトリがないだけなので、何か適当なメールを送ってから、もう一度メールを受信してください。