Postfix 設定 · 4 min read · Feb 02, 2026

Postfix、Courier、および MySQL を使用した仮想ユーザーとドメイン (Fedora Core 5) - ページ 2

6 MySQL データベースの作成

メール用のデータベースを作成します:

mysqladmin -u root -p create mail

次に、MySQL シェルに移動します:

mysql -u root -p

MySQL シェルで、メールデータベースに対して SELECT、INSERT、UPDATE、DELETE 権限を持つユーザー mail_admin を作成します(自分のパスワードに置き換えてください)。このユーザーは Postfix と Courier がメールデータベースに接続するために使用されます:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

まだ MySQL シェルの中で、Postfix と Courier が必要とするテーブルを作成します:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

ご覧の通り、quit; コマンドで MySQL シェルを終了し、Linux シェルに戻りました。

domains テーブルは、Postfix がメールを受信すべき各仮想ドメインを保存します(例: example.com)。

domain
example.com

forwardings テーブルは、1 つのメールアドレスを別のメールアドレスにエイリアスするためのものです。たとえば、[email protected] から [email protected] へのメールを転送します。

sourcedestination
[email protected][email protected]

users テーブルは、すべての仮想ユーザー(すなわちメールアドレス、メールアドレスとユーザー名は同じです)とパスワード(暗号化された形式!)および各メールボックスのクォータ値を保存します(この例ではデフォルト値は 10485760 バイト、つまり 10MB です)。

emailpasswordquota
[email protected]No9.E4skNvGa. (暗号化された形式の「秘密」)10485760

transport テーブルはオプションで、上級ユーザー向けです。特定のユーザー、全ドメイン、またはすべてのメールを別のサーバーに転送することを可能にします。たとえば、

domaintransport
example.comsmtp:[1.2.3.4]

は、example.com のすべてのメールを smtp プロトコルを介して IP アドレス 1.2.3.4 のサーバーに転送します(角括弧 [] は「MX DNS レコードのルックアップを行わない」という意味です(IP アドレスの場合は意味があります…)。完全修飾ドメイン名 (FQDN) を使用する場合は、角括弧を使用しません)。

7 Postfix の設定

次に、Postfix にデータベース内のすべての情報を見つける場所を教える必要があります。そのためには、6 つのテキストファイルを作成する必要があります。Postfix に localhost の代わりに IP アドレス 127.0.0.1 に接続するように指示していることに気付くでしょう。これは、Postfix が chroot ジェイル内で実行されており、localhost を使用するように指示した場合に接続しようとする MySQL ソケットにアクセスできないためです。127.0.0.1 を使用すると、Postfix は TCP ネットワーキングを使用して MySQL に接続し、これは chroot ジェイル内でも問題ありません(代替手段は、MySQL ソケットを chroot ジェイルに移動することですが、他の問題を引き起こします)。

では、6 つのテキストファイルを作成しましょう。

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

(これらのファイルを https://www.howtoforge.com/virtual_postfix_mysql_quota_courier のファイルと比較すると、形式が異なることに気付くでしょう。これは、Postfix 2.1 から 2.2 への構文の変更によるものです。このチュートリアルでは Postfix 2.2.8 を使用しており、他のものでは 2.1.5 です。)

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

次に、vmail というユーザーとグループを作成し、ホームディレクトリを /home/vmail に設定します。ここにすべてのメールボックスが保存されます。

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

次に、Postfix の設定を行います。必ず server1.example.com を有効な FQDN に置き換えてください。さもないと、Postfix が正しく動作しない可能性があります!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_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 = "The user you are trying to reach is over quota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'

その後、TLS に必要な SSL 証明書を作成します:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
*<-- 国名を入力してください (例: "DE").   
<-- 州または県名を入力してください。   
<-- 市名を入力してください。   
<-- 組織名を入力してください (例: 会社名)。   
<-- 組織単位名を入力してください (例: "IT 部門").   
<-- システムの完全修飾ドメイン名を入力してください (例: "server1.example.com").   
<-- メールアドレスを入力してください。 *

次に、smtpd.key の権限を変更します:

chmod o= /etc/postfix/smtpd.key

8 Saslauthd の設定

/usr/lib/sasl2/smtpd.conf を編集します。次のようになります:

vi /usr/lib/sasl2/smtpd.conf

| pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/spool/authdaemon/socket |

次に、Sendmail をオフにし、Postfix、saslauthd、および courier-authlib を起動します:

chmod 755 /var/spool/authdaemon  
chkconfig --levels 235 courier-authlib on  
/etc/init.d/courier-authlib start
chkconfig --levels 235 sendmail off  
chkconfig --levels 235 postfix on  
chkconfig --levels 235 saslauthd on  
/etc/init.d/sendmail stop  
/etc/init.d/postfix start  
/etc/init.d/saslauthd start

9 Courier の設定

次に、Courier に MySQL データベースに対して認証するように指示する必要があります。まず、/etc/authlib/authdaemonrc を編集し、authmodulelist の値を次のように変更します:

vi /etc/authlib/authdaemonrc

| [...] authmodulelist="authmysql" [...] |

次に、/etc/authlib/authmysqlrc を編集します。次のように正確に設定します(再度、正しいデータベースの詳細を入力してください):

vi /etc/authlib/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

次に、Courier を再起動します:

chkconfig --levels 235 courier-imap on  
/etc/init.d/courier-authlib restart  
/etc/init.d/courier-imap restart
telnet localhost pop3

を実行すると、POP3 サーバーが正しく動作しているかどうかを確認できます。+OK Hello there . と返されるはずです(quit と入力して Linux シェルに戻ります。)

Share: X/Twitter LinkedIn

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

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