2010年4月14日水曜日
【PHP】PHPmailerのメールアドレスバリデータ
簡単にメール送信が出来るライブラリPHPmailer。
アドレスのバリデータ関数は「filter_var()」を使用するか、独自の正規表現を「preg_match()」でチェックしている。
/* class.phpmailer.php L.523~ */
public static function ValidateAddress($address) {
if (function_exists('filter_var')) { //Introduced in PHP 5.2
if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
return false;
} else {
return true;
}
} else {
return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
}
}
「filter_var()」はPHP5.2.0以降に導入された、もとはPECLにあった関数。
定義してあるフィルターを指定して、値をチェックする。
PHPmailerのバリデータはPHP 5.2以降で関数があれば「filter_var()」を使うようになっている。
これの「FILTER_VALIDATE_EMAIL」オプションは次のような正規表現でチェックされている
/* filter_var() の FILTER_VALIDATE_EMAIL オプションのフィルター */
void php_filter_validate_email(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
{ /* From http://cvs.php.net/co.php/pear/HTML_QuickForm/QuickForm/Rule/Email.php?r=1.4 */
const char regexp[] = "/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\")|([A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}]+(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?\\.?)+[A-Za-z\\-]*))$/D";
…
コメントを見るにPEAR::HTML_QuickFormのバリデータを使っている様子。
この正規表現の意味や解説などはリンク先を見て頂くとして、この正規表現は以下のアドレスを通す。
/* filter_var() の動作 - フィルタリングされないアドレス */
filter_var("a@a.b.c-", FILTER_VALIDATE_EMAIL);
filter_var("a@123x", FILTER_VALIDATE_EMAIL);
そして以下のアドレスを通さない。
/* filter_var() の動作 - フィルタリングされるアドレス */
filter_var('docomo.@example.com' FILTER_VALIDATE_EMAIL);
filter_var('ntt...docomo@example.com' FILTER_VALIDATE_EMAIL);
つまり日本の携帯メールアドレスをチェックするには適さない。
PHP 5.2より前のバージョンで「filter_var()」が無い場合の正規表現によるバリデータも同様に、日本の携帯メールアドレスに存在するものを通さない。
もしPHPmailerを使うのであれば、携帯ユーザのアクセスがある場合は「PHPmailer::ValidateAddress()」を変更する必要があるだろう。
/* class.phpmailer.php PHPmailer::ValidateAddress() の変更*/
public static function ValidateAddress($address) {
return preg_match('/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i', $address);
}
有名なメールライブラリQdmailがあるが、そちらを使うのも手かもしれない。
Qdmailのバリデータは、デフォルトで「/[^@]+@[^@]+/」のみのチェックでユーザが定義することになってるし、マルチバイト対応で絵文字も使える。
関連
ラベル: PHP
登録 投稿 [Atom]
