携帯電話宛バウンス発生の仕組みを推測

携帯電話宛バウンスの宛先不明とドメイン指定拒否を見分ける という文書で、主にNTT docomo宛に送ったメールがバウンスした場合、 それが「宛先不明」なのか「ドメイン指定拒否」なのかを簡易に目視で見分ける方法を 紹介しました。

この文書は、その原理といいますか、キャリア側メールゲートウェイの仕組みを 推測してみることによって、より汎用的なバウンスの見分けを試みます。


初出: bouncehammer.jp/ja/email-topics/mechanism-of-email-bounce

SMTPについて

電子メールはSMTP というプロトコルを使用して送信されます。 SMTPは主にMTA(メールサーバ)間での電子メールのやりとりに使用されるプロトコルで、 TCPの25番ポートを使用します。

25番ポート以外では、OutlookやThunderbirdなどのメールソフトで作ったメールを プロバイダや会社のメールサーバに送信する時に使用する 587番(Submission)があります。

SMTPコマンド

メールサーバの管理者であれば、telnetコマンドを使用してSMTP通信を行うといった作業は 日常茶飯事でしょう。 SMTPはテキストベースのプロトコルですので、telnet コマンドを使用してMTA同士が 行っている通信を容易に再現できます。

バウンスの仕組みを推測する前に、簡単によく使うSMTPコマンドについて触れておきます。

HELO

HELO | EHLO

HELOまたはEHLO(ESMTPのHELO)コマンドは、相手側MTAにSMTP接続した際に 最初に使用するコマンドです。引数には自分のホスト名またはIPアドレスを指定します。 いわゆる挨拶です。

  • 例1) HELO mx.libsisimai.org ←自分のホスト名(相手のホスト名ではない)を名乗る
  • 例2) HELO [192.0.2.25] ←自分のIPアドレスを[ ]で囲って名乗る
MAIL

MAIL FROM

送信するメールの発信者アドレスを指定します。 ここで指定する発信者アドレスは、エンベロープFromと呼ばれるもので、 メールアドレスのみを指定します。

メールソフトのFromに表示される差出人とは別物です。 宛先不明などのバウンスが発生した場合は、 このエンベロープFromで指定した アドレスにエラーメール(バウンスメール)が送信されます。

  • 例) MAIL FROM: <neko@example.jp>
RCPT

RCPT TO

送信するメールの受信者アドレス(宛先)を指定します。 前述のMAIL FROMと同様、エンベロープToと呼ばれ、 メールアドレスのみを指定します。メールソフトの宛先(To:) に表示されるメールアドレスとは別物です。

  • 例) RCPT TO: <nyan@example.org>
DATA

DATA

ヘッダも含めた電子メールの内容を開始するコマンドです。 このコマンド入力直後に、メールヘッダや本文を入力し、全て入力が終えたら、 .(単一のドット)を入れてデータ部分の終了となります。

QUIT

QUIT

SMTPセッションを終了します。このコマンドを入力すると相手側メールサーバとの SMTP通信が終了し、接続が切断されます。

宛先不明をtelnetで再現する

宛先不明であることが確実なメールアドレスに送信する、というSMTPセッションを telnetコマンドで再現してみます。

