PHPでメールアドレスを正確にチェックするクラス


PerlのMail::CheckUserによく似た機能を提供するPHPクラスを作成しましたので公開します。

このクラスを使用すると、SMTPコマンドで実際に有効なアカウントかどうかを調べますので、正規表現のみでチェックするよりも高い確率で無効なメールアドレスを検出することが可能です。

メルマガ配信等でエラーメールを減らしたい際にお使いいただければ幸いです。
(特にモバイル向けのメルマガでは威力抜群です。)

はじめに!

メールアドレスをランダムに生成する等のプログラムを作成して、有効なメールアドレスのリストを作成するといったご利用方法は絶対にしないでください。

そのようなご利用をされた場合、一定期間相手先のSMTPサーバーからブロックされることがあります。

その場合の如何なる補償もできませんので、ご了承ください。

各携帯キャリアの仕様が記述されているページのURLを以下に記載しておきますので、ループ回数や頻度などは、これらの情報から各自のオウンリスクで推測してください。

SPFレコードが登録されていることなど、各キャリアが公表している基準を満たせない場合は使用しないでください。

サンプル

こちらのページでおためしください。

ダウンロード

ダウンロードはここをクリック!

ソースを閲覧したい方はこちらへ。

使用方法

いかのような簡単なコードで利用可能です。
PEARライブラリのMail及びNet_SMTPが必要なのであらかじめインストールしてください。

<?php

require_once('CheckUser.php');

$email = 'foo@example.com';

$sender = 'webmaster@example.com';
$fqdn = 'fqdn.example.com';
$chk = new Mail_CheckUser($fqdn, $sender);
$result = $chk->checkEmail( $email );
if( $result ){ // $emailが有効かも?
  print 'OK';
}else{ // $emailが有効ではないかも?
  print $chk->response_code;
  print ': ';
  print $chk->response;
}

?>

詳しい仕様

引数として渡されたメールアドレスを分解して得られたホスト名からMXレコードを取得して、得られたメールサーバーに以下のようなESMTPコマンドを送信しています。

複数のMXレコードがあった場合にはループで処理してはじめに接続できたサーバーにコマンドを送信しています。
また、MXレコードがなかった場合は、メールアドレスのホスト名からIPアドレスを調べてサーバーの存在を確認した後、ホスト名をメールサーバーと見なして接続を試みます。

EHLO YOUR_SERVER_NAME
250 ......(相手先からのレスポンス)
MAIL FROM: YOUR_SENDER_ADDRESS
250 ......(相手先からのレスポンス)
RCPT TO: EMAIL_ADDRESS
250 ......(相手先からのレスポンス)
QUIT

上記コマンドの中で渡されるそれぞれの引数は以下のように決定されます。

  • YOUR_SERVER_NAME – コンストラクタに渡された第一引数
  • YOUR_SENDER_ADDRESS – コンストラクタに渡された第二引数
  • EMAIL_ADDRESS – 有効かどうかを確認するメールアドレス

デフォルトでは、応答コードで250または251が返されたときのみ有効と判断しています。(setOKCodes()というメソッドで変更可能です。)

精度について

弊社でテストした結果では、携帯電話の3キャリアでは、メールアドレスの有無が判別できました。

ただし、これはSPFレコードが設定されているなどの、携帯キャリアが発表している情報を条件として満たしていることが前提です。

SPFレコードが設定していないサーバーでは、このクラスを使用することをお薦めできません。

Yahooメールでは、存在しないアドレスに対しても応答コード250を返すようです。
他にもqmailを使っているメールサーバーや、一部のpostfixでも存在しないメールアドレスに対して250を返すようです。

正規表現について

メールアドレスの文法に対する正規表現はとても難しいので、PEARライブラリのMail_RFC822::isValidInetAddress()を使用してチェックしています。
具体的な正規表現の内容を知りたい方はMail_RFC822::isValidInetAddress()のドキュメント等を参照ください。

ちなみに、Mail_RFC822::isValidInetAddress()は、docomoやauの悪名高いRFC非準拠のアドレスもtrueとします。

ライセンス

PHPライセンスとします。
使用した結果のご感想をコメントくださるととてもうれしいです。

寄付について

このクラスは無料でご利用いただいても大歓迎ですが、寄付していただける方がいればもっと大歓迎です。

参考サイト


関連する記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>