メールサーバー · 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.cfuser = 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.cfuser = 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.cfuser = 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.cfuser = 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.cfuser = 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'新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。