Postfix設定の基本 ─ myhostnameとmydomainの違いを図解で完全解説

雑記

Postfixをインストールして最初に開くmain.cf。そこに並ぶmyhostnamemydomainは、一見似ているようで役割がまったく異なります。「どっちに何を書けばいいの?」と迷った経験はないでしょうか。

この記事では、Postfixの基本設定パラメータであるmyhostnamemydomainの違いを、実際のSMTP通信やヘッダの例を交えて解説します。さらに、実務で見落としがちなDNS逆引き・SPF・TLS証明書との整合性についても取り上げます。

この記事のポイント

  • myhostname = SMTPのEHLO/Receivedヘッダで使う「サーバーの識別名」
  • mydomain = myorigin経由でシステムメールの@以降を補完する設定
  • バーチャルドメイン運用では mydomain の影響範囲は限定的
  • DNS逆引き(PTR)・SPF・TLS証明書は myhostname と整合させることが重要

コピペ用 main.cf テンプレート

以下は本記事で解説したパラメータをまとめた設定テンプレートです。example.jp を自分のドメインに置き換えて、main.cf にそのまま貼り付けできます。数ヶ月後に見返しても各パラメータの意味がわかるよう、コメントで解説を付けています。

##################################################
#ホスト名・ドメイン基本設定
##################################################

#--- myhostname ---
#SMTPのEHLO/HELOで相手サーバーに名乗るFQDN(サーバーの名刺)
#Receivedヘッダの「by ○○○」にも記録される
#DNS逆引き(PTR)の結果と必ず一致させること(不一致だとGmail等でスパム判定)
#TLS証明書のSAN(Subject Alternative Name)にもこのFQDNを含めること
#省略すると gethostname() の値が使われるが、VPS/クラウドでは意図しない値になりがち
myhostname = mail.example.jp

#--- mydomain ---
#サーバーが所属するドメイン名
#省略すると myhostname からホスト部分を除去した値が自動設定される
#(mail.example.jp → example.jp)
#myorigin や mydestination から $mydomain で参照される
mydomain = example.jp

#--- myorigin ---
#このサーバーから送信するメールの@以降を何にするか
#$myhostname → [email protected](サーバー名が付く)
#$mydomain   → [email protected](ドメイン名が付く・推奨)
#cronやバウンスメールの差出人アドレスに影響する
#SPFレコードはこのドメインに対して設定すること
myorigin = $mydomain

#--- mydestination ---
#このサーバーがローカル配送(UNIXユーザーのメールボックスに直接配送)するドメインの一覧
#ここに書いたドメイン宛のメールは local(8) で配送される
#【重要】virtual_mailbox_domains と同じドメインを絶対に書かないこと(エラーになる)
mydestination = $myhostname, localhost.$mydomain, localhost

##################################################
#ネットワーク設定
##################################################

#--- inet_interfaces ---
#Postfixが待ち受けるネットワークインターフェース
#all       = 全インターフェースでSMTP受信(外部からメールを受ける場合)
#loopback-only = localhost のみ(送信専用サーバーの場合)
inet_interfaces = all

#--- mynetworks_style ---
#リレーを許可する「信頼するネットワーク」の範囲
#host    = 自分自身(127.0.0.1)のみ(最も安全・推奨)
#subnet  = 同一サブネット(社内LAN等)
#class   = 同一IPクラス(非推奨・オープンリレーの危険)
mynetworks_style = host

##################################################
#バーチャルドメイン設定(複数ドメインでメール受信する場合)
##################################################

#--- virtual_mailbox_domains ---
#仮想メールボックスで受信するドメイン(複数指定可)
#UNIXアカウント不要でメール受信できる
#mydestination に入れたドメインはここに書かないこと
#virtual_mailbox_domains = example.jp, example.com

#--- virtual_mailbox_maps ---
#仮想メールボックスの一覧(どのアドレスを受け付けるか)
#virtual_mailbox_maps = hash:/etc/postfix/vmailbox

#--- virtual_transport ---
#仮想メールボックス宛メールの配送先(Dovecot等のIMAPサーバー)
#virtual_transport = lmtp:unix:private/dovecot-lmtp

##################################################
#TLS設定(メール通信の暗号化)
##################################################

#--- smtpd_tls_cert_file / smtpd_tls_key_file ---
#受信時TLSに使うサーバー証明書と秘密鍵
#証明書のSAN(Subject Alternative Name)に myhostname のFQDNが含まれていること
#Let's Encryptの場合: certbot certonly -d mail.example.jp
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.example.jp.pem
smtpd_tls_key_file = /etc/pki/tls/private/mail.example.jp.key

