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にあった関数。
定義してあるフィルターを指定して、値をチェックする。

filter_var - PHP マニュアル
検証フィルタ

PHPmailerのバリデータはPHP 5.2以降で関数があれば「filter_var()」を使うようになっている。
これの「FILTER_VALIDATE_EMAIL」オプションは次のような正規表現でチェックされている

filter_var()関数の真価を見極める - muddy brown thang
PHPのfilter_var()で入力チェック - firegoby
/* 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のバリデータは、デフォルトで「/[^@]+@[^@]+/」のみのチェックでユーザが定義することになってるし、マルチバイト対応で絵文字も使える。

関連

正規表現チェッカー

strfriend
Rubular
メールフォーム - PHPmailer+xajax - さぼてん:2009年2月14日記事

ラベル:


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google