メールを送信することなくそのメールアドレスが存在するかどうか調べる
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
流れとしては、
- 接続の確立
- 送信元アドレスの設定
- 送信先アドレスの設定
- 本文(タイトル等含む)の設定
- 送信
- 切断
です。
SMTPサーバはひとつ送るごとに返答をしてくれます。
3の送信先アドレスを設定するときも、指定したアドレスが存在すれば、250 OKというステータスを返してくれます。ここで、それ以外の値の返答があれば、そのメールアドレスは存在しないのではないか?ということが推測できます。
この段階で切断してしまえば、メールを送信することなく、そのメールアドレスが存在するかどうか調べられます。
対策
このような手法でメールアドレスが存在するか知られたくない場合は、送信先アドレスにどのようなアドレスを指定されても、とりあえずOKを返す実装をすればよいと思われます。
ただ、存在するか調べたいメールアドレスとともに、存在しないと思われるメールアドレス(ランダムに生成した文字列を使ったもの)が存在するかどうか調べれば、この対策がされているかどうか見破る事は可能です。
検証してみた
この手順を再現するコードをRubyで書いてみました。
長いので、ここに直接載せませんが、Githubに公開しています。Ruby1.8を使っていた頃に書いたので、ちょっと古いです。
kurochan/mail-address-checker · GitHub