CentOS7でPostfix+ Dovecot +MariaDB(MySQL)でバーチャルメールボックスを利用してメールを送受信する (1) - Postfix の設定 - Postfix

事前準備

Postfix のインストール

Postfix をインストールします。CentOS 7.2では最小構成の場合でも、デフォルトでインストールされている場合があります。(Amazon EC2, Microsft Azure など)
インストール手順の詳細は「CentOS7にPostfixをインストールする (MTA - SMTPサーバーのインストール)」を参照してください。

Dovecot のインストール

Dovecot をインストールします。
インストール手順の詳細は「CentOS 7にDovecotをインストールする (POP/IMAPサーバーのインストール)」を参照してください。

Dovecot MySQL (MariaDB) ドライバのインストール

yum -y install dovecot-mysql
コマンドを実行して、mySQLのドライバをインストールします。

MariaDB のインストール

MariaDBをインストールします。
インストール手順の詳細は「CentOS7 に MariaDB をインストールする」を参照してください。

MariaDB の初期設定

MariaDBの初期設定をします。
mysql_secure_installation
コマンドを実行します。詳細は「MariaDB の初期設定をする (mysql_secure_installation コマンドによる初期設定)」を参照してください。

データベースとユーザーの作成

mysql -u root -p
コマンドを実行してSQLコマンドプロンプトを表示します。

データベースの作成

メールサーバーのユーザー情報を格納するためのデータベースを作成します。今回は"mail"データベースを作成します。
CREATE DATABASE mail;
SQLコマンドを実行します。

データベースユーザー作成

PostfixやDovecotからデータベースにアクセスするためのデータベースユーザーを作成します。下記のSQLコマンドを実行します。
CREATE USER 'mail_admin'@'%' identified by '(パスワード)';

注意:パスワードについて

データベースユーザーのパスワードにはアルファベットと数字のみにしてください。パスワードに記号を含めると、うまく動作しないことがります。

権限付与

作成したデータベースのユーザーに権限を付与します。SQLプロンプトで下記のSQLを実行します。
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'%';

データベースのテーブル作成

続いてデータベースのテーブルを作成します。
mysql -u root -p
コマンドを実行してSQLコマンドプロンプトを表示します。

DBの選択

先ほど作成した、mail データベース内にテーブルを作成するため、mail データベースを選択します。SQL コマンドプロンプトで下記のコマンドを実行してmail データベースを選択します。
USE mail;

バーチャルドメインテーブルの作成

サーバーで受信するドメインを保存するテーブルを作成します。下記のSQLを実行します。
CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );

メールフォワーディングテーブルの作成

CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );

ユーザーテーブルの作成

メールユーザーの情報を格納するテーブルを作成します。
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(80) NOT NULL, PRIMARY KEY (email) );

トランスポートテーブルの作成

CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );

以上でテーブルの作成は完了です。

Postfixの設定

inet_interfaceの設定:接続可能なインターフェイスの設定

メールサーバーに接続できるアドレスを設定します。今回は外部から接続してメールを送信できるメールサーバーを構築するため、
/etc/postfix/main.cf ファイルの
#inet_interface = all
#inet_interface = $myhostname
#inet_interface = $myhostname, localhost
inet_interface = localhost
と記述されている部分を

inet_interface = all #有効にします
#inet_interface = $myhostname
#inet_interface = $myhostname, localhost
#inet_interface = localhost #無効にします
と変更します。

mydestinationの確認

mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
ドメイン宛のメールはバーチャルメールボックスで受け取るため、mydestinationが上記になっていることを確認します。

または
mydestination = localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
mydestination = localhost, localhost.localdomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mail.$mydomain, www.$mydomain, ftp.$mydomain
とします。

バーチャルメールボックスユーザーの作成

main.cfのvirtual_uid_maps(後述)で指定するuidを持つユーザーを作成します。以下のコマンドを実行します。
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -s /bin/false -d /home/vmail -m

バーチャルメールボックスの設定

/etc/postfix/main.cf ファイルに以下を追記します。
 virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
 virtual_mailbox_base = /home/vmail
 virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
 virtual_minimum_uid=100
 virtual_uid_maps=static:5000
 virtual_gid_maps=static:5000
 virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf

SMTP Auth の設定

SMTP-Auth を利用する場合、/etc/postfix/main.cf に以下を追記します。
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
MariaDBと連動させるため、sasl認証は、Dovecotのものを利用します。"smtpd_sasl_type = dovecot"により、Dovecot SASLによるSMTP Authを利用します。
"smtpd_sasl_path = private/auth" はDovecot SASL の認証ソケットファイル /var/spool/postfix/ からの相対パスで記述します。この記述は、Dovecotの設定ファイル "/etc/dovecot/conf.d/10-master.conf" の unix_listener のパスと一致させる必要があります。("smtpd_sasl_path = private/auth" と記述した場合は、10-master.confファイルで、"unix_listener /var/spool/postfix/private/auth {......}" と記述します。

サブミッションポートを有効にする場合

サブミッションポートを有効にする場合は、/etc/postfix/master.cf ファイルを編集します。
変更前
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
の部分を
変更後 (Postfix 2.10 以降)
submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
と修正します。もしくは、
変更後 (Postfix 2.10 以前)
submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
と変更します。

プロキシファイルの作成

/etc/postfix ディレクトリにmariaDbとのプロキシファイルを作成します。

/etc/postfix/mysql-virtual_domains.cf

user = mail_admin
password = (mail_admin ユーザーのMariaDBのパスワード)
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_forwardings.cf

user = mail_admin
password = (mail_admin ユーザーのMariaDBのパスワード)
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_mailboxes.cf

user = mail_admin
password = (mail_admin ユーザーのMariaDBのパスワード)
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

/etc/postfix/mysql-virtual_email2email.cf

user = mail_admin
password = (mail_admin ユーザーのMariaDBのパスワード)
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

ディレクトリ作成

バーチャルメールボックスのドメインのディレクトリを作成します。(ディレクトリを作成しない場合でも、PostfixやDovecotでディレクトリを作成してくれる場合もあります。)

chmod 755 /home/vmail -R
cd /home/vmail
mkdir ipentec.net

DNS設定

MXレコードを設定します。

ルーターの設定

ルーターでポートが解放されていない場合、外部からメールサーバーに通信できません。ルーターのポートを開放します。ポート25、110、サブミッションポートを利用する場合はポート587を開きます。

セキュリティルールの設定

Amazon EC2やMicrosoft Azureの場合は、ルーターがない代わりに、セキュリティールールでポート25,110,サブミッションポートを利用する場合はポート587を開放します。

ファイアウォールの設定

サービスの設定ができていても、ファイアウォールでメールサーバーのポートが開いていない場合、通信ができません。ファイアウォールを設定して、メールサーバーで利用するポート(25,110,587)を開放します。

続き(dovecotの設定)

続いてDovecotの設定をします。「CentOS7 で Postfix + Dovecot + MariaDBでバーチャルメールボックスを利用してメールを送受信する (2) - dovecot の設定」の記事を参照してください。

著者
かつて日本を代表したスーパーエンジニア (自称)
ハードウェア、電気設備、ガーデニング関係の記事を担当。
掲載日: 2016-09-03
iPentec all rights reserverd.