メールサーバーを手動でテストするための実践ガイド。各SMTPコマンドの役割、サーバーの応答方法、telnetやopensslで完全な検証セッションを実行する方法を学べます。
SMTP(Simple Mail Transfer Protocol)は、プレーンテキストの行ベースのプロトコルです。つまり、ターミナルからメールサーバーに直接話しかけ、その応答をそのまま読み取ることができます—特別なソフトウェアは必要ありません。これは、メールボックスが存在するかどうか、サーバーに到達できるかどうか、そしてどのように構成されているかを確認する、最も透明性の高い方法です。
まずドメインのメールサーバー(MXホスト)を見つけ、そのSMTPポートへのTCP接続を開きます。古くからのポートは25です。サブミッションポートの587と2525は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からテストするか、サブミッションポートを使用してください。
コマンドを入力すると(大文字・小文字は区別されません)、サーバーは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を返し、接続を閉じます。 |
最初の桁がカテゴリを示すため、正確なコードを知らなくても、どんな応答でも読み取ることができます。
354)。| コード | 意味 |
|---|---|
220 | サービス準備完了(あいさつのバナー)。 |
221 | 接続を閉じています(QUITへの応答)。 |
250 | OK — コマンドが受け付けられました(RCPT TOのあとに望む応答)。 |
251 / 252 | ユーザーはローカルではないが転送される/検証できないが配信を試みる。 |
354 | メッセージ本文の送信を開始してください(DATAのあと)。 |
421 | サービスが利用できず、閉じています—多くの場合はレート制限です。 |
450 / 451 / 452 | 一時的な問題(メールボックスがビジー、ローカルエラー、ストレージ不足)。グレイリストはここに頻繁に現れます。 |
502 | コマンドが実装されていません(VRFY/EXPNへの典型的な応答)。 |
550 | メールボックスが利用できない/そのようなユーザーは存在しない—アドレスは存在しません。 |
551 / 552 / 553 / 554 | ユーザーはローカルではない/容量超過/不正なメールボックス名/トランザクション失敗。 |
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
4xxを返し、後で再度試みるよう求めます。4xxはアドレスが無効であることを意味しません。250で受け付け、後で振り分けます。その場合、RCPT TOでは特定のメールボックスが存在することを証明できません。キャッチオールを検出するには、明らかにランダムなアドレスを試してみてください。それも受け付けられるなら、そのドメインはキャッチオールです。MX参照、キャッチオール検出、わかりやすい判定を含めて、これを自動でおこないたいですか? ホームページのメールチェッカーをご利用ください。