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 の設定」の記事を参照してください。
著者
かつて日本を代表したスーパーエンジニア (自称)
ハードウェア、電気設備、ガーデニング関係の記事を担当。