CentOS 7 の Postfix で独自ドメインのメールを送受信できるようにする必要最低限の設定についての解説。
巷の解説に多い過剰で不必要な設定を排除し、本当に必要な設定項目は何なのかを理解、把握する。
Postfix とは

Postfix は SMTP サーバーであり、いわゆるメール送信サーバーに当たる。MTA (Mail Transfer Agent) であり、 MTA 間のメール受信も行う。
他の MTA に Debian で採用されている Exim などがある。古くは sendmail や qmail があるが、いずれも近年の更新はない。
CentOS 7 のデフォルトでは、標準リポジトリの Postfix 2.10.1 が既にインストールされている。
GhettoForge Plus リポジトリの postfix3 パッケージを利用すると 3.7.2 がインストールできる。
RHEL 8 で Postfix 3.3 が採用され、最新の RHEL 8 の BaseOS リポジトリおよび RHEL 9 の AppStream リポジトリでは Postfix 3.5 のパッケージが提供されている。
SecuritySpace.com の Mail (MX) Server Survey (September 1st, 2022) の調査によると、使用ソフトウェアを識別可能な70万台の MX サーバーの内、 Exim の56%に次いで Postfix は37%のシェアを占める。
リファレンス
- Postfix Basic Configuration - 公式の基本設定のリファレンス。
- Postfix 基本設定 - 上記の日本語訳。ただし翻訳元のバージョンは 2.3 で、CentOS 7 の Postfix は 2.10 なのでバージョン違いに注意。
- Postfix Configuration Parameters - 公式の設定パラメーターのリファレンス。
- Postfix 設定パラメータ - 前述の基本設定と同様。
DNS の設定
example.jp. IN MX 10 mail.example.jp.
DNS の MX レコードに mail.example.jp
を登録する。
firewalld の設定
firewall-cmd --list-services && \
firewall-cmd --add-service=smtp --permanent && \
firewall-cmd --reload && \
firewall-cmd --list-services
SMTP では25番ポートを利用して通信を行うため解放する必要がある。
firewall-cmd
コマンドの --add-service
オプションでサービス名に smtp
を指定すると25番ポートを開放できる。 1 2
Postfix の基本設定
以下のコマンドは CentOS 7 において、メール送信サーバー mail.example.jp
およびメールアドレス test@example.jp
が設定されるために必要な最低限の内容。
記事によっては余計なパラメーターを指定をしていることが多いが、デフォルト値を再指定していたり必要のない項目を設定している場合がある。
DOMAIN=example.jp && \
postconf | egrep "^(home_mailbox|inet_interfaces|my(destination|domain|hostname|origin)) " && \
sed -i.org \
-e "/#myhostname = virtual.domain.tld/a myhostname = mail.${DOMAIN}" \
-e '/#myorigin = $mydomain/ s/^#//' \
-e '/^inet_interfaces/ s/^/#/' \
-e '/^mydestination/ s/^/#/' \
-e '/#mydestination .* $mydomain$/ s/^#//' \
-e '|#home_mailbox = Maildir/$| s|^#||' \
/etc/postfix/main.cf && \
cat << _EOF_ >> /etc/postfix/main.cf
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
_EOF_
postfix check && \
postfix -vv && \
postfix reload && \
postconf | egrep "^(home_mailbox|inet_interfaces|my(destination|domain|hostname|origin)) "
postconf
コマンドは、設定パラメーターの現在値を出力できる。 3
postfix check
コマンドは、不正なディレクトリ/ファイルの所有権やパーミションを警告し、見つからないディレクトリを作成する。ほぼ必ず文法チェックと紹介されているが誤り。 4
postfix reload
コマンドは、設定ファイルを再び読み込む。動作中のプロセスは早期の適切な時に停止が許される。 5
配信中のメールの暗号化 – Google 透明性レポート
送受信時のメールの暗号化 - Gmail ヘルプ
Gmail のメールが認証されているかどうかの確認 - パソコン - Gmail ヘルプ
設定パラメーター
myhostname
myhostname = mail.example.jp
myhostname
はこのメールシステムのホスト名。6
SMTP サーバーの FQDN を指定する。 7
デフォルトでは gethostname()
から得た FQDN を使うため、Web サーバーと兼用する場合など OS のホスト名(hostname
コマンドで確認できる)と一致しない際は設定が必要。 8
いわゆる「メール送信サーバー」のアドレスになる。
mydomain
mydomain
はこのメールシステムのドメイン名。デフォルトでは未指定で、 $myhostname
から最初の要素(最初のピリオドまで)を引いたものを使う。 9 10
例えば myhostname = mail.example.jp
の場合、mydomain
が未指定であれば $mydomain
は $myhostname
から mail.
を引いた example.jp
になる。
従って、$myhostname
にサブドメインを適切に指定している場合は mydomain
の設定は不要。
myorigin
myorigin = $mydomain
myorigin
はローカルで投函されたメールがどのドメインから来るように見えるかを指定する。 11 12
サーバー上から直接メールをローカル配信した場合に自動的に補われるドメイン名を指定する。 13
送信者と受信者アドレスの一貫性を保つために、修飾されていない受信者アドレスに付けられるドメイン名も指定する。 14
デフォルト値は $myhostname
になっている。
いわゆるメールアドレスの @
の後ろの文字列になる。
前述の例では、デフォルト値が $myhostname
なのでメールアドレスは @mail.example.jp
になるが、 $mydomain
を指定することで @example.jp
にすることができる。
inet_interfaces
inet_interfaces = all
inet_interfaces
はメールを受け取るネットワークインターフェイスアドレス。 15
リモートからの SMTP 接続要求に応答するネットワークインターフェースのアドレスを指定する。 16
Postfix のデフォルト値は all
だが CentOS のデフォルト設定値は localhost
になっているため、すべてのネットワークインターフェースでメールを受信するには CentOS のデフォルト設定をコメントアウトして、デフォルト値の all
を有効にする必要がある。 17 18 19
このパラメータを変更したら Postfix を stop して start する必要がある。 20
検証した限りでは postfix reload
で反映される。
mydestination
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydestination
は $local_transport
メール配送トランスポートを介して配信されるドメインの一覧。 21
このマシンが他のマシンに転送せずにローカルに配送するドメインを指定する。 22
この SMTP サーバーが受信するドメイン名。 23
$local_recipient_maps
にリストアップされていない受信者宛のメールを拒否する。 24 25
デフォルト値は $myhostname, localhost.$mydomain, localhost
になっており、メール配送ループを避けるために $mydomain
を含める必要がある。 26 27 28
home_mailbox
home_mailbox = Maildir/
home_mailbox
はメールボックスファイルの local(8) ユーザーのホームディレクトリからの相対パス名。 29
デフォルト値は空で、mailbox 形式で /var/spool/mail/<username>
がデフォルトメールボックスファイルになる。
なお、少なくとも CentOS 7 では /var/mail
は /var/spool/mail
にシンボリックリンクが張られている。
Maildir/
を指定すると qmail-style delivery になり、デフォルトと異なりメールごとにファイルが生成される。
qmail-style delivery の方が新しい方式であり、管理上こちらに変更するのが望ましい。
smtp_tls_CAfile
smtp_tls_CAfile
= /etc/pki/tls/cert.pem
smtp_tls_security_level
smtp_tls_security_level
= may
smtp_tls_loglevel
smtp_tls_loglevel
= 1
メールアドレスの作成
useradd test --shell /sbin/nologin --password $(openssl passwd -1 P@ssw0rd) --comment 'mail user'
useradd
コマンドでユーザーを作成すればメールが受信可能になる。すなわちメールアドレスが作成される。
前述の例では test@example.jp
が受信可能となる。
--shell
または -s
オプションで /sbin/nologin
シェルを指定するとユーザーはシェルにログインできなくなる。 30
--password
または -p
オプションで、暗号化されたパスワードを指定すると対話式でパスワードを指定する必要がなくなる。プロセスや履歴で参照できるので注意。 31 32
/etc/skel/Maildir/{new,cur,tmp}
ディレクトリの作成を指示する記事が散見されるが、メール受信時にユーザーディレクトリ配下に自動的に作成されるので一切不要。
SMTP サーバー接続確認
curl --verbose telnet://mail.example.jp:25
QUIT
telnet
コマンドは標準インストールされていないので、代替として curl
コマンドを使用する。 33 34 35
--verbose
または -v
オプションを指定すると、行頭に *
が付いた補足情報が出力される。 36
メール送信テスト
echo "test mail" | sendmail -bv test@example.jp && tailf /var/log/maillog
cat /home/test/Maildir/new/*
メール送信には Postfix に含まれる sendmail
コマンドが利用できる。 37
-bv
オプションはメッセージを送信せずに受信者アドレスを検証した後でレポートを出力する。 38
ログのフォローは Ctrl + c で中断できる。
http://d.hatena.ne.jp/heihoo/20101208/p1
https://s.webry.info/sp/vogel.at.webry.info/201307/article_8.html
https://hacknote.jp/archives/26115/
http://next.matrix.jp/20130710.html
https://oxynotes.com/?p=4646
https://www.qoosky.io/techs/b2e869356c
-
"Add a service for
zone
. If zone is omitted, default zone will be used. This option can be specified multiple times." - Documentation - Manual Pages - firewall-cmd | firewalld ↩ -
"The service is one of the firewalld provided services. To get a list of the supported services, use firewall-cmd --get-services." - Documentation - Manual Pages - firewall-cmd | firewalld ↩
-
"postconf(1) コマンドは設定パラメータの現在の値を表示したり、設定パラメータの値を変更したり、Postfix メールシステムに関するその他の設定情報を表示します。" - Postfix manual - postconf(1) ↩
-
"check 不正なディレクトリ/ファイルの所有権やパーミションを警告し、見つからないディレクトリを作成します。" - Postfix manual - postfix(1) ↩
-
"reload 設定ファイルを再び読み込みます。動作中のプロセスは早期の適切な時に停止が許されます。" - Postfix manual - postfix(1) ↩
-
"このメールシステムのインターネットホスト名。" - myhostname - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"SMTP サーバーの FQDN を指定します。" - myhostname - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"デフォルトでは gethostname() から得た完全修飾ドメイン名を使います。" - myhostname - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"このメールシステムのインターネットドメイン名。デフォルトでは $myhostname から最初の要素を引いたものを使います。" - mydomain- Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"デフォルトの設定は、myhostname で指定したホスト名から最初のピリオドまでを引いたものになります。" - mydomain - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"ドメイン名で、ローカルで投函されたメールはそこから来たように見え、またローカルで投かんされたメールはそこに配送されます。" - myorigin - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"myorigin パラメータにはローカルで投函されたメールがどのドメインから来るように見えるかを指定します。" - 外行きのメールに使うドメイン名 - Postfix 基本設定 ↩
-
"サーバー上から直接メールをローカル配信した場合に、自動的に補われるドメイン名を指定します。" - myorigin - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"送信者と受信者アドレスの一貫性を保つため、 myorigin は修飾されていない受信者アドレスに付けられるドメイン名も指定します。" - 外行きのメールに使うドメイン名 - Postfix 基本設定 ↩
-
"このメールシステムがメールを受け取るネットワークインターフェースアドレス。" - inet_interfaces - Postfix設定パラメータ ↩
-
"リモートからの SMTP 接続要求に応答するネットワークインターフェースのアドレスを指定します。" - inet_interfaces - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"すべてのネットワークインターフェースでメールを受信するには "all" を指定します (デフォルト)。" - inet_interfaces - Postfix設定パラメータ ↩
-
"ローカルホストからの要求にのみ応答するように初期設定されていますので、デフォルトでは、この SMTPサーバー宛てのメールを受信することはできません。" - inet_interfaces - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"他のホストからのメールを受信するには、この SMTP サーバーがメールを受信するネットワークインターフェースを指定する必要があります。通常は、全てのインターフェースを対象とするため ALL を指定します。" - inet_interfaces - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"注意1: このパラメータを変更したらPostfixを stop してから start する必要があります。" - inet_interfaces - Postfix設定パラメータ ↩
-
"$local_transport メール配送 transport を使って配送されるドメインのリスト。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"mydestination パラメータには、 このマシンが他のマシンに転送せずにローカルに配送するドメインを指定します。 デフォルトではマシン自身に対するメールを受け取ります。" - 受け取るべきメールのドメイン - Postfix 基本設定 ↩
-
"この SMTP サーバーが受信するドメイン名をリストします。" - mydestination - 10.4.2. 設定ファイル(/etc/postfix/main.cf)の編集 - 10.4. 基本的な SMTP サーバーの設定 - 第10章メールサーバー - Turbolinux 11 Server: ユーザーガイド ↩
-
"SMTPサーバは受信者アドレスを $local_recipient_maps で確認し、存在しない受信者を拒否します。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"デフォルトでは、Postfix SMTPサーバは local_recipient_maps パラメータにリストアップされていない受信者宛のメールを拒否します。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"デフォルトの mydestination 値はローカルマシンの名前だけを指定しています。メールドメインゲートウェイ上では、$mydomain も含むべきでしょう。" - mydestination - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"マシンがドメイン全体に対するメールサーバの場合、 $mydomain もリストアップしなければいけません。" - 受け取るべきメールのドメイン - Postfix 基本設定 ↩
-
"注意: メール配送ループを避けるため、 $myhostname や localhost.$mydomain を含む、このマシンの 全てのホスト名をリストアップしなければいけません。" - 受け取るべきメールのドメイン - Postfix 基本設定 ↩
-
"オプションのメールボックスファイルの local(8) ユーザのホームディレクトリからの相対パス名。" - home_mailbox - Postfix main.cf ファイルフォーマット - Postfix設定パラメータ ↩
-
"-s, --shell SHELL The name of the user's login shell." - useradd(8) - Linux man page ↩
-
"-p, --password PASSWORD The encrypted password, as returned by crypt(3)." - useradd(8) - Linux man page ↩
-
"Note: This option is not recommended because the password (or encrypted password) will be visible by users listing the processes." - useradd(8) - Linux man page ↩
-
"Telnet is a popular protocol for logging in to remote systems over the Internet. The telnet service is disabled by default." - 4.186. telnet Red Hat Enterprise Linux 5 | Red Hat Customer Portal ↩
-
"デフォルトでは root ユーザーが Telnet を使用して接続することは許可されません。" - Telnet サービスを有効にする - Red Hat Customer Portal ↩
-
"curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP)." - curl - How To Use ↩
-
"Makes curl verbose during the operation. Useful for debugging and seeing what's going on "under the hood". A line starting with '>' means "header data" sent by curl, '<' means "header data" received by curl that is hidden in normal cases, and a line starting with '*' means additional info provided by curl." - curl - How To Use ↩
-
"Postfix sendmail(1) コマンドは Postfix に Sendmail 互換インターフェースを提供します。" - Postfix manual - sendmail(1) ↩
-
"-bv メッセージを集めたり配送しません。代わりに受信者アドレスを検証した後でレポートをEメールで送ります。これはアドレス書き換えやルーティング設定のテストに便利です。" - Postfix manual - sendmail(1) ↩