2026年5月21日
2026年5月21日
メール送信テストの方法|telnet・curl・swaksでSMTPサーバーを確かめる
WordPress のお問い合わせフォームからメールが届かない、メールサーバーを新しく設定した、といったときは、まずサーバーに直接 SMTP で接続して「メールを受け付けてくれるか」を確かめると、原因を切り分けやすくなります。
この記事では、次の3つの道具を使った確かめ方を説明します。
| 道具 | 向いている使い方 |
|---|---|
telnet / nc |
SMTP のやり取りを1行ずつ手で打ち、どこで止まるかを見る(暗号化なし) |
curl |
用意したメールファイルを、STARTTLS や認証つきで1行のコマンドで送る |
swaks |
SMTP のテスト専用ツール。TLS・認証・ヘッダー・添付を引数で指定でき、やり取りがすべて表示される |
コマンドと応答は、2026年10月時点の Debian 13 上の Postfix 3.10、curl 8.14.1、swaks 20240103.0 で確認しています。サーバー名 mail.example.com やメールアドレスは、自分の環境のものに置き換えてください。
準備:ポートとインストール
SMTP でよく使うポートは次の3つです。
| ポート | 用途 | 暗号化 |
|---|---|---|
| 25 | サーバー同士のメール配送 | 接続後に STARTTLS で切り替え(任意) |
| 587 | メールソフトやアプリからの送信(サブミッション)。通常は認証が必要 | 接続後に STARTTLS で切り替え |
| 465 | 587 と同じ用途 | 接続した最初から TLS |
自宅の回線やクラウドのサーバーからは、外向きの 25 番ポートへの接続がプロバイダー側で止められていることがよくあります(OP25B)。25 番に接続できないときは、まず 587 番か 465 番で試してください。
道具は次のようにインストールします。
# Debian / Ubuntu
sudo apt install telnet netcat-openbsd curl swaks
# RHEL / AlmaLinux / Rocky Linux(swaks は EPEL にあります)
sudo dnf install telnet nmap-ncat curl
sudo dnf install epel-release && sudo dnf install swaks
telnetで手動でやり取りする
telnet でサーバーの 25 番ポートに接続し、SMTP のコマンドを1行ずつ入力します。> の行が自分で入力する行、それ以外がサーバーの応答です(> 自体は入力しません)。
$ telnet mail.example.com 25
220 mail.example.com ESMTP Postfix (Debian)
> EHLO client.example.com
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 CHUNKING
> MAIL FROM:<test@example.com>
250 2.1.0 Ok
> RCPT TO:<user@example.com>
250 2.1.5 Ok
> DATA
354 End data with <CR><LF>.<CR><LF>
> Subject: telnet test
>
> hello
> .
250 2.0.0 Ok: queued as A4D8E35FE9
> QUIT
221 2.0.0 Bye
| コマンド | 意味 |
|---|---|
EHLO 名前 |
挨拶。応答の 250- の行に、サーバーが使える機能(STARTTLS、AUTH など)が並ぶ |
MAIL FROM:<アドレス> |
差出人(エンベロープの送信者) |
RCPT TO:<アドレス> |
宛先。ここで拒否されることが多い |
DATA |
本文の入力を始める。ヘッダー、空行、本文を書き、. だけの行で終える |
QUIT |
切断する |
最後に 250 2.0.0 Ok: queued as ... が返れば、サーバーはメールを受け付けています。queued as のあとの文字列はキュー ID で、サーバーのログを探すときの手がかりになります。
telnet が入っていない場合は nc mail.example.com 25 でも同じように操作できます。どちらも暗号化しないので、パスワードを使う認証(AUTH)の確認には使わないでください。暗号化した接続を手で確かめたい場合は、openssl を使います。
# 587番ポートに接続し、STARTTLS で暗号化してから SMTP の入力を受け付ける
openssl s_client -starttls smtp -connect mail.example.com:587 -crlf -quiet
curlでメールファイルを送る
curl は SMTP にも対応しています。まず、ヘッダーと本文を書いたメールファイル mail.txt を用意します(ヘッダーと本文の間は空行)。
From: test@example.com
To: user@example.com
Subject: curl test
This is a test message sent with curl.
25 番ポートに認証なしで送る場合は次のとおりです。
curl --url smtp://mail.example.com:25 \
--mail-from test@example.com \
--mail-rcpt user@example.com \
--upload-file mail.txt
587 番ポートで STARTTLS と認証を使う場合は、--ssl-reqd と --user を付けます。--user にユーザー名だけを書くと、パスワードの入力を求められます(コマンド履歴にパスワードが残りません)。
curl --url smtp://mail.example.com:587 --ssl-reqd \
--user 'test@example.com' \
--mail-from test@example.com \
--mail-rcpt user@example.com \
--upload-file mail.txt
465 番ポートの場合は、URL を smtps://mail.example.com:465 にします。
成功すると何も表示されず、終了コードは 0 です。-v を付けると、SMTP のやり取りがすべて表示されます。失敗したときは、次のようにエラーが表示されます。
| 表示 | よくある原因 |
|---|---|
curl: (7) Failed to connect to ... |
ポートが閉じている、ファイアウォールや OP25B で止められている |
curl: (55) RCPT failed: 550 |
宛先が存在しない、または中継(リレー)を許可されていない |
curl: (67) ...(認証の失敗) |
ユーザー名かパスワードが違う、または認証方式が合わない |
curl: (60) SSL certificate problem: ... |
サーバー証明書を検証できない(自己署名、ホスト名の不一致など) |
自己署名の証明書を使っているテスト用のサーバーでは、-k を付けると検証を省略できます。本番のサーバーでは付けずに試してください。
swaksでテストする
swaks(Swiss Army Knife for SMTP)は SMTP のテスト専用のツールで、メールファイルを用意しなくても、引数だけでテストメールを組み立てて送れます。
swaks --to user@example.com --from test@example.com \
--server mail.example.com \
--header "Subject: swaks test" \
--body "This is a test message sent with swaks."
実行すると、やり取りがすべて表示されます。-> が送った内容、<- がサーバーの応答です。
=== Trying mail.example.com:25...
=== Connected to mail.example.com.
<- 220 mail.example.com ESMTP Postfix (Debian)
-> EHLO client.example.com
<- 250-mail.example.com
...
-> MAIL FROM:<test@example.com>
<- 250 2.1.0 Ok
-> RCPT TO:<user@example.com>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
...
<- 250 2.0.0 Ok: queued as C696B3ABED
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
よく使うオプション
| オプション | 意味 |
|---|---|
--server ホスト名 |
接続先のサーバー |
--port 番号 |
ポート(省略時は 25) |
--tls |
STARTTLS を必須にする。使えなければ終了する |
--tls-on-connect |
最初から TLS で接続する。ポートの初期値が 465 になる |
--auth LOGIN |
認証を必須にする(PLAIN、CRAM-MD5 なども指定可。省略するとサーバーが示す方式を順に試す) |
--auth-user / --auth-password |
認証のユーザー名とパスワード。パスワードを省略すると入力を求められる |
--header "名前: 値" |
ヘッダーを追加する |
--body "本文" |
本文を指定する |
--attach ファイル |
ファイルを添付する |
--quit-after RCPT |
指定した段階で接続を終える(メールは送らない) |
587 番ポートで STARTTLS と認証を使う例です。
swaks --to user@example.com --from test@example.com \
--server mail.example.com --port 587 \
--tls --auth LOGIN --auth-user test@example.com
認証つきの実行では、やり取りの表示に Base64 で符号化したユーザー名とパスワードが含まれます。Base64 は簡単に元に戻せるので、出力をそのまま人に送ったり、公開の場所に貼ったりしないでください。
メールを送らずに宛先だけ確かめる
--quit-after RCPT を付けると、宛先を指定した段階で切断し、メールは送りません。宛先が受け付けられるかどうかだけを確かめたいときに使えます。
swaks --to nosuchuser@example.com --from test@example.com \
--server mail.example.com --quit-after RCPT
存在しない宛先なら、次のように拒否されます。
<** 550 5.1.1 <nosuchuser@example.com>: Recipient address rejected: User unknown in local recipient table
応答コードの読み方
SMTP の応答は、先頭の3桁の数字で結果がわかります。
| 先頭の数字 | 意味 | 例 |
|---|---|---|
| 2xx | 成功 | 250 2.0.0 Ok: queued as ... |
| 3xx | 続きの入力を待っている | 354 End data with <CR><LF>.<CR><LF> |
| 4xx | 一時的なエラー。時間をおいて再送される | 451 4.3.0、421 |
| 5xx | 恒久的なエラー。再送しても失敗する | 550 5.1.1 User unknown、554 5.7.1 Relay access denied、535 5.7.8 Authentication failed |
Relay access denied は、認証していない状態で、そのサーバーが受け持っていないドメイン宛てに送ろうとしたときによく出ます。587 番ポートで認証してから送るか、サーバーの中継の設定を見直します。
サーバー側のログで確かめる
テストメールが「受け付けられた」あとに届かない場合は、送信したサーバーのログで、その先の配送がどうなったかを確認します。queued as のキュー ID で検索すると、そのメールの記録だけを追えます。
# Debian / Ubuntu(rsyslog がある場合)
sudo grep A4D8E35FE9 /var/log/mail.log
# RHEL 系(rsyslog がある場合)
sudo grep A4D8E35FE9 /var/log/maillog
# rsyslog がない環境(systemd のジャーナル)
sudo journalctl --since "1 hour ago" | grep A4D8E35FE9
ログの status=sent は相手のサーバーに渡せたこと、status=deferred は一時的なエラーで再送待ちになっていること、status=bounced は配送できずにエラーメールを返したことを表します。再送待ちのメールの確認方法は、Postfix のキューの記事で説明しています。
注意点
- テスト先のアドレス:テストメールは、自分が管理しているアドレスに送ります。他人のアドレスや存在しないドメインに大量に送ると、送信元の評価が下がる原因になります
- 認証情報の扱い:パスワードはコマンドラインに直接書かず、入力を求められたときに入力します。暗号化していない接続(
telnet、STARTTLS なしのcurl)でAUTHを使わないでください - 届いたかどうかは別の確認:
250 Ok: queuedは「サーバーが受け付けた」という意味で、相手の受信箱に届いたことまでは示しません。迷惑メールフォルダーも含め、受信側でも確認します
まとめ
- まず
telnetやncで SMTP のやり取りを手で確かめると、どの段階で拒否されるかがわかる curlはメールファイルを--mail-from・--mail-rcpt・--upload-fileで送り、--ssl-reqdと--userで 587 番の STARTTLS と認証に対応できるswaksは TLS・認証・ヘッダー・添付を引数で指定でき、--quit-after RCPTで送らずに宛先を確かめられる- 応答コードの 4xx は一時的、5xx は恒久的なエラー。受け付けられたあとはキュー ID でサーバーのログを追う
関連記事: