telnetによるSMTPチェック

メールサーバーを手動でテストするための実践ガイド。各SMTPコマンドの役割、サーバーの応答方法、telnetやopensslで完全な検証セッションを実行する方法を学べます。

SMTP(Simple Mail Transfer Protocol)は、プレーンテキストの行ベースのプロトコルです。つまり、ターミナルからメールサーバーに直接話しかけ、その応答をそのまま読み取ることができます—特別なソフトウェアは必要ありません。これは、メールボックスが存在するかどうか、サーバーに到達できるかどうか、そしてどのように構成されているかを確認する、最も透明性の高い方法です。

1. メールサーバーへの接続

まずドメインのメールサーバー(MXホスト)を見つけ、そのSMTPポートへのTCP接続を開きます。古くからのポートは25です。サブミッションポートの5872525はSTARTTLSとともに使用され、ポート465は暗黙のTLS(SMTPS)です。

平文接続(ポート25):

telnet mail.example.com 25

STARTTLSポート(587または25)— telnetはTLSを扱えないため、opensslを使用します:

openssl s_client -connect mail.example.com:587 -starttls smtp -crlf

暗黙のTLSポート(465):

openssl s_client -connect mail.example.com:465 -crlf

注意:多くの家庭用および携帯回線のISPは、スパム対策として送信ポート 25をブロックしています。telnet ... 25がただ応答せずに止まってしまう場合、それは通常メールサーバーではなく、あなたのプロバイダーが原因です。ポート 25が開いているサーバー/VPSからテストするか、サブミッションポートを使用してください。

2. SMTPコマンドの解説

コマンドを入力すると(大文字・小文字は区別されません)、サーバーは3桁のコードとテキストで応答します。すべてのコマンドはEnter(CRLF)で終了させます。

コマンド機能
HELO domain旧式のあいさつ。接続元ホストを名前で識別します。サーバーは250を返します。
EHLO domain現代的なあいさつ(拡張HELO)。HELOと同様ですが、サーバーはサポートする拡張機能(STARTTLS、AUTH、SIZE、PIPELINING…)も一覧で示します。
MAIL FROM:<addr>新しいメッセージを開始し、エンベロープの送信者(“リターンパス”)を設定します。受け付けられると250が返ります。
RCPT TO:<addr>検証における鍵となるコマンドです。サーバーに宛先を受け付けるよう求めます。250 = メールボックスが受け付けられた、550 = そのようなユーザーは存在しない、4xx = 後で再試行(例:グレイリスト)。
DATAメッセージ本文を開始します。サーバーは354を返し、ヘッダーと本文を送信したあと、単独の行にピリオド1つ.を置いて終了します。(検証チェックでは、このステップに達することはありません。)
RSET接続を閉じることなく、現在のトランザクションをリセットします(MAIL FROM/RCPT TOを破棄します)。
VRFY userサーバーにユーザー名/アドレスの検証を求めます。まさにこの目的のために設計されましたが、有効なアドレスをスパマーに漏らしてしまうため、今日ではほぼ常に無効化されています252または502を返します)。
EXPN listサーバーにメーリングリストをメンバーへ展開するよう求めます。VRFYと同様、同じプライバシー上の理由からほぼあらゆる場所で無効化されています
STARTTLS平文接続を暗号化されたTLSにアップグレードします(ポート25/587で)。EHLOの応答に記載されている場合にのみ提供されます。
AUTH LOGIN / PLAINユーザーを認証します(サブミッションポート経由でメールを送信するために必要であり、検証には必要ありません)。
NOOP何もしません。サーバーは250を返します。接続を維持したり、応答性をテストしたりするのに便利です。
HELPサーバーにサポートするコマンドの一覧を求めます。
QUITセッションを丁寧に終了します。サーバーは221を返し、接続を閉じます。

3. 応答コード

最初の桁がカテゴリを示すため、正確なコードを知らなくても、どんな応答でも読み取ることができます。

  • 2xx — 成功(コマンドが受け付けられた)。
  • 3xx — 中間段階で、サーバーはさらなる入力を求めています(例:DATAのあとの354)。
  • 4xx — 一時的な失敗:後で再試行してください。アドレスは有効である可能性があります。
  • 5xx — 恒久的な失敗:コマンドまたはアドレスが拒否されました。
コード意味
220サービス準備完了(あいさつのバナー)。
221接続を閉じています(QUITへの応答)。
250OK — コマンドが受け付けられました(RCPT TOのあとに望む応答)。
251 / 252ユーザーはローカルではないが転送される/検証できないが配信を試みる。
354メッセージ本文の送信を開始してください(DATAのあと)。
421サービスが利用できず、閉じています—多くの場合はレート制限です。
450 / 451 / 452一時的な問題(メールボックスがビジー、ローカルエラー、ストレージ不足)。グレイリストはここに頻繁に現れます。
502コマンドが実装されていません(VRFY/EXPNへの典型的な応答)。
550メールボックスが利用できない/そのようなユーザーは存在しない—アドレスは存在しません。
551 / 552 / 553 / 554ユーザーはローカルではない/容量超過/不正なメールボックス名/トランザクション失敗。

4. 完全な実例

john@example.comが存在するかどうかを確認します。あなたが入力する行は>で示されており、それ以外はすべてサーバーの応答です。

$ telnet mail.example.com 25 220 mail.example.com ESMTP ready > EHLO checkemail.test 250-mail.example.com Hello checkemail.test 250-STARTTLS 250-SIZE 52428800 250 PIPELINING > MAIL FROM:<probe@checkemail.test> 250 2.1.0 Ok > RCPT TO:<john@example.com> 250 2.1.5 Ok ← mailbox EXISTS > RSET 250 2.0.0 Ok > QUIT 221 2.0.0 Bye

一方、もし宛先が存在しない場合は、次のような応答が表示されます。

> RCPT TO:<nosuchuser@example.com> 550 5.1.1 <nosuchuser@example.com>: Recipient address rejected: User unknown

5. 結果を不確かにする要因

  • グレイリスト — サーバーは最初の試行時に意図的に一時的な4xxを返し、後で再度試みるよう求めます。4xxはアドレスが無効であることを意味しません。
  • キャッチオールドメイン — 一部のサーバーはすべての宛先を250で受け付け、後で振り分けます。その場合、RCPT TOでは特定のメールボックスが存在することを証明できません。キャッチオールを検出するには、明らかにランダムなアドレスを試してみてください。それも受け付けられるなら、そのドメインはキャッチオールです。
  • 不正利用対策 — サーバーは応答を遅らせたり、本当の状態を隠したり、一つのIPからの繰り返しの問い合わせをブロックしたりすることがあります。礼儀正しくテストし、サーバーに負荷をかけすぎないようにしましょう。
  • VRFY/EXPNの無効化 — これらに頼らないでください。実用的なシグナルはRCPT TOです。

MX参照、キャッチオール検出、わかりやすい判定を含めて、これを自動でおこないたいですか? ホームページのメールチェッカーをご利用ください。