メールを送信することなくそのメールアドレスが存在するかどうか調べる

SMTPプロトコルに従ってメールを送ると、以下のようなやりとりがあります。(微妙に違っていたらごめんなさい)
telnetを使えば、手元でも試すことができます。
参考: telnetでメール送信
'>'がクライアント→サーバで、'<'がクライアント←サーバを表しています。

< 220 smtp.example.com ESMTP
> HELO client.example.com
< 250 smtp.example.com

> MAIL FROM:hoge@client.example.com
< 250 ok
> RCPT TO:huga@smtp.example.com
< 250 ok
> DATA
< 354 go ahead
> FROM:hoge@client.example.com
> SUBJECT:test
> Hello World!
> .
< 250 ok ABCDE1234 Message accepted for delivery
> QUIT
< 221 smtp.example.com

流れとしては、

  1. 接続の確立
  2. 送信元アドレスの設定
  3. 送信先アドレスの設定
  4. 本文(タイトル等含む)の設定
  5. 送信
  6. 切断

です。
SMTPサーバはひとつ送るごとに返答をしてくれます。
3の送信先アドレスを設定するときも、指定したアドレスが存在すれば、250 OKというステータスを返してくれます。ここで、それ以外の値の返答があれば、そのメールアドレスは存在しないのではないか?ということが推測できます。
この段階で切断してしまえば、メールを送信することなく、そのメールアドレスが存在するかどうか調べられます。

対策

このような手法でメールアドレスが存在するか知られたくない場合は、送信先アドレスにどのようなアドレスを指定されても、とりあえずOKを返す実装をすればよいと思われます。
ただ、存在するか調べたいメールアドレスとともに、存在しないと思われるメールアドレス(ランダムに生成した文字列を使ったもの)が存在するかどうか調べれば、この対策がされているかどうか見破る事は可能です。

検証してみた

この手順を再現するコードをRubyで書いてみました。
長いので、ここに直接載せませんが、Githubに公開しています。Ruby1.8を使っていた頃に書いたので、ちょっと古いです。
kurochan/mail-address-checker · GitHub