前の話を先に読んでください
この記事は「Linuxでメールサーバーを構築する」シリーズの第7弾です。
前の話ではDovecotとPostgreSQLを連携させてユーザー認証を設定する方法を扱いました。
まだ確認していない場合は、先にお読みになることをおすすめします。
👉 前の話: Dovecotのauth-sql.conf.ext設定とパスワードハッシュ


Postfix設定ファイルの構造

Postfixはメール送信を担当するSMTPサーバーで、さまざまな設定ファイルを使用して動作を調整します。
この記事ではPostfixの設定ファイル構造と主要な役割を説明します。

Postfix Configuration Diagram

Postfix主要設定ファイル

ファイル名 役割
/etc/postfix/main.cf Postfixの主要設定ファイル(メール送信、ネットワーク設定など)
/etc/postfix/master.cf Postfixサービス管理(SMTP、LMTP、SASL認証など)
/etc/postfix/virtual 仮想ユーザー(ドメイン)マッピング
/etc/postfix/aliases システムユーザーのメールエイリアス管理
/etc/postfix/transport 特定のドメイン/アドレスに対するメール送信経路指定
/etc/postfix/relay_domains リレー許可ドメイン設定
/etc/postfix/sasl_passwd SMTPリレーサーバー認証情報保存
/etc/postfix/sql/*.cf データベース連携設定ファイル(PostgreSQL)

Postfix主要設定項目 (main.cf)

Postfixの動作を定義する主要設定を見ていきましょう。 ファイルの場所は/etc/postfix/main.cfです。

1️⃣ 基本的なメールサーバー設定

myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
  • myhostname → メールサーバーのホスト名
  • mydomain → 基本ドメイン設定
  • inet_interfaces → すべてのネットワークインターフェースでメールを受信するように設定
  • inet_protocols → IPv4のみ使用(IPv6無効化可能)

2️⃣ メールリレー制限

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
  • permit_mynetworks → 信頼できるネットワークからのリレーを許可
  • permit_sasl_authenticated → SASL認証されたユーザーのみメールリレー可能
  • defer_unauth_destination → 認証されていない外部リレーをブロック

3️⃣ 仮想ユーザーとデータベース連携

PostfixがPostgreSQLを使用して仮想ドメインとメールボックスを管理するには、以下の設定を追加する必要があります。

virtual_mailbox_domains = pgsql:/etc/postfix/sql/virtual_domains.cf
virtual_mailbox_maps = pgsql:/etc/postfix/sql/virtual_mailboxes.cf
virtual_alias_maps = pgsql:/etc/postfix/sql/virtual_aliases.cf

🔹 説明
- virtual_mailbox_domains → 受信可能な仮想ドメインをデータベースから取得
- virtual_mailbox_maps → ユーザーメールボックス情報をデータベースから取得
- virtual_alias_maps → メールエイリアスをデータベースから取得

💡 MySQLを使用する場合
pgsql:の代わりにmysql:を使用します。

💡 大規模トラフィック環境ではproxy:pgsql:を使用することが性能面で有利ですが、一般的な環境ではproxy:なしでも十分に動作します。


Postfixがデータベースを使用するように設定する

PostfixがPostgreSQLを使用するには関連パッケージをインストールする必要があります。

sudo apt update
sudo apt install postfix postfix-pgsql
  • postfix → 基本的なPostfix SMTPサーバー
  • postfix-pgsql → PostfixがPostgreSQLと連携できるようにするパッケージ

インストールが完了したら、PostfixがPostgreSQLからユーザー情報を取得できるように設定ファイルを作成する必要があります。


Postfixデータベース連携設定 (virtual_*.cfファイル作成)

Postfixはvirtual_domains.cfvirtual_mailboxes.cfvirtual_aliases.cfファイルを使用してデータベースから情報を取得します。
これらのファイルは直接作成する必要があり、以下の内容を参考にして作成すれば良いです。

1️⃣ /etc/postfix/sql/virtual_domains.cf (ドメイン取得設定)

user = mailadmin
password = yourpassword
dbname = mail
hosts = 127.0.0.1
query = SELECT domain_name FROM mail_domain WHERE domain_name='%s' AND active=true

説明

user → PostgreSQLユーザーアカウント(postfixがDBにアクセスできるように、DBにユーザーを事前に作成してください)
password → PostgreSQLアカウントパスワード(事前に作成したDBユーザーmailadminのDBアカウントパスワード)
dbname → データベース名
hosts → データベースサーバーアドレス(ローカルサーバー使用)
query → mail_domainテーブルから受信可能ドメインを取得

2️⃣ /etc/postfix/sql/virtual_mailboxes.cf (メールボックス取得設定)

user = mailadmin
password = yourpassword
dbname = mail
hosts = 127.0.0.1
query = SELECT home_directory FROM mail_users WHERE email='%s'

説明

query → ユーザーのメール保存パスを取得(mail_usersテーブルでhome_directoryフィールドを返します)
Postfixがユーザーのメールを正しいディレクトリに保存するためのパスを返します。

3️⃣ /etc/postfix/sql/virtual_aliases.cf (メールエイリアス取得設定)

user = mailadmin
password = yourpassword
dbname = mail
hosts = 127.0.0.1
query = SELECT destination_email FROM mail_alias WHERE source_email='%s'

説明

query → エイリアスがある場合、実際にメールが転送される対象メールを取得
mail_aliasテーブルを参照してエイリアスが登録されているメールを見つけて返します。


セキュリティ設定

これらの設定ファイルはパスワードが含まれているため、権限を制限する必要があります。

sudo chmod 640 /etc/postfix/sql/virtual_*.cf
sudo chown root:postfix /etc/postfix/sql/virtual_*.cf

🔒 セキュリティ注意事項:

パスワードが含まれている設定ファイルのため、他のユーザーが読めないように権限を制限する必要があります。 chmod 640を適用してPostfixプロセス(postfixグループ)のみアクセス可能に設定します。


Postfix設定を再ロード

設定が完了したらPostfixを再ロードして変更を反映する必要があります。

sudo systemctl restart postfix

まとめと次のステップ

Postfix設定ファイルの構造および役割の説明
Postfixのmain.cfに主要設定を追加
PostfixがPostgreSQLと連携するようにvirtual_*.cfファイルを設定

次回の話ではPostfixとDovecotを連携させてSMTP認証を構成する方法を扱う予定です。
これを通じてメールサーバーが送受信機能を完全に備える設定を行うつもりです。

👉 次回: PostfixとDovecotの連携およびSMTP認証(近日公開!)