bounceHammer has been EOL'ed on February 29, 2016

製品ライフサイクルの終了

2010年3月にオープンソースソフトウェアとして公開して以来、多くのユーザ様・企業様にダウンロードし、 ご利用いただきましたbounceHammerは、2016年2月29日(月)を持ちまして製品ライフサイクルの終了(EOL: End Of Life) となりました。長きにわたりbounceHammerをご使用いただき誠に有り難う御座いました。 開発元では後継となるバウンスメール解析ライブラリとして、より高精度で高速なSisimai(シシマイ) を二条項BSDライセンスで公開しています。

Sisimai
商用サポート

  • 1一式導入・設定・保守・開発の補助
  • 2独自MTA用解析モジュールの開発
  • 3個別案件の対応とメールサポート
  • 4バウンス管理・運用コンサルティング
  • 5スポット解析・解析済みデータ提供

telnetで携帯電話宛バウンスの仕組みを推測する

2010/12/13

携帯電話宛の宛先不明とドメイン指定拒否の区別

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

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

メールゲートウェイの動作

 

電子メールはSMTP というプロトコルを使用して送信されます。

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

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

SMTPコマンドについて

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

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

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

例1) HELO mx.bouncehammer.jp ←自分のホスト名(相手のホスト名ではない)を名乗る
例2) HELO [192.0.2.25] ←自分のIPアドレスを[ ] で囲って名乗る
MAIL FROM
送信するメールの発信者アドレスを指定します。 ここで指定する発信者アドレスは、エンベロープFromと呼ばれるアドレスで、 メールアドレスのみを指定します。 メールソフトのFromに表示される差出人とは別物です。 宛先不明などのバウンスが発生した場合は、 このエンベロープFromで指定したアドレスにエラーメール(バウンスメール)が送信されます。

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

例) RCPT TO: <hoge@example.org>
DATA
ヘッダも含めた電子メールの内容を開始するコマンドです。 このコマンド入力直後に、メールヘッダや本文を入力し、全て入力が終えたら、 . (単一のドット)を入れてデータ部分の終了となります。
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: <user@example.jp> ⏎ ←エンベロープFrom
250 2.1.0 <user@example.jp>... Sender ok
RCPT TO: <userunknown@example.org> ⏎ ←エンベロープTo
550 5.1.1 <userunknown@bouncehammer.jp>... User Unknown ←宛先不明と言われる
QUIT ⏎ ←SMTPセッションを終了
221 2.0.0 sanjo.cubicroot.jp 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: <postmaster@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 <CRLF>.<CRLF>
Subject: test for bounce and filter #2
From: Postmaster <postmaster@example.com>
To: **********@docomo.ne.jp
⏎ ←空白を1行入れてメール本文の開始
test
. ⏎ 単一のドットでメール本文の終了
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フィルタやスパムチェックのプログラムなど)