<?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>swaks | 徒然なるままに</title>
	<atom:link href="https://www.seichan.org/tag/swaks/feed" rel="self" type="application/rss+xml" />
	<link>https://www.seichan.org</link>
	<description>徒然と日々の出来事(ネタ)を書いていこうかと．主に FreeBSD，Unix系の話題が中心ですが，その他の話題もあつかってみたり．</description>
	<lastBuildDate>Fri, 23 Oct 2026 09:11:40 +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>【メール入門 第9回】コマンドで調べる ― dig・nc・openssl・PowerShellでDNS・ポート・SMTP・TLS・認証を確かめる</title>
		<link>https://www.seichan.org/2026/10/mail-09-commands.html</link>
					<comments>https://www.seichan.org/2026/10/mail-09-commands.html#respond</comments>
		
		<dc:creator><![CDATA[seichan]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[メールサーバー]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[SMTP]]></category>
		<category><![CDATA[swaks]]></category>
		<category><![CDATA[Test-NetConnection]]></category>
		<category><![CDATA[メール]]></category>
		<category><![CDATA[メールヘッダー]]></category>
		<guid isPermaLink="false">https://www.seichan.org/blog/?p=6935</guid>

					<description><![CDATA[メールの経路を、手を動かして確かめる方法を解説します。dig・Resolve-DnsNameでMX・SPF・DMARCを引き、nc・Test-NetConnectionでポートの疎通を見て、nc・PowerShellのTcpClientで手でSMTPを話し、openssl s_client・SslStreamでSTARTTLS後の証明書を読み、AUTHを試し、swaksで送り、Receivedヘッダーとログで1通を追うまで。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「複合機からのメールが届きません。PCから<code>Test-NetConnection</code>で25番を試したら成功するんですが……」</p>



<p class="wp-block-paragraph">メールのトラブルでは、<strong>どこまでが正常で、どこからがおかしいのか</strong>を切り分けることが大切です。そのためには、名前解決、TCPの疎通、SMTPの応答、TLS、認証を、<strong>下の層から順に</strong>手を動かして確かめます。</p>



<p class="wp-block-paragraph">第9回では、LinuxとWindowsの両方で使えるコマンドを、層ごとに紹介します。第8回までに出てきた確認の方法も、ここでまとめて扱います。</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">下の層から順に確かめる</a></li><li><a href="#toc2" tabindex="0">① MX・SPF・DMARCを引く</a></li><li><a href="#toc3" tabindex="0">② ポートの疎通を確かめる</a></li><li><a href="#toc4" tabindex="0">③ 手でSMTPを話す（nc・telnet）</a><ol><li><a href="#toc5" tabindex="0">PowerShellでSMTPを話す（TcpClient）</a></li></ol></li><li><a href="#toc6" tabindex="0">④ openssl s_clientの出力の読み方</a><ol><li><a href="#toc7" tabindex="0">WindowsでSTARTTLS後の証明書を見る（SslStream）</a></li></ol></li><li><a href="#toc8" tabindex="0">⑤ AUTHを試す</a></li><li><a href="#toc9" tabindex="0">テストメールを送る：swaksとSend-MailMessage</a></li><li><a href="#toc10" tabindex="0">ヘッダーの解析（Receivedをたどる）</a></li><li><a href="#toc11" tabindex="0">ログの追跡（キューID・Message-ID）</a></li><li><a href="#toc12" tabindex="0">考えてみよう</a></li><li><a href="#toc13" tabindex="0">まとめ</a></li><li><a href="#toc14" tabindex="0">連載「メール入門」全12回</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">下の層から順に確かめる</span></h2>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail09-s103.png" alt="①名前解決（dig／Resolve-DnsName）、②TCPの疎通（nc -vz／Test-NetConnection）、③SMTPの応答（nc・telnet／TcpClient）、④TLS（openssl s_client／SslStream）、⑤認証（AUTH）を下から順に確かめ、②で失敗したときはtimed outなら途中で遮断、Connection refusedなら相手が待ち受けていないことと、最初に失敗した段に原因のある層があることを示す図"/></figure>



<figure class="wp-block-table"><table><thead><tr><th>段</th><th>確かめること</th><th>Linux</th><th>Windows</th></tr></thead><tbody><tr><td>①</td><td>名前解決（MX・SPF 等）</td><td>dig</td><td>Resolve-DnsName</td></tr><tr><td>②</td><td>TCP の疎通</td><td>nc -vz</td><td>Test-NetConnection</td></tr><tr><td>③</td><td>SMTP の応答</td><td>nc・telnet</td><td>PowerShell の TcpClient</td></tr><tr><td>④</td><td>TLS と証明書</td><td>openssl s_client</td><td>PowerShell の SslStream</td></tr><tr><td>⑤</td><td>認証</td><td>openssl s_client で AUTH</td><td>同左</td></tr></tbody></table></figure>



<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">① MX・SPF・DMARCを引く</span></h2>



<pre class="wp-block-code"><code>$ dig example.jp MX +short
10 mail1.example.jp.
20 mail2.example.jp.
$ dig example.jp TXT +short | grep spf1
&quot;v=spf1 ip4:203.0.113.25 include:spf.protection.outlook.com -all&quot;
$ dig _dmarc.example.jp TXT +short
&quot;v=DMARC1; p=quarantine; rua=mailto:dmarc-rua@example.jp&quot;
$ dig s1._domainkey.example.jp TXT +short     # DKIM（セレクターは DKIM-Signature の s=）
$ dig _mta-sts.example.jp TXT +short          # MTA-STS（TLS-RPT は _smtp._tls）

PS&gt; Resolve-DnsName example.jp -Type MX -DnsOnly | Select-Object NameExchange, Preference
PS&gt; (Resolve-DnsName example.jp -Type TXT -DnsOnly).Strings | Where-Object { $_ -like &#x27;v=spf1*&#x27; }
PS&gt; (Resolve-DnsName _dmarc.example.jp -Type TXT -DnsOnly).Strings</code></pre>



<ul class="wp-block-list">
<li>MXは<strong>優先度の値の小さい順</strong>に試される。MXが無いとA／AAAAへ送る。<code>MX 0 .</code>（Null MX）は受け取らない宣言（連載「DNS入門」第6回）</li>


<li>SPFはドメイン名に1つ、DMARCは<code>_dmarc.</code>、DKIMは<code>セレクター._domainkey.</code>、MTA-STSは<code>_mta-sts.</code>、TLS-RPTは<code>_smtp._tls.</code>の下のTXT（第4回〜第6回）</li>


<li>社内DNSと外部DNSで答えが違う（<strong>スプリットホライズン</strong>）と、社外から見た答えと食い違う。外部のリゾルバーや権威DNSを、digの<code>@</code>や<code>-Server</code>で指定して比べる（連載「DNS入門」第8回）</li>


<li>DANEのTLSA（<code>_25._tcp.MXのホスト名</code>）は、digで型にTLSAを指定して引く</li>
</ul>



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



<h2 class="wp-block-heading"><span id="toc3">② ポートの疎通を確かめる</span></h2>



<pre class="wp-block-code"><code>$ nc -vz mail.example.jp 25
Connection to mail.example.jp (203.0.113.25) 25 port [tcp/smtp] succeeded!
$ nc -vz -w 5 mail.example.jp 587
nc: connect to mail.example.jp (203.0.113.25) port 587 (tcp) timed out: Operation now in progress

PS&gt; Test-NetConnection mail.example.jp -Port 25
ComputerName     : mail.example.jp
RemoteAddress    : 203.0.113.25
RemotePort       : 25
InterfaceAlias   : Ethernet
SourceAddress    : 192.0.2.101
TcpTestSucceeded : True</code></pre>



<ul class="wp-block-list">
<li>まずTCPでつながるかだけを見る。つながらなければ<strong>SMTP以前の問題</strong>（ファイアウォール・OP25B・サービス停止・名前解決）</li>


<li><strong>timed out</strong>は途中で落とされている（ファイアウォール・OP25Bに多い）、<strong>Connection refused</strong>は相手に届いたが待ち受けていない（サービス停止・ポート違い）</li>


<li>Test-NetConnectionはWindows標準。失敗すると警告と<code>TcpTestSucceeded : False</code>が出る。SMTPの応答やTLSまでは見ない</li>


<li><strong>送信元となる機器・サーバーから試す</strong>。ファイアウォールやリレーの許可は送信元IPで決まるため、自分の端末で通っても機器からは通らないことがある</li>
</ul>



<p class="wp-block-paragraph">冒頭の「PCからは成功する」は、まさにこの落とし穴です。</p>



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



<h2 class="wp-block-heading"><span id="toc4">③ 手でSMTPを話す（nc・telnet）</span></h2>



<pre class="wp-block-code"><code>$ nc -C relay.example.jp 25        # -C で改行を CRLF にする（RHEL の ncat も -C）
220 relay.example.jp ESMTP Postfix
EHLO app01.example.jp
250-relay.example.jp
250-PIPELINING
250-SIZE 10240000
250-STARTTLS
（略）
250 CHUNKING
MAIL FROM:&lt;alert@example.jp&gt;
250 2.1.0 Ok
RCPT TO:&lt;ops@example.jp&gt;
250 2.1.5 Ok
QUIT
221 2.0.0 Bye</code></pre>



<ul class="wp-block-list">
<li>FreeBSD 14 の <code>nc</code> には <code>-C</code> が無い。Postfix は改行が LF だけの行も既定で受け付けるので、<code>nc &lt;サーバー&gt; 25</code> のままで試せる（<code>smtpd_forbid_bare_newline = reject</code> の場合を除く）</li>


<li>機器と同じ送信元・宛先でMAIL FROM・RCPT TOを打てば、<strong>拒否の理由</strong>（Relay access denied、Sender address rejected等）がその場で分かる。<strong>RCPT TOまで確かめてQUITすれば、メールは送られない</strong></li>


<li>telnetでも同じ（<code>telnet relay.example.jp 25</code>）。Windowsのtelnetクライアントは既定で無効で、使うにはWindowsの機能の追加（管理者権限）が要る。Windowsでは次のPowerShellの方法を勧める</li>


<li>STARTTLSのあとは暗号化されるので、nc・telnetでは続けられない。暗号化後はopensslを使う</li>


<li><strong>公開のMTAや他組織のサーバーで試さない</strong>。自組織のサーバー、または許可を得た相手に限る</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">PowerShellでSMTPを話す（TcpClient）</span></h3>



<pre class="wp-block-code"><code>$tcp = [System.Net.Sockets.TcpClient]::new(&#x27;relay.example.jp&#x27;, 25)
$st  = $tcp.GetStream()
$r   = [System.IO.StreamReader]::new($st)
$w   = [System.IO.StreamWriter]::new($st); $w.NewLine = &quot;`r`n&quot;; $w.AutoFlush = $true
function Read-Reply { do { $l = $r.ReadLine(); &quot;S: $l&quot; } while ($l -match &#x27;^\d{3}-&#x27;) }
function Send-Cmd($c) { &quot;C: $c&quot;; $w.WriteLine($c); Read-Reply }
Read-Reply
Send-Cmd &#x27;EHLO pc01.example.jp&#x27;
Send-Cmd &#x27;MAIL FROM:&lt;alert@example.jp&gt;&#x27;
Send-Cmd &#x27;RCPT TO:&lt;user@example.com&gt;&#x27;
Send-Cmd &#x27;QUIT&#x27;
$tcp.Dispose()</code></pre>



<pre class="wp-block-code"><code>S: 220 relay.example.jp ESMTP Postfix
C: EHLO pc01.example.jp
S: 250-relay.example.jp
（略）
C: RCPT TO:&lt;user@example.com&gt;
S: 454 4.7.1 &lt;user@example.com&gt;: Relay access denied
C: QUIT
S: 221 2.0.0 Bye</code></pre>



<ul class="wp-block-list">
<li>Windows PowerShell 5.1・PowerShell 7のどちらでも、<strong>追加のインストールなしで動く</strong>。.ps1の実行がポリシーで止められる場合は、コンソールに貼り付けて実行する。<code>S:</code>がサーバーの応答、<code>C:</code>が送ったコマンド</li>


<li><code>Read-Reply</code>は、<code>250-</code>のように3桁の後ろがハイフンの行が続く限り読み、複数行の応答を最後まで受け取る</li>


<li>例では、このPCのIPがリレーを許されていないため<code>454 4.7.1 … Relay access denied</code>になった（第8回）。<strong>機器のIPから試すと結果が変わる</strong></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">④ openssl s_clientの出力の読み方</span></h2>



<pre class="wp-block-code"><code>$ openssl s_client -starttls smtp -connect mail.example.jp:25 -crlf \
    -name app01.example.jp -verify_hostname mail.example.jp -nocommands
（抜粋）
Certificate chain
 0 s:CN=mail.example.jp
   i:C=US, O=Let&#x27;s Encrypt, CN=YR1
 1 s:C=US, O=Let&#x27;s Encrypt, CN=YR1
   i:C=US, O=ISRG, CN=Root YR
 2 s:C=US, O=ISRG, CN=Root YR
   i:C=US, O=Internet Security Research Group, CN=ISRG Root X1
Verification: OK
Verified peername: mail.example.jp
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
250 CHUNKING</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail09-x-chain.png" alt="openssl s_clientのCertificate chainで、0のサーバー証明書の発行者i:が1の中間証明書の主体s:に、1の発行者が2の主体につながり、2の発行者のISRG Root X1はクライアントの信頼ストアにあることと、Verification: OKとVerified peernameが出れば鎖と名前の両方を検証でき、中間証明書が送られていないとVerify return code: 21になることを示す図"/></figure>



<ul class="wp-block-list">
<li><code>-starttls smtp</code>で、EHLOとSTARTTLSまでを自動で行う。EHLOの名前は<code>-name</code>（省略時はmail.example.com）。465番では<code>-starttls smtp</code>を外す。<code>-crlf</code>で改行をCRLFにする</li>


<li><strong>Certificate chain</strong>：0がサーバー証明書、1以降がサーバーの送った中間証明書。<strong>各番号のi:が次の番号のs:とつながるか</strong>を見る。かつてのLet&#8217;s EncryptのDST Root CA X3は2021年に期限切れで、現在はYR1→Root YR→ISRG Root X1のような鎖になる（連載「証明書入門」第7回）</li>


<li><code>Verification: OK</code>と<code>Verified peername:</code>が出れば、<strong>チェーンと名前の両方の検証に成功</strong>している。名前は<code>-verify_hostname</code>を付けたときだけ検証する</li>


<li>最後の<code>250 …</code>はSTARTTLSの前のEHLOの応答の残りで、ここからEHLOを打ち直す</li>


<li>対話中に<code>RCPT TO</code>や<code>QUIT</code>を打つと、行頭のR・Qがs_clientのコマンド（再ネゴシエーション・終了）と解釈される。<strong><code>-nocommands</code>を付けるか、小文字で打つ</strong></li>
</ul>



<h3 class="wp-block-heading"><span id="toc7">WindowsでSTARTTLS後の証明書を見る（SslStream）</span></h3>



<pre class="wp-block-code"><code>$tcp = [System.Net.Sockets.TcpClient]::new(&#x27;mail.example.jp&#x27;, 25)
$st = $tcp.GetStream(); $r = [System.IO.StreamReader]::new($st)
$w = [System.IO.StreamWriter]::new($st); $w.NewLine = &quot;`r`n&quot;; $w.AutoFlush = $true
function Read-Reply { do { $l = $r.ReadLine(); &quot;S: $l&quot; } while ($l -match &#x27;^\d{3}-&#x27;) }
Read-Reply | Out-Null
$w.WriteLine(&#x27;EHLO pc01.example.jp&#x27;); Read-Reply | Out-Null
$w.WriteLine(&#x27;STARTTLS&#x27;); Read-Reply           # S: 220 2.0.0 Ready to start TLS
$ssl = [System.Net.Security.SslStream]::new($st, $false)
$ssl.AuthenticateAsClient(&#x27;mail.example.jp&#x27;)    # 検証（名前を含む）に失敗すると例外
$ssl.SslProtocol                                # Tls13
$c = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($ssl.RemoteCertificate)
$c | Format-List Subject, Issuer, NotAfter
$ssl.Dispose(); $tcp.Dispose()</code></pre>



<pre class="wp-block-code"><code>Subject  : CN=mail.example.jp
Issuer   : CN=YR1, O=Let&#x27;s Encrypt, C=US
NotAfter : 2026/11/25 14:33:41</code></pre>



<ul class="wp-block-list">
<li>STARTTLSへの220を受け取ったら、<strong>同じストリームの上で</strong>SslStreamのTLSハンドシェイクを始める。opensslの<code>-starttls smtp</code>と同じ動き</li>


<li>検証に失敗すると<code>AuthenticateAsClient</code>が例外を出す。中身だけを見たいときは、連載「証明書入門」第4回と同じ、検証を省く指定（<code>{ $true }</code>）を<strong>調べる目的に限って</strong>使う</li>


<li>Windowsの表示では、Issuerの並びがopensslと逆（CNが先）になる。PowerShell 7なら<code>$ssl.NegotiatedCipherSuite</code>で暗号スイートも分かる</li>
</ul>



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



<h2 class="wp-block-heading"><span id="toc8">⑤ AUTHを試す</span></h2>



<pre class="wp-block-code"><code>$ printf &#x27;\0alert@example.jp\0dummy-pass&#x27; | base64       # AUTH PLAIN：\0 ID \0 パスワード
AGFsZXJ0QGV4YW1wbGUuanAAZHVtbXktcGFzcw==
PS&gt; [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(&quot;`0alert@example.jp`0dummy-pass&quot;))
AGFsZXJ0QGV4YW1wbGUuanAAZHVtbXktcGFzcw==

$ openssl s_client -starttls smtp -connect relay.example.jp:587 -crlf -quiet -name app01.example.jp
EHLO app01.example.jp
（略）
250-AUTH PLAIN LOGIN
（略）
AUTH PLAIN AGFsZXJ0QGV4YW1wbGUuanAAZHVtbXktcGFzcw==
235 2.7.0 Authentication successful</code></pre>



<ul class="wp-block-list">
<li>AUTH PLAINは「<code>\0 ID \0 パスワード</code>」をBase64にして送る。AUTH LOGINは<code>334 VXNlcm5hbWU6</code>（Username:）と<code>334 UGFzc3dvcmQ6</code>（Password:）に、IDとパスワードを1つずつBase64で返す（RFC 4954、第4回）</li>


<li><strong>Base64は暗号ではない</strong>。ログやパケットキャプチャに残れば誰でも元に戻せる。必ずTLSの後で送り、試験には試験用のアカウントを使い、終わったらパスワードを変える</li>


<li>コマンドの履歴（<code>~/.bash_history</code>、PowerShellの履歴）にパスワードが残る。<code>read -s</code>や<code>Get-Credential</code>で入力して変数から組み立て、履歴を消す</li>


<li>失敗すると<code>535 5.7.8 Error: authentication failed</code>（Postfix）や<code>535 5.7.139 Authentication unsuccessful</code>（Microsoft 365。テナントでSMTP AUTHが無効など）が返る</li>
</ul>


<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="toc9">テストメールを送る：swaksとSend-MailMessage</span></h2>



<pre class="wp-block-code"><code>$ swaks --server relay.example.jp --port 587 --tls \
    --auth LOGIN --auth-user alert@example.jp \
    --from alert@example.jp --to ops@example.jp \
    --ehlo app01.example.jp --header &quot;Subject: swaks test&quot;
（抜粋）
&lt;-  220 relay.example.jp ESMTP Postfix
 -&gt; STARTTLS
&lt;-  220 2.0.0 Ready to start TLS
 ~&gt; AUTH LOGIN
&lt;~  235 2.7.0 Authentication successful
 ~&gt; MAIL FROM:&lt;alert@example.jp&gt;
&lt;~  250 2.1.0 Ok</code></pre>



<ul class="wp-block-list">
<li><strong>swaks</strong>はSMTPの試験用ツール（最新は20240103.0）。<code>--tls</code>（STARTTLSが必須）、<code>--tls-on-connect</code>（465番）、<code>--auth</code>、<code>--quit-after RCPT</code>（RCPT TOまで試して送らない）など、手打ちの手順を1行にできる。<code>-&gt;</code>が送信、<code>&lt;-</code>が受信、<code>~</code>付きはTLSの中のやり取り</li>


<li>パスワードは<code>--auth-password</code>で渡さず、<strong>プロンプトで入力する</strong>（履歴に残さない）</li>


<li>Windowsの<strong>Send-MailMessageは、Microsoftが非推奨</strong>（obsolete）としている。SMTPサーバーとの安全な接続を保証できないためで、PowerShellに直接の後継は無い。Microsoftは、サードパーティのMailKit、Exchange OnlineならMicrosoft Graphの<code>Send-MgUserMail</code>を案内している</li>
</ul>



<p class="wp-block-paragraph">疎通や拒否の理由を調べるだけなら、送らずに、TcpClientの方法でRCPT TOまで確かめれば足ります。</p>



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



<h2 class="wp-block-heading"><span id="toc10">ヘッダーの解析（Receivedをたどる）</span></h2>



<p class="wp-block-paragraph">届いたメールからは、ヘッダーで経路をたどります（第3回）。</p>



<pre class="wp-block-code"><code>Authentication-Results: mx.example.com; spf=pass smtp.mailfrom=example.jp;
        dkim=pass header.d=example.jp; dmarc=pass header.from=example.jp
Received: from mx.example.com (mx.example.com [198.51.100.25])
        by mbox01.example.com with LMTP id 7fKp0Q; Sat, 26 Sep 2026 10:15:03 +0900   ← ③
Received: from relay.example.jp (relay.example.jp [203.0.113.30])
        by mx.example.com (Postfix) with ESMTPS id 4ZbQ1x2Kp3z9
        for &lt;user@example.com&gt;; Sat, 26 Sep 2026 10:15:02 +0900 (JST)             ← ②
Received: from app01.example.jp (app01.example.jp [192.0.2.21])
        by relay.example.jp (Postfix) with ESMTP id 8C1E0A1B2F
        for &lt;user@example.com&gt;; Sat, 26 Sep 2026 10:15:01 +0900 (JST)             ← ①</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail09-s110.png" alt="Receivedヘッダーを下の行から順に左から並べると、app01からrelay.example.jp（キューID 8C1E0A1B2F）へ10:15:01にESMTPで、mx.example.com（キューID 4ZbQ1x2Kp3z9）へ10:15:02にESMTPSで、mbox01（受信箱）へ10:15:03にLMTPで渡り、送信側が書いた行は偽って書けるので自組織が付けた行で判断することを示す図"/></figure>



<ul class="wp-block-list">
<li><strong>下から上へ読む</strong>と、最初のサーバーから受信箱までの経路になる。各行のfrom（送ってきた相手）と、1つ下の行のby（受け取ったサーバー）がつながっているかを見る</li>


<li><strong>時刻の差がそのサーバー間の遅延</strong>。<code>with ESMTPS</code>はTLSで受け取ったことを示す。<code>id</code>はそのサーバーのキューIDで、ログの追跡に使える</li>


<li><strong>自組織のサーバーが付けた行より下は、送信者が偽って書ける</strong>。判断は、自組織の受信サーバーの行とAuthentication-Resultsで行う</li>


<li>長いヘッダーは、MicrosoftのMessage Header Analyzer（解析はブラウザーの中で行う）やGoogle Admin ToolboxのMessageheaderに貼り付けると、経路と遅延を表で見られる。後者は入力をサーバーへ送るため、<strong>個人情報を含むヘッダーの扱いに注意</strong>する</li>
</ul>



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



<h2 class="wp-block-heading"><span id="toc11">ログの追跡（キューID・Message-ID）</span></h2>



<pre class="wp-block-code"><code># ① 利用者のヘッダーの Message-ID から、このサーバーのキューIDを探す
$ grep &#x27;message-id=&lt;20260926011501.4F2A@app01.example.jp&gt;&#x27; /var/log/maillog
Sep 26 10:15:01 relay postfix/cleanup[2346]: 8C1E0A1B2F: message-id=&lt;20260926011501.4F2A@app01.example.jp&gt;
# ② キューIDで1通の全行を出す（第8回）
$ grep 8C1E0A1B2F /var/log/maillog
# ③ 相手のキューID（queued as …）を相手の管理者に伝える
… status=sent (250 2.0.0 Ok: queued as 4ZbQ1x2Kp3z9)

# Microsoft 365 の場合（Exchange Online PowerShell）
PS&gt; Get-MessageTraceV2 -MessageId &#x27;&lt;20260926011501.4F2A@app01.example.jp&gt;&#x27;</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.seichan.org/blog/wp-content/uploads/2026/09/mail09-s111.png" alt="送信元のアプリapp01からrelay.example.jp（自組織、キューID 8C1E0A1B2F）、mx.example.com（相手、キューID 4ZbQ1x2Kp3z9）へ渡るとき、Message-IDはどのサーバーでも同じで、キューIDはサーバーごとに別なので、サーバーをまたぐときはqueued asのキューIDでつなぐことを示す図"/></figure>



<ul class="wp-block-list">
<li><strong>Message-IDは全経路で変わらない</strong>（送信側が付けた値。無ければ最初のMTAが付ける）。<strong>キューIDはサーバーごとに変わる</strong>。Message-IDで入口を見つけ、キューIDでそのサーバーの中を追う</li>


<li>サーバーが複数台なら、時刻をそろえて（NTP・タイムゾーン）突き合わせる。ログはsyslogサーバーやSIEMに集めておく（連載「syslog入門」）</li>


<li>Microsoft 365はメッセージ追跡（Exchange管理センター、または<code>Get-MessageTraceV2</code>。旧<code>Get-MessageTrace</code>は2025年9月から廃止が進んでいる）、Google Workspaceは管理コンソールのメールログ検索で追う（第10回）</li>


<li>相手側に調べてもらうときは、<strong>時刻（タイムゾーン付き）・送信者・宛先・Message-ID・相手のキューID</strong>を伝える</li>
</ul>



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



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



<ol class="wp-block-list">
<li>WindowsのPCから<code>Test-NetConnection -Port 25</code>は成功するのに、複合機からのメールは届きません。次に何を、どの順で確かめますか。</li>


<li><code>openssl s_client -starttls smtp</code>で<code>Verify return code: 21 (unable to verify the first certificate)</code>が出ました。何が原因と考えられ、誰に何を頼みますか。</li>


<li>「取引先に送ったメールが届いていないと言われた」と利用者から連絡がありました。分かっているのは送信日時と宛先だけです。自組織のログと相手への依頼で、何を手がかりに追いますか。</li>
</ol>



<p class="wp-block-paragraph"><strong>ヒント</strong>：この記事の「下の層から順に確かめる」図とTcpClientの方法、Certificate chainの図と連載「証明書入門」第5回、Message-IDとキューIDの図が答えにつながります。</p>



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



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



<ul class="wp-block-list">
<li><strong>名前解決 → TCP → SMTP → TLS → 認証</strong>の順に、下の層から確かめる。最初に失敗した段に原因がある</li>


<li>疎通は<strong>送信元の機器から</strong>試す。timed outは遮断、Connection refusedは待ち受けなし</li>


<li>手でSMTPを話すなら、Linuxは<strong>nc -C</strong>、Windowsは<strong>PowerShellのTcpClient</strong>。RCPT TOまでで止めれば送られない</li>


<li>TLSは<strong>openssl s_client -starttls smtp</strong>か<strong>SslStream</strong>。Certificate chainは<strong>i:が次のs:につながるか</strong></li>


<li>AUTHのBase64は<strong>暗号ではない</strong>。履歴にパスワードを残さない</li>


<li>Send-MailMessageは<strong>非推奨</strong>。試験送信はswaks</li>


<li>1通を追うのは<strong>Message-ID</strong>、サーバーの中を追うのは<strong>キューID</strong>。またぐときは<strong>queued as</strong></li>
</ul>



<p class="wp-block-paragraph">次回は、<strong>Microsoft 365・Google Workspace・Amazon SES</strong>といったクラウドのメールと、機器からの通知メールの送り方を扱います。</p>



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



<h2 class="wp-block-heading"><span id="toc14">連載「メール入門」全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><a href="https://www.seichan.org/2026/10/mail-08-postfix.html" target="_blank">MTAの運用</a></li>


<li><strong>コマンドで調べる（この記事）</strong></li>


<li><a href="https://www.seichan.org/2026/10/mail-10-cloud.html" target="_blank">クラウドと現代のメール</a></li>


<li><a href="https://www.seichan.org/2026/10/mail-11-troubleshooting.html" target="_blank">メールのトラブルシュート</a></li>


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