本サイトで配布しているメールアドレスをより厳密にチェックするためのクラス”Mail_CheckUser”をGitHubに移行しました。
miya0001′s Mail_CheckUser at master – GitHub
PEARに登録しかかっているので、早々に何とかしたいのですが、例外処理をきちんとしなさいとの難題を押し付けられて(笑)、どんづまり状態を打破すべく、GitHubで一緒に勉強しながら手伝ってくれるかたを募集中です。
本サイトで配布しているメールアドレスをより厳密にチェックするためのクラス”Mail_CheckUser”をGitHubに移行しました。
miya0001′s Mail_CheckUser at master – GitHub
PEARに登録しかかっているので、早々に何とかしたいのですが、例外処理をきちんとしなさいとの難題を押し付けられて(笑)、どんづまり状態を打破すべく、GitHubで一緒に勉強しながら手伝ってくれるかたを募集中です。
現在このパッケージは、PEAR公式サイトで登録に向けて議論を進めており、それに伴いいくつかの修正が施されました。
今回の修正で、これまで配布していたものと互換性がなくなりましたので、既にご利用中の皆様には深くお詫びいたします。
PEARでは、PHP4でのパッケージの新規登録はおわりということで、PHP5に書き直してほしいとのことだったので、PHP5で書き直しました。
今後のPEARパッケージは全てPHP5でかつE_STRICT/E_DEPRECATEDでの警告が出ないことが条件となるそうです。
public変数は全てprotected変数にするかわりに、set*()などのようにその変数を書き換えるための関数を用意しました。
たしかに、これはとても安全でよいアイディアなので、そのように変更しましたが、この修正に伴い従来とは使用方法が変わってしまったので、修正をお願いいたします。
しばらく手が回りそうもありません。
使用方法については、コメントをいただくかソースを見ていただければ幸いです。
現時点で、DraftからProposedにステップアップし、早ければ来週には本登録に向けての投票が行われる予定です。
CheckUser.phpを使用するにあたっては以下の設定が適切に行われている必要があります。
これらの条件を満たさないと、精度が劇的に低下しますので、ご注意ください。
また、このクラスを利用して得られた結果に対してメルマガを送信する際にも、以下の内容をご理解した上で、システムに反映してください。
このクラスはエラーメールを減らすという意味では大きな効果を発揮しますが、ゼロにするわけではありません。
メルマガを送信する際のリストの精度が、エラーメールの処理を行っていないことにより低下すると、接続を拒否される等の弊害がありますので、必ずエラーメールの処理をおこなうようお願いいたします。
うーーーん、こうやって考えてみると、Mixiで「あんまり意味ないのでは?」という意見が多いのも納得するような。まあいっか。
このサイトで公開しているメールアドレスの有効/無効をチェックするクラス「CheckUser」に、PEARのコーディングスタンダードに準拠するためのいくつかの修正を行いました。
この修正に伴いクラス名や関数名が変更になりましたので、誠に恐れ入りますが、すでにダウンロードされた方は、再度ダウンロードをお願いいたします。
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
上記コマンドの中で渡されるそれぞれの引数は以下のように決定されます。
デフォルトでは、応答コードで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ライセンスとします。
使用した結果のご感想をコメントくださるととてもうれしいです。
このクラスは無料でご利用いただいても大歓迎ですが、寄付していただける方がいればもっと大歓迎です。