PHPやJavaScriptなどの覚え書き、たまに愚痴、反省など。
PHPでメールアドレスを正確にチェックするクラス
PerlのMail::CheckUserによく似た機能を提供するPHPクラスを作成しましたので公開します。
このクラスを使用すると、SMTPコマンドで実際に有効なアカウントかどうかを調べますので、正規表現のみでチェックするよりも高い確率で無効なメールアドレスを検出することが可能です。
メルマガ配信等でエラーメールを減らしたい際にお使いいただければ幸いです。
(特にモバイル向けのメルマガでは威力抜群です。)
はじめに!
メールアドレスをランダムに生成する等のプログラムを作成して、有効なメールアドレスのリストを作成するといったご利用方法は絶対にしないでください。
そのようなご利用をされた場合、一定期間相手先のSMTPサーバーからブロックされることがあります。
その場合の如何なる補償もできませんので、ご了承ください。
各携帯キャリアの仕様が記述されているページのURLを以下に記載しておきますので、ループ回数や頻度などは、これらの情報から各自のオウンリスクで推測してください。
SPFレコードが登録されていることなど、各キャリアが公表している基準を満たせない場合は使用しないでください。
- 同報メールを大量に送信されるお客様へ | サービス・機能 | NTTドコモ
- メール送信時のお願い | EZwebへメール送信する際の注意事項 | au by KDDI
- ソフトバンクの迷惑メール対策について|SoftBank
サンプル
ダウンロード
使用方法
いかのような簡単なコードで利用可能です。
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ライセンスとします。
使用した結果のご感想をコメントくださるととてもうれしいです。
寄付について
このクラスは無料でご利用いただいても大歓迎ですが、寄付していただける方がいればもっと大歓迎です。
参考サイト
- Mail::CheckUser -有効なメールアドレスかどうかをチェックする – CASEY.JP
- さぼてん: 【PHP】メールアドレスをチェックする方法色々【正規表現】
- PHPでメールアドレスかどうか調べる方法
- tdtshのブログ » SMTP レスポンスコード表
- 各種メールアドレス・チェックをまとめたクラス – m-tagの日記
- 【No.2】メールアドレスチェック – Zend Validateの派生クラスを公開します | 携帯サイトをつくろう。
| この記事は miya によって 2009 年 7 月 10 日 3:17 AM に投稿されました, Mail_CheckUser 以下に保存されています。 RSS 2.0 を通してコメントをフォローする。 コメントを残すか、ご自分のサイトからトラックバックできます。 |
Additional comments powered by BackType


