PHPで正しいメールアドレスかどうか調べる

(1/1)
正規表現でメールアドレスかどうかチェックする」では、メールアドレスの構成文字が正しいかどうかをチェックした。さらに、正規のメールサーバが存在するかどうかをチェックするプログラムをつくってみることにする。

(2022年4月23日)マッチングパターンを定数RFC2282に定義

目次

正しいメールアドレスかどうかを調べる手順

ここでは、入力されたメールアドレスが、以下の項目を満足しているかどうかを調べることにする。
  1. '@'が1つかどうか
  2. RFC2282に適合しているかどうか
  3. メールサーバが存在するかどうか

サンプル・プログラム

圧縮ファイルの内容
checkmail.phpサンプル・プログラム本体。

解説:'@'が1つかどうか

0131: /**
0132:  * 正しい電子メールアドレスかどうかを調べる
0133:  * @param   string $email  電子メールアドレス
0134:  * @param   string $errmsg 不正時のエラー内容
0135:  * @return  bool TRUE=正しい/FALSE=不正
0136: */
0137: function check_email_address($email, &$errmsg) {
0138:     $errmsg = '';
0139: 
0140:     //ホスト名を分離
0141:     $arr = preg_split('/@/', $email);
0142:     if (count($arr) <= 1) {
0143:         $errmsg = '@ がありません';
0144:         return FALSE;
0145:     } else if (count($arr) > 2) {
0146:         $errmsg = '@ が2つ以上あります';
0147:         return FALSE;
0148:     }
0149: 
0150:     //RFC2282チェック
0151:     if (preg_match(RFC2282$arr[0]) == FALSE) {
0152:         $errmsg = '名前が不正です';
0153:         return FALSE;
0154:     }
0155:     if (preg_match(RFC2282$arr[1]) == FALSE) {
0156:         $errmsg = 'ホスト名が不正です';
0157:         return FALSE;
0158:     }
0159: 
0160:     //MXレコードの存在チェック
0161:     $mxhosts = array();
0162:     if (getmxrr($arr[1]$mxhosts) == FALSE) {
0163:         $errmsg = 'ホストが存在しない,またはメール送受信ができない可能性があります(MXレコードがありません)';
0164:         return FALSE;
0165:     }
0166: 
0167:     return TRUE;
0168: }

ユーザー関数 check_email_address は、正しい電子メールアドレスかどうかを調べる。

まず、'@' が1つだけであることを調べる。
後処理で、名前(@より左側)とホスト名(@より右側)のチェックも行うので、関数  preg_split  により、あらかじめ名前とホスト名を分離しておく。

解説:RFC2282に適合しているかどうか

つづいて、分解した名前とホスト名が、RFC 2282 Internet Message Format和訳】に準拠しているかどうか、正規表現を使ってチェックする。詳細は、「正規表現でメールアドレスかどうかチェックする」を参照のこと。

解説:MXレコードの存在チェック

最後に、関数  getmxrr  により、ホスト名がDNSのMXレコードを持つかどうかを調べる。

MX(Mail eXchange)レコードは、DNSで定義される情報の1つで、その名が示すとおり、電子メールの配送先を決定する時に使われる。
原理的には A レコードがあればメール送受信には支障ないのですが、ダイナミックDNSによって運用されているメールサーバなどを除くために、MXレコードをチェックするようにした。

参考サイト

(この項おわり)
header