Postfix設定 · 4 min read · Jan 17, 2026

Postfix、Courier、MySQL、SquirrelMailを使用した仮想ユーザーとドメイン (Ubuntu 12.04 LTS) - ページ 2

5 Postfixの設定

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

/etc/mysql/my.cnfに次の行が含まれていることを確認してください:

vi /etc/mysql/my.cnf

| [...] # skip-networkingの代わりに、デフォルトは現在localhostのみにリッスンすることです。 # これはより互換性があり、セキュリティが低下することはありません。 bind-address = 127.0.0.1 [...] |

/etc/mysql/my.cnfを変更する必要があった場合は、今すぐMySQLを再起動してください:

/etc/init.d/mysql restart

実行して

netstat -tap | grep mysql

MySQLが127.0.0.1(localhost.localdomain)でリッスンしていることを確認します:

root@server1:/usr/src# netstat -tap | grep mysql
tcp 0 0 localhost.localdo:mysql : LISTEN 3895/mysqld
root@server1:/usr/src#

さて、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 |

次に、これらのファイルの権限とグループを変更します:

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

次に、/home/vmailというホームディレクトリを持つ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_sasl_authenticated_header = 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_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 = “あなたが到達しようとしているユーザーはクォータを超えています。”‘
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’

その後、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

国名(2文字コード)[AU]: <– あなたの国名を入力してください(例:「DE」)。
州または地域名(フルネーム)[Some-State]: <– あなたの州または地域名を入力してください。
所在地名(例:都市)[]: <– あなたの都市を入力してください。
組織名(例:会社)[Internet Widgits Pty Ltd]: <– あなたの組織名を入力してください(例:会社名)。
組織単位名(例:部門)[]: <– あなたの組織単位名を入力してください(例:「IT部門」)。
一般名(例:あなたの名前)[]: <– システムの完全修飾ドメイン名を入力してください(例:「server1.example.com」)。
メールアドレス[]: <– あなたのメールアドレスを入力してください。

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

chmod o= /etc/postfix/smtpd.key

6 Saslauthdの設定

まず実行します

mkdir -p /var/spool/postfix/var/run/saslauthd

次に、/etc/default/saslauthdを編集します。STARTをyesに設定し、OPTIONS=”-c -m /var/run/saslauthd”の行をOPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”に変更します:

vi /etc/default/saslauthd

| # # saslauthdデーモンの設定 # 詳細については/usr/share/doc/sasl2-bin/README.Debianを参照してください。 # # saslauthdは自動的に起動時に実行されるべきですか?(デフォルト:いいえ) START=yes # このsaslauthdインスタンスの説明。推奨。 #(提案:SASL認証デーモン) DESC="SASL認証デーモン" # このsaslauthdインスタンスの短い名前。強く推奨。 #(提案:saslauthd) NAME="saslauthd" # saslauthdはどの認証メカニズムを使用するべきですか?(デフォルト:pam) # # このDebianパッケージで利用可能なオプション: # getpwent -- getpwent()ライブラリ関数を使用 # kerberos5 -- Kerberos 5を使用 # pam -- PAMを使用 # rimap -- リモートIMAPサーバーを使用 # shadow -- ローカルシャドーパスワードファイルを使用 # sasldb -- ローカルsasldbデータベースファイルを使用 # ldap -- LDAPを使用(設定は/etc/saslauthd.confにあります) # # 一度に1つのオプションのみを使用できます。詳細についてはsaslauthdのマニュアルページを参照してください。 # # 例:MECHANISMS="pam" MECHANISMS="pam" # このメカニズムの追加オプション。(デフォルト:なし) # メカニズム固有のオプションについてはsaslauthdのマニュアルページを参照してください。 MECH_OPTIONS="" # いくつのsaslauthdプロセスを実行するべきですか?(デフォルト:5) # 値が0の場合、各接続のために新しいプロセスをフォークします。 THREADS=5 # その他のオプション(デフォルト:-c -m /var/run/saslauthd) # 注意:-mオプションを指定しないとsaslauthdは実行されません! # # 警告:-dオプションを指定しないでください。 # -dオプションはsaslauthdをデーモンとしてではなく、フォアグラウンドで実行させます。これにより、システムが正しくブートしなくなります。デバッグモードでsaslauthdを実行したい場合は、安全のために手動で実行してください。 # # /usr/share/doc/sasl2-bin/README.DebianにはDebian固有の情報があります。 # saslauthdのマニュアルページおよび'saslauthd -h'の出力には、これらのオプションに関する一般的な情報があります。 # # chroot Postfixユーザーの例:"-c -m /var/spool/postfix/var/run/saslauthd" # 非chroot Postfixユーザーの例:"-c -m /var/run/saslauthd" # # Postfixがchrootで実行されているかどうかを確認するには、/etc/postfix/master.cfを確認してください。 # "smtp inet n - y - - smtpd"または"smtp inet n - - - - smtpd"の行があれば、Postfixはchrootで実行されています。 # "smtp inet n - n - - smtpd"の行があれば、Postfixはchrootで実行されていません。 #OPTIONS="-c -m /var/run/saslauthd" OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r" |

