SMTP通信をtelnetで確認する方法

目次
telnetを使ってSMTP通信を確認する方法を解説
メールサーバの構築やトラブルシューティングを行う際、SMTP通信が正常に行われているか確認したい場面があります。
例えば「メールが送信できない」「SMTPサーバへ接続できない」「認証エラーが発生する」といった問題が発生した場合、SMTPサーバと直接通信して確認することで原因を特定しやすくなります。
その際によく利用されるのがtelnetコマンドです。
SMTPはテキストベースのプロトコルであるため、telnetから直接SMTPコマンドを入力して通信内容を確認できます。
現在ではopensslコマンドやswaksなども利用されますが、SMTPの仕組みを理解するためにはtelnetによる確認方法を知っておくことが重要です。
本記事ではtelnetを利用してSMTP通信を確認する方法を詳しく解説します。
SMTP通信確認が必要な場面
SMTP通信の確認は以下のような場面で行います。
- メール送信できない
- SMTPサーバが起動しているか確認したい
- SMTPポートが開いているか確認したい
- メール配送経路を調査したい
- SMTPサーバの応答を確認したい
- メールサーバ構築後の動作確認
実務では障害調査時によく利用されます。
SMTPはテキストベースのプロトコル
SMTPはHTTPと同様にテキストベースのプロトコルです。
SMTPサーバへ接続すると、人間が読める形式で通信が行われます。
例えば以下のような応答が返ってきます。
220 mail.example.com ESMTP Postfixそのためtelnetから直接コマンドを入力して動作確認が可能です。
telnetとは
telnetはTCP通信を行うためのコマンドです。
本来はリモートログイン用途で利用されていましたが、現在ではサービスの疎通確認ツールとして利用されることが多くなっています。
SMTP確認では特に以下の用途で活躍します。
- SMTPポート接続確認
- SMTP応答確認
- メール配送確認
telnetのインストール
AlmaLinuxやRocky Linuxでは以下のコマンドでインストールできます。
# dnf install -y telnetインストール後に利用可能になります。
SMTPサーバへ接続する
まずはSMTPサーバへ接続してみましょう。
例えばローカルのSMTPサーバへ接続する場合は以下を実行します。
# telnet localhost 25
またはリモートサーバの場合です。
# telnet mail.example.com 25接続に成功すると以下のような応答が返ります。
Trying 192.168.1.10...
Connected to mail.example.com.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix220はSMTPサーバが正常に待受していることを意味します。
接続できない場合
接続できない場合は次のようなエラーになります。
Connection refused
または
Connection timed outこの場合は以下を確認します。
- SMTPサーバ起動状況
- ポート開放状況
- firewalld設定
- ネットワーク疎通
EHLOコマンドを送信する
接続後はSMTPコマンドを入力できます。
まずEHLOコマンドを送信します。
EHLO localhost
正常な応答例です。
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-STARTTLS
250 AUTH LOGIN PLAINSMTPサーバが対応している機能が表示されます。
HELOとEHLOの違い
SMTPにはHELOとEHLOがあります。
| コマンド | 用途 |
|---|---|
| HELO | 従来SMTP |
| EHLO | 拡張SMTP(ESMTP) |
現在はEHLOを利用するのが一般的です。
MAIL FROMコマンド
送信者を指定するにはMAIL FROMを利用します。
MAIL FROM:
成功すると以下が返ります。
250 2.1.0 Ok
250は成功を意味する応答コードです。
RCPT TOコマンド
続いて宛先を指定します。
RCPT TO:
正常な場合は次のようになります。
250 2.1.5 Ok
存在しないユーザーの場合はエラーになることがあります。
550 User unknown
DATAコマンド
メール本文を送信するためにDATAコマンドを実行します。
DATA
SMTPサーバから以下の応答が返ります。
354 End data with .
354は本文入力待ち状態を意味します。
メール本文を入力する
次のようにメール内容を入力します。
Subject: Test Mail Hello SMTP .
最後に「.」だけの行を入力します。
これがメール終了を意味します。
成功すると次のような応答になります。
250 2.0.0 Ok: queued as A1B2C3D4
メールキューへ登録されたことを意味します。
QUITで終了する
SMTP通信を終了する場合はQUITコマンドを入力します。
QUIT
応答例です。
221 2.0.0 Bye
その後接続が切断されます。
SMTP通信確認の一連の流れ
全体をまとめると以下のようになります。
# telnet localhost 25
EHLO localhost
MAIL FROM:
RCPT TO:
DATA
Subject: Test Mail
Hello SMTP
.
QUITこれだけでSMTP通信の基本確認が可能です。
SMTP応答コードを確認する
SMTPでは応答コードが重要です。
| コード | 意味 |
|---|---|
| 220 | サービス開始 |
| 250 | 成功 |
| 354 | 本文入力待ち |
| 421 | サービス利用不可 |
| 450 | 一時的失敗 |
| 550 | 配送拒否 |
エラー発生時には応答コードを確認することが重要です。
465番ポートではtelnetは利用できない
SMTP over SSL(465番ポート)は接続直後から暗号化されます。
そのためtelnetでは通信内容を確認できません。
465番ポートを確認する場合はopensslコマンドを利用します。
# openssl s_client -connect mail.example.com:465暗号化SMTPの確認ではこちらを利用します。
587番ポートとSTARTTLS
587番ポートではSTARTTLSが利用されます。
接続自体はtelnetで可能ですが、その後のTLS通信は確認できません。
STARTTLSの動作確認もopensslを利用することが一般的です。
# openssl s_client -starttls smtp -connect mail.example.com:587実務でよくある調査項目
メール障害時には以下を確認します。
- 25番ポート接続可能か
- SMTPサーバは応答するか
- EHLOに正常応答するか
- RCPT TOで拒否されないか
- メールキューへ登録されるか
telnetによる確認は現在でも有効なトラブルシューティング手法です。
まとめ
SMTPはテキストベースのプロトコルであるため、telnetを利用して直接通信内容を確認できます。
SMTPサーバへ接続し、EHLO、MAIL FROM、RCPT TO、DATAといったコマンドを実行することで、メール配送の動作確認が可能です。
また、SMTP応答コードを確認することで、配送エラーや認証エラーの原因を特定しやすくなります。
メールサーバの構築や運用を行うエンジニアにとって、telnetによるSMTP通信確認は覚えておきたい基本テクニックの一つです。