必ず自分の管理下にあるメールサーバに対してのみ行ってください。よそのメールサーバに 対して行った場合、攻撃やスパム送信のためのメールアドレス調査と見なされることがあります。 接続元の環境によっては OP25B(Outbound Port 25 Blocking によって接続できない場合があります。

$ telnet mx.example.org 25
Trying 192.0.2.1...
Connected to mx.example.org.
Escape character is '^]'.
220 Sendmail ESMTP 8.14.4/8.14.4; Sun, 12 Dec 2010 23:44:43 -0800
HELO [192.0.2.2] ←自分のIPアドレスを名乗る
250 mx.example.org Hello mta.example.jp [192.0.2.2], pleased to meet you
MAIL FROM: <neko@example.jp> ←エンベロープFrom
250 2.1.0 <neko@example.jp>... Sender ok
RCPT TO: <nyan@example.org> ←エンベロープTo
550 5.1.1 <nyan@libsisimai.org>... User Unknown ←宛先不明と言われる
QUIT ←SMTPセッションを終了
221 2.0.0 mx.libsisimai.org closing connection
Connection closed by foreign host.
                

上記のように、SMTPのRCPT TOコマンドでエラーを返してきた場合、 RCPT TOで指定した宛先アドレスはほぼ確実に存在しないといえます。 携帯電話宛の場合も同様です。

携帯電話宛バウンスの宛先不明とドメイン指定拒否を見分ける の文書で例示しているように、Unknown userと書かれている バウンスメールの本文にRCPT TOでエラーになったと 読み取れた場合は、宛先不明(存在しないメールアドレス)という事になります。

ドメイン指定拒否をtelnetで再現する

ここでは例示の為に@docomo.ne.jpのメールサーバに 接続する記述をしていますが、安易に行わないでください。 通常のメール送信と同様に、ドメイン指定拒否をしているアドレスに対しての過度な送信試行は、 キャリア側から接続を拒否されるだけでなく、接続元のIPアドレスからキャリア側に全く接続 できなくなったりする事があります。 また攻撃やスパム送信のためのメールアドレス調査と見なされる事もあります。 行う場合は自己責任の元、接続元ネットワークの管理者の許可を得て行ってください。 以下のコマンドは、弊社の携帯電話にドメイン指定拒否を設定した上で行ったテストです。 一部メールアドレスやIPアドレスは架空のものに差し替えています。

$ telnet mfsmax.docomo.ne.jp 25
Trying 203.138.180.112...
Connected to mfsmax.docomo.ne.jp.
Escape character is '^]'.
220 docomo.ne.jp ESMTP Service Ready
HELO [192.0.2.1] ←自分のIPアドレスを名乗る
250 Requested mail action okay, completed
MAIL FROM: <kijitora@example.com>
250 Requested mail action okay, completed
RCPT TO: <*********@docomo.ne.jp<
250 Requested mail action okay, completed ←この応答でRCPT TOで指定したアドレスは存在すると判明
DATA ←メールヘッダと本文の開始
354 Start mail input; end with .
Subject: Nyaaaaaaaan
From: Kijitora <kijitora@example.com>
To: **********@docomo.ne.jp
 ←空白を1行入れてメール本文の開始
Nyaaaaaaan
. ←単一のドットでメール本文の終了
550 Unknown user ***********@docomo.ne.jp ←DATAで入力した内容に基づいてエラーが返る
QUIT ←SMTPセッションを終了する
221 docomo.ne.jp Service closing transmission channel
Connection closed by foreign host.
                

上記の流れから分かる事は次の通りです

  • 応答コード250からRCPT TOで指定した宛先は存在する
  • 最後の.(単一ドット)入力直後にエラー = DATAで入力した内容に基づいてエラーがでた
  • つまりFrom:ヘッダーに入力したメールアドレスが拒否対象であった = ドメイン指定拒否

あくまでtelnetコマンドで再現した結果からの推測ですが、ドメイン指定拒否は From:ヘッダのメールアドレスを見て、受け取るか否かを 決定しているようです。

携帯電話宛バウンスの宛先不明とドメイン指定拒否を見分ける の内容と照らし合わせると、Unknown user と書かれているバウンスメールの本文にDATAコマンドで エラーになったと読み取れた場合は、ドメイン指定拒否という事になります。

まとめ

この文書ではSMTP通信をtelnetコマンドによって再現しました。 メールサーバはいくつもの種類があり、また宛先メールサーバの管理方針も多種多様で、 一概には言えませんが、SMTPのRCPT TOコマンドでエラーを返してきた場合は 存在しないメールアドレス、DATAコマンド以降の入力内容でエラーを返してきた場合は、 宛先アドレスは存在するがヘッダまたは本文の内容に基づいてなんらかのフィルターが 働いたと言えるでしょう。

携帯電話宛以外においても、どのコマンドでエラーになったかはバウンスの理由を特定する 為に参考になると思います。

  • RCPT TOでエラー: 宛先のメールアドレスは存在しない
  • DATA以降の内容でエラー: ヘッダの内容で拒否(ドメイン指定拒否など) あるいは本文の内容で拒否(URLフィルタやスパムチェックのプログラムなど)