次に、/etc/pam.d/smtpというファイルを作成します。次の2行だけを含める必要があります(正しいデータベースの詳細を入力してください):

vi /etc/pam.d/smtp

| auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 |

次に、/etc/postfix/sasl/smtpd.confというファイルを作成します。次のようになります:

vi /etc/postfix/sasl/smtpd.conf

| pwcheck_method: saslauthd mech_list: plain login allow_plaintext: true auxprop_plugin: sql sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: mail_admin sql_passwd: mail_admin_password sql_database: mail sql_select: select password from users where email = '%u@%r' |

次に、Postfixユーザーをsaslグループに追加します(これにより、Postfixがsaslauthdにアクセスする権限を持つことが保証されます):

adduser postfix sasl

次に、PostfixとSaslauthdを再起動します:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

7 Courierの設定

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

vi /etc/courier/authdaemonrc

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

次に、/etc/courier/authmysqlrcのバックアップを作成し、古いファイルを空にします:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc

次に、/etc/courier/authmysqlrcを開き、次の行を追加します:

vi /etc/courier/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 |

インストール中に、IMAP-SSLおよびPOP3-SSLのSSL証明書がホスト名localhostで作成されます。これを正しいホスト名(このチュートリアルではserver1.example.com)に変更するには、証明書を削除します…

cd /etc/courier
rm -f /etc/courier/imapd.pem
rm -f /etc/courier/pop3d.pem

… 次に、次の2つのファイルを修正します。CN=localhostをCN=server1.example.comに置き換えます(必要に応じて他の値も変更できます):

vi /etc/courier/imapd.cnf

| [...] CN=server1.example.com [...] |

vi /etc/courier/pop3d.cnf 

| [...] CN=server1.example.com [...] |

次に、証明書を再作成します… mkimapdcert
mkpop3dcert

… そしてCourierを再起動します:

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

次のコマンドを実行することで、POP3サーバーが正しく動作しているかどうかを確認できます。

telnet localhost pop3

+OK Hello there.と返されるはずです。(quitと入力してLinuxシェルに戻ります。)

root@server1:/etc/courier# telnet localhost pop3
Trying 127.0.0.1…
Connected to localhost.localdomain.
Escape character is ‘^]’.
+OK Hello there.
<– quit
+OK Better luck next time.
Connection closed by foreign host.
root@server1:/etc/courier#

8 /etc/aliasesの修正

今、/etc/aliasesを開く必要があります。postmasterがrootを指し、rootがあなた自身のユーザー名またはメールアドレスを指すことを確認してください。例えば、次のようにします:

vi /etc/aliases

| [...] postmaster: root root: [email protected] [...] |

または次のようにします(administratorがあなた自身のユーザー名である場合):

| [...] postmaster: root root: administrator [...] |

/etc/aliasesを変更するたびに、次のコマンドを実行する必要があります:

newaliases

その後、Postfixを再起動します:

/etc/init.d/postfix restart
Share: X/Twitter LinkedIn

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

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