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

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 Postfix

220は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 PLAIN

SMTPサーバが対応している機能が表示されます。

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通信確認は覚えておきたい基本テクニックの一つです。