メールサーバー · 2 min read · Oct 06, 2025

仮想ドメインとユーザーを使用した完全なメールサーバーソリューション (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - ページ 4

B. 仮想ユーザーとドメインのためのPostfixの設定

メールエクスチェンジャーは仮想ユーザーとドメインにメールを配信しませんが、有効/無効な宛先に基づいて拒否します。したがって、mxサーバーがSQLサーバーに接続して宛先を確認できる必要があります。postconfに情報を入力してください:

# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_extended = yes'
# postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf'
# postconf -e 'virtual_mailbox_limit_override = yes'
# postconf -e 'virtual_maildir_limit_message = "あなたが到達しようとしているユーザーは、クォータを超えています。"'
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'

ここにはいくつかの「注意点」があります。この設定では、仮想ユーザーのメールボックスを/vmailにホストします。メールボックスを別の場所に保存する必要がある場合は、virtual_mailbox_base行を適宜変更してください。

virtual_minimum_uidとvirtual_uid_mapsはユーザーID150を指しています。このユーザーIDは特別に作成された「仮想メール」ユーザーのものです。標準の「mail」グループを使用し、デフォルト(Debian)のgidは8です。ユーザーとディレクトリを次のように作成できます:

# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "仮想メールボックス" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/

次に、NFSクライアントツールをインストールする必要があります:

# apt-get install nfs-common portmap

その後、ディレクトリをNFS共有にマウントする必要があります。簡単なテストを行うには、次のコマンドを実行します:

# mount files-1.internal.example.com:/vmail /vmail

これで、files-1から/vmail共有にアクセスできるようになりました。ファイルを書き込んでみてください(うまくいかないはずです!):

# cd /vmail
# touch tmp

注意: 読み取り専用エラーが表示されるはずです!

すべてが正常に動作していると仮定して、NFSをアンマウントしてください:

# cd /
umount /vmail

次に、次の内容を/etc/fstabに追加してマウントを永続化します:

[...]  
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0

ファイルシステムを最後にもう一度マウントしてください:

# mount /vmail

… これで準備完了です!

C. Postfix MySQL設定

PostfixはMySQLサポートでインストールされましたが、それがすでに私たちのデータベースを使用する方法を知っているわけではありません。データベース内の各タイプのテーブルに対してさまざまなSQLクエリ情報を提供する必要があります。この情報はmain.cfファイルで定義されたMySQLファイルに保存されます。以下のファイルでは、最終行に完全なクエリを含む単一のコメント(#で始まる)が含まれています。最近のバージョンのPostfixは、他のステートメントの代わりにこれを使用できます。新しいバージョンを使用している場合は、他のすべての行をコメントアウトし、クエリステートメントのコメントを解除してください。

/etc/postfix/mysql_virtual_alias_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = alias  
select_field = goto  
where_field = address  
additional_conditions = and active = '1'  
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
/etc/postfix/mysql_virtual_domains_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = domain  
select_field = domain  
where_field = domain  
additional_conditions = and backupmx = '0' and active = '1'  
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = mailbox  
select_field = quota  
where_field = username  
additional_conditions = and active = '1'  
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_mailbox_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = mailbox  
select_field = CONCAT(domain,'/',maildir)  
where_field = username  
additional_conditions = and active = '1'  
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
/etc/postfix/mysql_virtual_transports.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = domain  
select_field = transport  
where_field = domain  
additional_conditions = and active = '1'  
#query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'
Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。