Mail_CheckUserをGitHubに移行しました。

本サイトで配布しているメールアドレスをより厳密にチェックするためのクラス”Mail_CheckUser”をGitHubに移行しました。

miya0001′s Mail_CheckUser at master – GitHub

PEARに登録しかかっているので、早々に何とかしたいのですが、例外処理をきちんとしなさいとの難題を押し付けられて(笑)、どんづまり状態を打破すべく、GitHubで一緒に勉強しながら手伝ってくれるかたを募集中です。

Mail_CheckUser-0.1.1aリリース及びPEARへの登録について

現在このパッケージは、PEAR公式サイトで登録に向けて議論を進めており、それに伴いいくつかの修正が施されました。

今回の修正で、これまで配布していたものと互換性がなくなりましたので、既にご利用中の皆様には深くお詫びいたします。

PHP5への変更

PEARでは、PHP4でのパッケージの新規登録はおわりということで、PHP5に書き直してほしいとのことだったので、PHP5で書き直しました。

今後のPEARパッケージは全てPHP5でかつE_STRICT/E_DEPRECATEDでの警告が出ないことが条件となるそうです。

public変数の扱いの変更

public変数は全てprotected変数にするかわりに、set*()などのようにその変数を書き換えるための関数を用意しました。

たしかに、これはとても安全でよいアイディアなので、そのように変更しましたが、この修正に伴い従来とは使用方法が変わってしまったので、修正をお願いいたします。

日本語ドキュメントについて

しばらく手が回りそうもありません。
使用方法については、コメントをいただくかソースを見ていただければ幸いです。

PEARへの登録について

現時点で、DraftからProposedにステップアップし、早ければ来週には本登録に向けての投票が行われる予定です。

ダウンロードはこのページからどうぞ。

CheckUser.phpをご利用する際のご注意

CheckUser.phpを使用するにあたっては以下の設定が適切に行われている必要があります。

これらの条件を満たさないと、精度が劇的に低下しますので、ご注意ください。

  1. SPFレコードを設定すること。
    CheckUser.phpを設置したWEBサーバーのアドレスがSPFレコードに登録されている必要があります。
  2. クラス変数$senderには、mb_send_mailの第4引数で指定するメールアドレスと同じものを設定する。
  3. 複数のメールアドレスをループでチェックする際には、以下の点に注意する。
    1. 同じサーバーに対して連続でループしないようにドメイン名の部分等で分散させる。
    2. 同一のホストに対しては最大で500回程度を目安とする。
    3. 少なくとも過去に存在していたアドレスなど、精度の高いメールアドレスのリストを使用する。
  4. 各キャリアが公表している情報を熟読して厳守する。

また、このクラスを利用して得られた結果に対してメルマガを送信する際にも、以下の内容をご理解した上で、システムに反映してください。

  1. SMTPサーバーによっては、存在しないメールアドレスに対してもtrueを返してきます。(例えばYahooメールがこれに該当します。)
    したがって、エラーメールのフィルター処理はこのクラスを使用していても必要です。
  2. アドレスが存在していても、迷惑メール設定などによりエラーメールが返されることも数多くあります。(携帯3キャリアがこれに該当します。)
    したがって、この場合もエラーメールの処理は必要です。

このクラスはエラーメールを減らすという意味では大きな効果を発揮しますが、ゼロにするわけではありません。

メルマガを送信する際のリストの精度が、エラーメールの処理を行っていないことにより低下すると、接続を拒否される等の弊害がありますので、必ずエラーメールの処理をおこなうようお願いいたします。

うーーーん、こうやって考えてみると、Mixiで「あんまり意味ないのでは?」という意見が多いのも納得するような。まあいっか。

CheckUserクラスの修正について

このサイトで公開しているメールアドレスの有効/無効をチェックするクラス「CheckUser」に、PEARのコーディングスタンダードに準拠するためのいくつかの修正を行いました。

この修正に伴いクラス名や関数名が変更になりましたので、誠に恐れ入りますが、すでにダウンロードされた方は、再度ダウンロードをお願いいたします。

主な変更内容

  • クラス名がCheckUserからMail_CheckUserに変更となった。
  • check_email()関数がcheckEmail()に名称変更となった。

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ライセンスとします。
使用した結果のご感想をコメントくださるととてもうれしいです。

寄付について

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

参考サイト