#--- smtpd_tls_security_level ---
#受信時のTLSポリシー
#may      = クライアントがSTARTTLS対応ならTLSを使用(推奨)
#encrypt  = TLS必須(非対応クライアントからのメールを拒否)
#none     = TLS無効(非推奨)
smtpd_tls_security_level = may

#--- smtp_tls_security_level ---
#送信時のTLSポリシー(外部サーバーへの接続)
#may      = 相手がSTARTTLS対応ならTLSを使用(推奨)
smtp_tls_security_level = may

使い方:

  1. 上記をコピーして /etc/postfix/main.cf に貼り付け
  2. example.jp → 自分のドメインに置換
  3. バーチャルドメインが必要なら # を外して有効化
  4. postfix check で構文チェック → systemctl reload postfix で反映

myhostnameとは ─ SMTPの「名刺」

myhostnameは、PostfixがSMTP通信で自分自身を名乗るときに使うFQDNです。具体的には以下の場面で使われます。

使われる場面

1. EHLO/HELOコマンド

外部サーバーにメールを送信する際、SMTP接続の冒頭で自分の名前を名乗ります。

220 mx.example.com ESMTP
EHLO mail.example.jp    ← ここにmyhostnameの値が使われる
250 mx.example.com Hello mail.example.jp

2. Receivedヘッダ

メールを受信・中継すると、Postfixは自動的にReceivedヘッダを付与します。

Received: from sender.example.com (sender.example.com [192.0.2.1])
    by mail.example.jp (Postfix)    ← myhostnameの値
    with ESMTPS id XXXXXXXX
    for <[email protected]>; Mon,  2 Mar 2026 10:00:00 +0900 (JST)

3. バウンスメールの差出人

配送に失敗した場合のバウンス通知は MAILER-DAEMON@myhostname から送信されます。

設定例

myhostname = mail.example.jp

設定しない場合、gethostname()の結果(通常は/etc/hostnameの値)が使われます。クラウドやVPS環境ではデフォルト値が意図しない名前になることが多いため、必ず明示的に設定しましょう。


mydomainとは ─ メールアドレスの「@以降」を決める

mydomainは、サーバーが所属するドメイン名を定義するパラメータです。直接SMTP通信に使われることは少なく、他のパラメータから参照される形で間接的に機能します。

デフォルト値

mydomain = myhostnameからホスト名部分を除いたもの

例えば myhostname = mail.example.jp の場合、mydomain = example.jp が自動的に設定されます。

最も重要な使われ方: myorigin

myoriginは「このサーバーから発信されるメールの@以降」を決めるパラメータです。デフォルトでは:

myorigin = $myhostname   # ← Postfixのデフォルト

多くの運用では以下のように変更します:

myorigin = $mydomain     # 推奨設定

この設定の違いを見てみましょう。cronやシステムからのメール(ユーザー名だけで@がない宛先)がどう補完されるかが変わります。

設定 cronメールの差出人 説明
myorigin = $myhostname [email protected] サーバー名が付く
myorigin = $mydomain [email protected] ドメイン名が付く

複数のサーバーがある環境では、myorigin = $mydomainにしておくと、どのサーバーから送られたメールも統一されたドメインで送信されます。

mydomainが使われるその他の場面

mydestination = $myhostname, localhost.$mydomain, localhost

mydestinationは「このサーバーがローカル配送する宛先ドメイン」のリストです。ここに$mydomainを追加すると、[email protected]宛のメールもローカル配送されます。


両者の関係を図で整理

myhostnamemydomainmyoriginmydestinationの関係を整理します。

myhostname = mail.example.jp
    │
    ├──→ EHLO mail.example.jp(SMTP通信で名乗る)
    ├──→ Received: by mail.example.jp(ヘッダに記録)
    │
    └── mydomain = example.jp(ホスト名部分を除去して自動設定)
            │
            ├──→ myorigin = $mydomain
            │       └──→ 送信メールの@以降: [email protected]
            │
            └──→ mydestination に追加可能
                    └──→ [email protected] をローカル配送

まとめると:

パラメータ 役割
myhostname SMTPで名乗るFQDN mail.example.jp
mydomain サーバーのドメイン名 example.jp
myorigin 送信メールの@以降 $mydomainexample.jp
mydestination ローカル配送する宛先 $myhostname, localhost

