<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>メールログ | 徒然なるままに</title>
	<atom:link href="https://www.seichan.org/tag/%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AD%E3%82%B0/feed" rel="self" type="application/rss+xml" />
	<link>https://www.seichan.org</link>
	<description>徒然と日々の出来事(ネタ)を書いていこうかと．主に FreeBSD，Unix系の話題が中心ですが，その他の話題もあつかってみたり．</description>
	<lastBuildDate>Wed, 21 Oct 2026 21:11:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>【メール入門 第8回】MTAの運用 ― Postfixの構成・キュー・main.cf、オープンリレー対策、ログの読み方、スマートホスト</title>
		<link>https://www.seichan.org/2026/10/mail-08-postfix.html</link>
					<comments>https://www.seichan.org/2026/10/mail-08-postfix.html#respond</comments>
		
		<dc:creator><![CDATA[seichan]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[メールサーバー]]></category>
		<category><![CDATA[Amazon SES]]></category>
		<category><![CDATA[MTA]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[オープンリレー]]></category>
		<category><![CDATA[スマートホスト]]></category>
		<category><![CDATA[メール]]></category>
		<category><![CDATA[メールログ]]></category>
		<guid isPermaLink="false">https://www.seichan.org/blog/?p=6890</guid>

					<description><![CDATA[Postfixを例に、MTAを安全に運用する方法を解説します。デーモンとキューの構成、main.cfとpostconf、submission・submissionsの設定、オープンリレーを作らないリレー制御、キューの操作、キューIDでログを追う方法とstatusの読み方、TLSの設定、送信専用サーバーとスマートホスト、Microsoft 365・SESへのリレー、Postfixの現行版まで。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「昨日の夕方に送ったメールが、相手に届いていないそうです。調べてもらえますか」</p>



<p class="wp-block-paragraph">メールサーバーの担当者なら、必ず受ける問い合わせです。答えは<strong>ログとキュー</strong>にあります。ただし、読み方を知らないと、大量のログの中で迷子になります。</p>



<p class="wp-block-paragraph">第8回では、広く使われているMTAの<strong>Postfix</strong>を例に、構成、設定、<strong>オープンリレーを作らない</strong>リレー制御、キューとログの読み方、そして送信専用サーバーの組み方を見ていきます。</p>


<div class=".for-sp">
<div id="im-5078de7a65f140ac9d12a50b8ac9ee9c">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js?20220104"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:81546,mid:567719,asid:1946055,type:"banner",display:"inline",elementid:"im-5078de7a65f140ac9d12a50b8ac9ee9c"})</script>
</div>
</div>

<div class=".for-pc">
<!-- admax -->
<script src="https://adm.shinobi.jp/s/8ae3a18ff526e95e579f5814fddd88f6"></script>
<!-- admax -->
<!--
<div id="im-3931cf74888b4888ae5fb170df744749">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js?20220104"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:81546,mid:567718,asid:1946233,type:"banner",display:"inline",elementid:"im-3931cf74888b4888ae5fb170df744749"})</script>
</div>
-->
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Postfixの構成</a></li><li><a href="#toc2" tabindex="0">キューの種類</a></li><li><a href="#toc3" tabindex="0">main.cfの主な設定</a><ol><li><a href="#toc4" tabindex="0">postconfで設定を確かめる</a></li></ol></li><li><a href="#toc5" tabindex="0">master.cf：submissionとsubmissions</a></li><li><a href="#toc6" tabindex="0">リレーの制御：オープンリレーを作らない</a><ol><li><a href="#toc7" tabindex="0">リレー制御の設定と確認</a></li></ol></li><li><a href="#toc8" tabindex="0">キューの操作</a></li><li><a href="#toc9" tabindex="0">ログの読み方① キューIDで1通を追う</a></li><li><a href="#toc10" tabindex="0">ログの読み方② statusの読み方</a></li><li><a href="#toc11" tabindex="0">TLSの設定</a></li><li><a href="#toc12" tabindex="0">送信専用サーバーとスマートホスト</a><ol><li><a href="#toc13" tabindex="0">Microsoft 365・SESへのリレー設定の例</a></li></ol></li><li><a href="#toc14" tabindex="0">WindowsでのSMTPとPostfixの現行版</a></li><li><a href="#toc15" tabindex="0">考えてみよう</a></li><li><a href="#toc16" tabindex="0">まとめ</a></li><li><a href="#toc17" tabindex="0">連載「メール入門」全12回</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Postfixの構成</span></h2>



<p class="wp-block-paragraph">Postfixは、<strong>役割ごとに分かれた小さなデーモンの集まり</strong>です。常駐する<code>master</code>が、必要に応じて各デーモンを起動します。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail08-s086.png" alt="SMTPの25・587番から届いたメールはsmtpdが、sendmailコマンドで投入されたメールはmaildropキューを経てpickupが受け取り、どちらもcleanupでヘッダーの補完とアドレスの書き換えを受けてincomingキューに入り、qmgrが外部宛てはsmtpへ、メールボックス宛てはlocalへ配送を頼み、失敗したものはdeferredキューで再送を待つことを示す図"/></figure>



<ul class="wp-block-list">
<li><strong>入口</strong>：外部からSMTPで届いたメールは<code>smtpd</code>が受け取り、サーバー上の<code>sendmail</code>コマンドで投入されたメールは<code>maildrop</code>キューを経て<code>pickup</code>が拾う</li>


<li><strong>整形</strong>：どちらも<code>cleanup</code>でヘッダーの補完（Message-ID・Date等）やアドレスの書き換えを受け、<code>incoming</code>キューに1つのファイルとして置かれる</li>


<li><strong>出口</strong>：<code>qmgr</code>（キューマネージャー）が配送の順番を管理し、外部宛ては<code>smtp</code>に、ローカルのメールボックス宛ては<code>local</code>（または<code>virtual</code>・<code>lmtp</code>）に配送を頼む。失敗したメールは<code>deferred</code>キューで再送を待つ</li>
</ul>



<p class="wp-block-paragraph">最小の権限で動くプロセスに分けるのは、<strong>脆弱性の被害を広げないため</strong>です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc2">キューの種類</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>キュー</th><th>入るメール</th><th>次の動き</th></tr></thead><tbody><tr><td>maildrop</td><td>sendmail コマンドでローカルから投入されたもの</td><td>pickup が拾って cleanup へ渡す</td></tr><tr><td>incoming</td><td>cleanup が整えた到着直後のメール</td><td>qmgr が active へ移す</td></tr><tr><td>active</td><td>配送中のメール（数に上限がある）</td><td>成功で削除、一時失敗で deferred、恒久失敗でバウンス</td></tr><tr><td>deferred</td><td>一時エラーで配送できなかったメール</td><td>間隔を空けて再試行。期限を過ぎたらバウンス</td></tr><tr><td>hold</td><td>管理者が保留にしたメール</td><td>postsuper -H で戻すまで配送しない</td></tr></tbody></table></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail08-s087.png" alt="maildropからincomingを経てactive（配送中）に入り、成功で削除、恒久失敗でバウンス、一時失敗でdeferredに移って300〜4000秒の間隔で再試行し、5日で期限切れならバウンスすることと、postsuperでどのキューからでもholdに移せることを示す図"/></figure>



<ul class="wp-block-list">
<li>再試行の間隔は<code>minimal_backoff_time</code>（既定300秒）から<code>maximal_backoff_time</code>（既定4000秒）まで延び、<code>maximal_queue_lifetime</code>（既定5日）を過ぎると送信者にエラーメールを返す（第2回）</li>


<li>遅延の通知（<code>delay_warning_time</code>）は既定で無効</li>


<li><strong>キューのファイルは直接消さず</strong>、この後のコマンドで操作する</li>
</ul>



<p class="wp-block-paragraph">一時失敗は消えずに、deferredとactiveを行き来して待つのです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc3">main.cfの主な設定</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>パラメーター</th><th>意味</th><th>既定値</th><th>例（送信専用サーバー）</th></tr></thead><tbody><tr><td>myhostname</td><td>自分の FQDN。EHLO・Received に使う</td><td>OS のホスト名</td><td>app01.example.jp</td></tr><tr><td>mydomain</td><td>自分のドメイン</td><td>myhostname の先頭の部分を除いたもの</td><td>example.jp</td></tr><tr><td>myorigin</td><td>ローカルで出したメールに付けるドメイン</td><td>$myhostname</td><td>$mydomain</td></tr><tr><td>mydestination</td><td>自分が最終配送先になるドメイン</td><td>$myhostname, localhost.$mydomain, localhost</td><td>空（ローカル配送しない）</td></tr><tr><td>mynetworks</td><td>リレーを許す「信頼する」接続元</td><td>自ホストだけ（3.0 以降）</td><td>127.0.0.0/8 [::1]/128</td></tr><tr><td>relayhost</td><td>外部宛てを渡す次のサーバー（スマートホスト）</td><td>空（MX へ直接配送）</td><td>[relay.example.jp]:587</td></tr><tr><td>inet_interfaces</td><td>受け付けるネットワークインターフェース</td><td>all</td><td>loopback-only</td></tr></tbody></table></figure>



<ul class="wp-block-list">
<li><code>mydestination</code>にドメインを入れると、そのドメイン宛てを<strong>ローカルのユーザーとして配送しようとする</strong>。Microsoft 365などに本物のメールボックスがあるドメインを入れてしまい、外に出ず「User unknown」になるのは典型的な誤り</li>


<li><code>[ ]</code>で囲んだ<code>relayhost</code>は、MXを引かずにその名前へ直接送る</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4">postconfで設定を確かめる</span></h3>



<pre class="wp-block-code"><code>$ postconf -n                    # 既定値から変えた設定だけを表示（抜粋）
compatibility_level = 3.10
inet_interfaces = loopback-only
mydestination =
myhostname = app01.example.jp
relayhost = [relay.example.jp]:587
$ postconf -d mynetworks_style   # 既定値を表示
mynetworks_style = host
$ postconf mail_version          # 版を確認
mail_version = 3.10.6
$ sudo postconf -e &#x27;relayhost = [relay.example.jp]:587&#x27;   # main.cf を書き換える
$ sudo postfix check &amp;&amp; sudo systemctl reload postfix      # 検査して反映</code></pre>



<ul class="wp-block-list">
<li>設定の確認は、main.cfを目で読むより<strong><code>postconf -n</code>が確実</strong>。同じパラメーターを2回書いた場合も、実際に効いている値が分かる</li>


<li><code>postconf -M</code>でmaster.cfのサービスの一覧、<code>postconf -P</code>でmaster.cfの<code>-o</code>による上書きを表示する。3.11からは<code>-j</code>でJSONでも出力できる</li>


<li><code>compatibility_level</code>は、版を上げても古い既定値のまま動かす安全装置。上げると既定値が変わる（例：3.11で<code>smtp_tls_security_level</code>の既定がmayになる）ため、ログの警告と<code>postconf -n</code>を確かめてから上げる</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc5">master.cf：submissionとsubmissions</span></h2>



<pre class="wp-block-code"><code># service   type  private unpriv chroot wakeup maxproc command + args
smtp        inet  n       -      n      -      -       smtpd
submission  inet  n       -      n      -      -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
submissions inet  n       -      n      -      -       smtpd
  -o syslog_name=postfix/submissions
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject</code></pre>



<ul class="wp-block-list">
<li>master.cfは<strong>どのポートでどのデーモンを動かすか</strong>を決める。<code>-o</code>はそのサービスだけmain.cfの設定を上書きする（抜粋。公式の既定ファイルにはほかの<code>-o</code>もある）</li>


<li><strong>submission（587）</strong>はSTARTTLSを必須にし、認証したクライアントだけに送信を許す。<strong>submissions（465）</strong>は接続直後からTLSで話す（<code>smtpd_tls_wrappermode=yes</code>、第4回）</li>


<li>既定のmaster.cfではどちらもコメントになっている。行頭の<code>#</code>を外し、SASL認証（Dovecot等）の設定と合わせて有効にする（Dovecot 側の設定は連載「POP・IMAP入門」第11回（サーバーの構築と運用 前編））。古い版やディストリビューションの既定ファイルでは、465のサービス名が<code>smtps</code>のことがある</li>


<li>変更後は<code>postfix reload</code>。<code>ss -ltnp | grep master</code>で25・587・465を待ち受けていることを確かめる</li>
</ul>


<div class=".for-sp">
<div id="im-c929b2770f964f7f88505b9ee7500db9">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js?20220104"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:81546,mid:567719,asid:1946057,type:"banner",display:"inline",elementid:"im-c929b2770f964f7f88505b9ee7500db9"})</script>
</div>
</div>

<div class=".for-pc">
<!-- admax -->
<script src="https://adm.shinobi.jp/s/a1cf34f40c7d6f1acda2feeee1bc3a16"></script>
<!-- admax -->
<!--
<div id="im-3b5a2348efcc4b7a9435e1334f6172f2">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js?20220104"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:81546,mid:567718,asid:1946056,type:"banner",display:"inline",elementid:"im-3b5a2348efcc4b7a9435e1334f6172f2"})</script>
</div>
-->
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc6">リレーの制御：オープンリレーを作らない</span></h2>



<p class="wp-block-paragraph"><strong>オープンリレー</strong>とは、誰からのメールでも、どこ宛てでも中継してしまうメールサーバーです。見つかるとすぐに<strong>スパムの踏み台</strong>にされ、DNSBLに載って（第7回）自社のメールまで届かなくなります。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail08-s091.png" alt="社内の機器（mynetworks内）と認証済みのクライアントからは中継し、インターネットの誰かからの他ドメイン宛てはRelay access deniedで断り自ドメイン宛ては受け取ることと、mynetworksに0.0.0.0/0やロードバランサーの内部IPを入れるとオープンリレーになることを示す図"/></figure>



<ul class="wp-block-list">
<li>Postfixが中継（自分が最終配送先でないドメイン宛て）を許す条件は<code>smtpd_relay_restrictions</code>で決まる。既定値は<code>permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination</code></li>


<li><strong>mynetworksの接続元か、SMTP AUTHで認証したクライアント</strong>でなければ、担当外のドメイン宛ては断る</li>


<li>危ないのは、mynetworksに「とりあえず」広い範囲を入れることや、<strong>接続元がすべてロードバランサーの内部IPに見える構成で、そのIPを入れる</strong>こと</li>
</ul>



<p class="wp-block-paragraph">許可は、送信元のIPだけを列挙します。</p>



<h3 class="wp-block-heading"><span id="toc7">リレー制御の設定と確認</span></h3>



<pre class="wp-block-code"><code># /etc/postfix/main.cf（抜粋）
mynetworks = 127.0.0.0/8 [::1]/128 192.0.2.21/32 192.0.2.22/32
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated,
    reject_unauth_destination

# 許可していない IP から試す：他ドメイン宛ては拒否されるのが正しい
$ nc -C relay.example.jp 25
220 relay.example.jp ESMTP Postfix
EHLO test.example.com
（250- の行は略）
MAIL FROM:&lt;test@example.com&gt;
250 2.1.0 Ok
RCPT TO:&lt;someone@example.org&gt;
554 5.7.1 &lt;someone@example.org&gt;: Relay access denied</code></pre>



<ul class="wp-block-list">
<li>既定の<code>defer_unauth_destination</code>では<code>454 4.7.1</code>（一時エラー）、<code>reject_unauth_destination</code>では<code>554 5.7.1</code>（恒久エラー）で断る</li>


<li>受信側のログには<code>NOQUEUE: reject: RCPT from unknown[198.51.100.7]: 554 5.7.1 &lt;someone@example.org&gt;: Relay access denied; …</code>と出る</li>


<li>確認は<strong>必ず自分が管理するサーバーに対して行う</strong>。他組織のサーバーをオープンリレーか試すのは迷惑行為になる。Windowsからは、第9回のPowerShellの方法で同じ確認ができる</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc8">キューの操作</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>コマンド</th><th>動作</th><th>使いどころ</th></tr></thead><tbody><tr><td>postqueue -p（mailq）</td><td>キューの一覧と、遅延の理由を表示</td><td>まず状況を見る</td></tr><tr><td>postqueue -f</td><td>キューのメールをすべて今すぐ再送</td><td>相手の復旧後</td></tr><tr><td>postqueue -i キューID</td><td>指定の1通を今すぐ再送</td><td>1通だけ試す</td></tr><tr><td>postsuper -d キューID</td><td>指定の1通を削除（-d ALL deferred で deferred を全部削除）</td><td>誤送信・スパムの滞留</td></tr><tr><td>postsuper -h キューID／-H</td><td>保留にする／保留を解く</td><td>調べる間だけ止める</td></tr><tr><td>postcat -q キューID</td><td>キューのファイルの中身（エンベロープ・ヘッダー・本文）を表示</td><td>送信者・宛先・内容の確認</td></tr></tbody></table></figure>



<pre class="wp-block-code"><code>$ postqueue -p
-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
A3D5F20C41      2210 Sat Sep 26 09:02:44  alert@example.jp
(connect to mx.example.org[203.0.113.25]:25: Connection timed out)
                                         user@example.org

-- 2 Kbytes in 1 Request.</code></pre>



<p class="wp-block-paragraph">キューIDの直後の<code>*</code>は配送中（active）、<code>!</code>は保留中（hold）を表します。<strong>括弧の中が最後の失敗の理由</strong>です。<code>postsuper -d ALL</code>はキューのメールをすべて消すため、スパムの滞留の後始末などを除いて使いません。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc9">ログの読み方① キューIDで1通を追う</span></h2>



<p class="wp-block-paragraph">冒頭の「昨日送ったメールが届いていない」を調べる方法です。</p>



<pre class="wp-block-code"><code>$ grep 8C1E0A1B2F /var/log/maillog       # RHEL 系（Debian 系は /var/log/mail.log）
Sep 26 10:15:01 relay postfix/smtpd[2345]: 8C1E0A1B2F: client=app01.example.jp[192.0.2.21]
Sep 26 10:15:01 relay postfix/cleanup[2346]: 8C1E0A1B2F: message-id=&lt;20260926011501.4F2A@app01.example.jp&gt;
Sep 26 10:15:01 relay postfix/qmgr[1101]: 8C1E0A1B2F: from=&lt;alert@example.jp&gt;, size=1532, nrcpt=1 (queue active)
Sep 26 10:15:02 relay postfix/smtp[2347]: 8C1E0A1B2F: to=&lt;user@example.com&gt;, relay=mx.example.com[198.51.100.25]:25, delay=1.2, delays=0.05/0.01/0.62/0.52, tls=may, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 4ZbQ1x2Kp3z9)
Sep 26 10:15:02 relay postfix/qmgr[1101]: 8C1E0A1B2F: removed
$ journalctl --facility=mail --since today | grep 8C1E0A1B2F    # journal だけの環境</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail08-s094.png" alt="同じキューID 8C1E0A1B2Fの行が、smtpdがapp01から受け取る、cleanupがMessage-IDを記録、qmgrが送信者と宛先の数を記録、smtpがmx.example.comへsent、qmgrがキューから削除の順に並び、queued asの後ろが相手側のキューIDであることを示す図"/></figure>



<ul class="wp-block-list">
<li>Postfixは1通ごとに<strong>キューID</strong>を振り、受け取りから削除まで同じIDでログに出す。<strong>キューIDでgrepすれば1通の一生が分かる</strong></li>


<li>行の順：smtpd（接続元）→ cleanup（Message-ID）→ qmgr（エンベロープの送信者・宛先の数）→ smtp（配送の結果）→ qmgr（removed）。from・toはエンベロープの値（第3回）</li>


<li><strong><code>queued as</code>の後ろは相手側のキューID</strong>。相手の管理者に伝えれば、その先を追ってもらえる。<code>tls=may</code>は3.11以降で出るTLSの使われ方の表示</li>


<li>ログの場所：RHEL系は<code>/var/log/maillog</code>、Debian・Ubuntu系は<code>/var/log/mail.log</code>。rsyslogを入れない環境（Debian 12以降の既定など）では<strong>journalにだけ残る</strong>（連載「syslog入門」）</li>
</ul>



<p class="wp-block-paragraph">Message-IDしか分からないときは、まずMessage-IDでgrepしてキューIDを見つけ、次にキューIDでgrepします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc10">ログの読み方② statusの読み方</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>表示</th><th>意味</th><th>次に確認すること</th></tr></thead><tbody><tr><td>status=sent</td><td>相手が 250 で受け取った</td><td>届かないなら相手側（迷惑メール判定・転送）を調べる</td></tr><tr><td>status=deferred</td><td>一時的な失敗。キューに残り再送する</td><td>括弧内の理由（接続できない・4xx の応答）</td></tr><tr><td>status=bounced</td><td>恒久的な失敗。送信者にエラーメールを返す</td><td>括弧内の相手の応答（5xx と拡張ステータスコード）</td></tr><tr><td>status=expired, returned to sender</td><td>再送を続けたが期限（既定5日）が切れた</td><td>それまでの deferred の理由をさかのぼる</td></tr><tr><td>NOQUEUE: reject:</td><td>受信側（smtpd）が受け取りを拒否した</td><td>拒否の理由と接続元・from・to</td></tr><tr><td>delays=a/b/c/d</td><td>a：キューマネージャーに渡るまで（受け取りを含む）、b：キューマネージャーの中での待ち、c：接続の確立（DNS・EHLO・TLS を含む）、d：メッセージの送信</td><td>どの段階で時間がかかったか</td></tr></tbody></table></figure>



<pre class="wp-block-code"><code>… to=&lt;nosuch@example.com&gt;, relay=mx.example.com[198.51.100.25]:25, …, dsn=5.1.1, status=bounced
  (host mx.example.com[198.51.100.25] said: 550 5.1.1 &lt;nosuch@example.com&gt;: Recipient address rejected: User unknown (in reply to RCPT TO command))
… to=&lt;user@example.org&gt;, relay=none, delay=300, …, dsn=4.4.1, status=deferred
  (connect to mx.example.org[203.0.113.25]:25: Connection timed out)</code></pre>



<p class="wp-block-paragraph"><strong><code>status=sent</code>は「相手が受け取った」までで、「受信箱に入った」ではありません</strong>。sentなのに届かないなら、相手側の迷惑メール判定や転送を疑います。</p>



<p class="wp-block-paragraph"><code>(in reply to RCPT TO command)</code>は、相手がどのコマンドに対して断ったかを示します。RCPT TOなら<strong>宛先の問題</strong>、end of DATA commandなら<strong>内容の問題</strong>（迷惑メール判定・DMARCの不合格など）であることが多いです（第11回）。</p>


<div class=".for-sp">
<div id="im-e200ff972f7b43fe9c8c2a7b60698c08">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js?20220104"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:81546,mid:567719,asid:1946060,type:"banner",display:"inline",elementid:"im-e200ff972f7b43fe9c8c2a7b60698c08"})</script>
</div>
</div>

<div class=".for-pc">
<!-- admax -->
<script src="https://adm.shinobi.jp/s/b379fcf4fc1a53eab29cb4ffbda7f14f"></script>
<!-- admax -->
<!--
<div id="im-4f0e910e1dca4503a73e8d9a2678879f">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js?20220104"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:81546,mid:567718,asid:1946059,type:"banner",display:"inline",elementid:"im-4f0e910e1dca4503a73e8d9a2678879f"})</script>
</div>
-->
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc11">TLSの設定</span></h2>



<pre class="wp-block-code"><code># 受信側（smtpd）
smtpd_tls_chain_files = /etc/postfix/tls/mail.example.jp.pem   # 鍵→証明書→中間証明書の順
smtpd_tls_security_level = may          # 公開の25番では may（必須にしない）
smtpd_tls_auth_only = yes               # 暗号化の前は AUTH を出さない
smtpd_tls_received_header = yes         # Received に TLS の情報を書く
smtpd_tls_loglevel = 1

# 送信側（smtp）
smtp_tls_security_level = may           # 3.11 以降（compatibility_level 3.11）は既定で may
smtp_tls_loglevel = 1
smtp_tls_policy_maps = lmdb:/etc/postfix/tls_policy   # 宛先ごとに encrypt・secure 等を指定</code></pre>



<ul class="wp-block-list">
<li><code>smtp_tls_security_level</code>：<strong>none</strong>（使わない）／<strong>may</strong>（日和見的TLS）／<strong>encrypt</strong>（暗号化は必須、証明書は検証しない）／<strong>dane</strong>（DNSSECのTLSAに従って検証、無ければmay）／<strong>verify・secure</strong>（証明書と名前を検証）</li>


<li>インターネットへの配送は<strong>may（またはdane）を既定</strong>にする。encrypt以上を全体の既定にすると、TLS非対応の相手に届かなくなる。リレー先や取引先など決まった相手だけ、<code>smtp_tls_policy_maps</code>でencrypt・secureにする</li>


<li>ログには<code>Trusted TLS connection established to …: TLSv1.3 with cipher …</code>のように、相手の証明書の信頼の程度（Anonymous・Untrusted・Trusted・Verified）が出る。MTA-STS・DANEは第4回、証明書の用意は連載「証明書入門」で扱っている</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc12">送信専用サーバーとスマートホスト</span></h2>



<p class="wp-block-paragraph">アプリケーションサーバーや監視サーバーのように、メールを送るだけのサーバーでは、Postfixを<strong>送信専用（null client）</strong>にします。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail08-s097.png" alt="アプリケーションサーバーや監視サーバーを受けない（loopback-only）・ローカル配送しない（mydestination空）送信専用サーバーにし、587番（TLS＋AUTH）か25番で社内リレーやSES等のスマートホストに渡し、SPF・DKIM・PTR・外向き25番はスマートホストだけで整えれば、台数が増えても外から見える送信元は1つのままであることを示す図"/></figure>



<ul class="wp-block-list">
<li>外からのメールを受け取らないよう<code>inet_interfaces = loopback-only</code>、ローカル配送をしないよう<code>mydestination</code>を空にし、外部宛てはすべて<code>relayhost</code>のスマートホスト（社内のリレーサーバーやクラウドの送信サービス）に渡す</li>


<li>各サーバーはMXを引かず、外向きの25番も要らなくなる。<strong>SPF・DKIM・逆引きといった外向けの整備を、スマートホストに集約できる</strong></li>


<li>スマートホストが認証を求める場合は、SASLのクライアント設定（<code>smtp_sasl_auth_enable</code>・<code>smtp_sasl_password_maps</code>）でIDとパスワードを渡し、<strong>必ずTLSと組み合わせる</strong></li>
</ul>



<p class="wp-block-paragraph">台数が増えても、外から見える送信元は1つのままです。</p>



<h3 class="wp-block-heading"><span id="toc13">Microsoft 365・SESへのリレー設定の例</span></h3>



<pre class="wp-block-code"><code># Amazon SES：587番の STARTTLS＋SMTP 認証（AWS のドキュメントの手順に準拠）
relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_security_level = secure
# /etc/postfix/sasl_passwd（chmod 600 にしてから postmap hash:/etc/postfix/sasl_passwd）
[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPユーザー名:SMTPパスワード

# Microsoft 365 の SMTP リレー：受信コネクターで IP か証明書を認証（パスワード不要）
relayhost = [example-jp.mail.protection.outlook.com]:25
smtp_tls_security_level = encrypt</code></pre>



<ul class="wp-block-list">
<li><strong>SESのSMTPの認証情報は、IAMのアクセスキーとは別物</strong>。リージョンのSMTPエンドポイントを使い、送信元の検証とサンドボックスの解除が要る（第10回、連載「クラウド入門」第14回）。Berkeley DBを外したディストリビューションでは、<code>hash:</code>の代わりに<code>lmdb:</code>等を使う（<code>postconf -m</code>で確認）</li>


<li><strong>Microsoft 365へのリレー</strong>は、受信コネクター（固定のパブリックIP、または受け入れ済みドメインを含む証明書で認証）を作り、MXのエンドポイントへ25番で送る。送信元は受け入れ済みドメインのアドレスにし、SPFに送信元IPを加える。証明書で認証する場合は、<code>smtp_tls_chain_files</code>でクライアント証明書を送る</li>


<li><code>smtp.office365.com:587</code>のSMTP AUTHは、Basic認証が<strong>2026年12月末から既定で無効</strong>になる（第4回）。Postfixは標準ではOAuth 2.0（XOAUTH2）で認証できないため、コネクター方式やSES等を選ぶ（第10回）</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc14">WindowsでのSMTPとPostfixの現行版</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>項目</th><th>状況（2026年9月）</th><th>対応</th></tr></thead><tbody><tr><td>IIS の SMTP サーバー（IIS 6 由来の機能）</td><td>Windows Server 2025 で削除。Windows Server 2022 が最後の版</td><td>新しく使わない。既存は移行を計画する</td></tr><tr><td>IIS SMTP から Microsoft 365 へのリレー</td><td>Microsoft はサポート対象外としている</td><td>Exchange Server、Linux の Postfix、クラウドの送信サービスへ移す</td></tr><tr><td>Windows からのテスト送信</td><td>Send-MailMessage は非推奨</td><td>PowerShell の TcpClient で確かめる（第9回）</td></tr><tr><td>Postfix の現行版</td><td>3.11.7（2026年9月7日）。更新の対象は 3.8〜3.11</td><td>postfix.org の告知で確認する</td></tr><tr><td>ディストリビューションの版</td><td>例：Ubuntu 26.04 は 3.10.6</td><td>postconf mail_version。修正はパッケージの更新で入る</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">2026年9月の3.11.7と各版の更新には、遠隔からのサービス停止や<strong>SMTPスマグリング</strong>（改行の扱いの違いを突いてメールを紛れ込ませる攻撃）につながる不具合の修正が含まれます。MTAはインターネットに直接さらされるため、<strong>ディストリビューションのセキュリティ更新を定期的に当て</strong>、更新の対象から外れた版（3.7以前）を使い続けないようにします。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc15">考えてみよう</span></h2>



<ol class="wp-block-list">
<li>社内のリレーサーバーで<code>postconf -n</code>を実行し、mynetworksに入っている範囲をすべて説明できますか。不要に広い範囲はありませんか。</li>


<li>「昨日の夕方に送ったメールが届いていない」と言われました。Message-IDしか分からない場合、どのコマンドの順でログを追いますか。</li>


<li>アプリケーションサーバー20台が、それぞれ直接インターネットへメールを送っています。送信専用＋スマートホストの構成に変えると、何が楽になり、何に注意が要りますか。</li>
</ol>



<p class="wp-block-paragraph"><strong>ヒント</strong>：この記事のpostconf、リレーの確認、キューIDでログを追う方法、送信専用サーバーの図が答えにつながります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc16">まとめ</span></h2>



<ul class="wp-block-list">
<li>Postfixは<strong>役割ごとのデーモン</strong>の集まり。入口はsmtpdとpickup、出口はsmtpとlocal</li>


<li>一時失敗は<strong>deferredで再送を待ち</strong>、既定5日で期限切れ。キューは<strong>postqueue・postsuper</strong>で操作する</li>


<li>設定の確認は<strong><code>postconf -n</code></strong>。mydestinationに本物のメールボックスがあるドメインを入れない</li>


<li>中継は<strong>mynetworksかSMTP AUTHの相手にだけ</strong>許す。外から試して<strong>Relay access denied</strong>を確かめる</li>


<li>ログは<strong>キューIDでgrep</strong>して1通を追う。<code>status=sent</code>は「相手が受け取った」まで</li>


<li>送るだけのサーバーは<strong>送信専用＋スマートホスト</strong>にし、外向けの整備を集約する</li>


<li>MTAはインターネットにさらされる。<strong>セキュリティ更新を定期的に</strong></li>
</ul>



<p class="wp-block-paragraph">次回は、MTAの外側から、<strong>dig・nc・openssl・PowerShellでメールの経路を調べる方法</strong>を見ていきます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc17">連載「メール入門」全12回</span></h2>



<ol class="wp-block-list">
<li><a href="https://www.seichan.org/2026/10/mail-01-overview.html" target="_blank">メールが届くまで</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-02-smtp-dialogue.html" target="_blank">SMTPのやり取り</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-03-message.html" target="_blank">メッセージの構造</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-04-ports-tls-auth.html" target="_blank">ポートと暗号化・認証</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-05-auth-basics.html" target="_blank">送信ドメイン認証 前編</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-06-dmarc-ops.html" target="_blank">送信ドメイン認証 後編</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-07-antispam.html" target="_blank">迷惑メール対策と配信</a></li>


<li><strong>MTAの運用（この記事）</strong></li>


<li>コマンドで調べる</li>


<li>クラウドと現代のメール</li>


<li>メールのトラブルシュート</li>


<li>メールの設計演習</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://www.seichan.org/2026/10/mail-08-postfix.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