バーチャルドメインとの使い分け

実際のメールサーバー運用では、複数のドメインのメールを1台のサーバーで扱うことが一般的です。ここでmydomainvirtual_mailbox_domainsの使い分けが重要になります。

mydomain(ローカル配送)

  • サーバー自身のシステムメール用(1つだけ
  • UNIXユーザーアカウントに配送
  • root, postmaster等のシステムアカウント向け

virtual_mailbox_domains(仮想配送)

  • ユーザーメール受信用(複数ドメイン可
  • UNIXアカウント不要
  • Dovecot等と連携した仮想メールボックスに配送
myhostname = mail.example.jp
mydomain = example.jp
myorigin = $mydomain

virtual_mailbox_domains = example.jp, example.com, example.net
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_transport = lmtp:unix:private/dovecot-lmtp

注意: mydestinationvirtual_mailbox_domainsに同じドメインを入れてはいけません。Postfixはドメインの所属を一意に判定するため、重複するとエラーになります。


実務で押さえるべき5つの注意点

1. DNS逆引き(PTR)をmyhostnameと一致させる

多くのメールサーバーは、接続元IPの逆引き結果とEHLOで名乗ったホスト名が一致するかを検証します(FCrDNS: Forward-Confirmed Reverse DNS)。

IPアドレス: 203.0.113.10
逆引き(PTR): mail.example.jp     ← myhostnameと一致させる
正引き(A):   mail.example.jp → 203.0.113.10

不一致の場合: Gmail等の主要プロバイダでスパム判定されるリスクが高まります。VPSやクラウドでは逆引き設定をコントロールパネルから変更できることが多いので、必ず確認しましょう。

2. SPFレコードにmyhostnameのIPを含める

SPF(Sender Policy Framework)は、ドメインからの送信を許可するIPアドレスを宣言するDNS TXTレコードです。

; example.jp のDNS TXTレコード
example.jp.  IN TXT "v=spf1 a:mail.example.jp -all"

myorigin = $mydomain[email protected]としてメールを送る場合、example.jpのSPFレコードにmail.example.jpのIPが含まれている必要があります。

3. TLS証明書のSANにmyhostnameを含める

Postfixでsmtpd_tls_cert_fileに指定する証明書は、myhostnameと一致するSAN(Subject Alternative Name)を持つ必要があります。

openssl x509 -in /etc/pki/tls/certs/mail.pem -noout -ext subjectAltName

Let’s Encryptを使う場合:

certbot certonly -d mail.example.jp

4. /etc/hostname と myhostname の不一致に注意

/etc/hostnamemyhostnameが異なると、ログの追跡が困難になります。syslogのホスト名は/etc/hostnameベースですが、Postfixのログはmyhostnameを使います。

hostname -f         # /etc/hostname ベース
postconf myhostname # Postfix設定

運用上は両者を一致させておくのがベストプラクティスです。

5. Docker/クラウド環境では必ず明示的に指定

コンテナ環境やクラウドVMでは、hostnameコマンドの結果がランダムなID(例: d4e5f6a7b8c9)になることがあります。

myhostname = mail.example.jp
mydomain = example.jp

設定を省略すると、EHLOで意味不明なホスト名を名乗ることになり、受信側で即座に拒否される可能性があります。


設定の確認コマンド

設定後は以下のコマンドで確認しましょう。

Postfix設定の確認

postconf myhostname mydomain myorigin mydestination

postfix check

postconf -n

DNS設定の確認

dig -x 203.0.113.10 +short

dig mail.example.jp A +short

dig example.jp TXT +short

SMTP動作の確認

telnet localhost 25
EHLO test

まとめ

パラメータ 一言で言うと 典型的な値
myhostname SMTP通信の名刺 mail.example.jp
mydomain サーバーの所属ドメイン example.jp
myorigin 送信メールの@以降 $mydomain
mydestination ローカル配送先ドメイン $myhostname, localhost

設定のベストプラクティス:

  1. myhostnameを明示的にFQDNで設定する
  2. myorigin = $mydomainで送信アドレスを統一する
  3. DNS逆引き・SPF・TLS証明書をmyhostnameと整合させる
  4. バーチャルドメインでユーザーメールを管理し、mydestinationはシステム用に限定する

次回は「Postfixのバーチャルドメイン設定 ─ 複数ドメインを1台で運用する方法」を解説予定です。

コメント

タイトルとURLをコピーしました