PHP 邮箱验证类 -- 正则匹配并域名验证

  1 <?php
  2  /**
  3   * function getmxrr
  4   * 获取指定域名的MX记录信息
  5  */
  6  function win_getmxrr($hostname, &$mxhosts, &$mxweight=false) 
  7  {
  8     if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') return;
  9     if (!is_array ($mxhosts) ) $mxhosts = array();
 10     if (empty($hostname)) return;
 11     $exec='nslookup -type=MX '.escapeshellarg($hostname);
 12     @exec($exec, $output);
 13     if (empty($output)) return;
 14     $i=-1;
 15     foreach ($output as $line) {
 16         $i++;
 17         if (preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.+)$/i", $line, $parts)) {
 18           $mxweight[$i] = trim($parts[1]);
 19           $mxhosts[$i] = trim($parts[2]);
 20         }
 21         if (preg_match('/responsible mail addr = (.+)$/i', $line, $parts)) {
 22           $mxweight[$i] = $i;
 23           $mxhosts[$i] = trim($parts[1]);
 24         }
 25     }
 26     return ($i!=-1);
 27  }
 28  if (!function_exists('getmxrr')) {
 29     function getmxrr($hostname, &$mxhosts, &$mxweight=false) {
 30         return win_getmxrr($hostname, $mxhosts, $mxweight);
 31     }
 32  }
 33  
 34  /**
 35   * class EmailLinker
 36   * 邮箱验证类,正则匹配邮箱地址并对域名是否有MX解析进行验证
 37  */ 
 38  class EmailLinker
 39  {
 40      CONST CONN_TIMEOUT = 10;
 41      CONST READ_TIMEOUT = 5;
 42      CONST SMTP_PORT = 25;
 43      private $email;
 44      function __construct($email)
 45      {
 46          $this->email = $email;
 47          $this->redirectIfNeeded();
 48      }
 49      //重定向邮箱地址
 50      function redirectIfNeeded()
 51      {
 52          if(array_key_exists('mail',$_GET) && $this->email == base64_decode($_GET['mail']) ){
 53              header('Location: mailto:'.$this->email);
 54              exit;
 55          }    
 56      }
 57  
 58      //回调返回邮箱地址
 59      public function link()
 60      {
 61          if($this->isValid()){
 62              $encoded = base64_encode($this->email);
 63              return '<a href="?mail='.urlencode($encoded).'" target="_blank">Email:'.$this->email.'</a>';
 64          }
 65      }
 66      //获取邮箱地址并验证
 67      public function isValid($mail = '')
 68      {
 69              static $valid = null;
 70              if($mail){
 71                  return ( $this->getParts() != null );
 72              }
 73              if($valid !== null){
 74                  return $valid;
 75              }
 76              if($parts = $this->getParts()){
 77                  $valid = $this->validateUser($parts['host'],$parts['user']);
 78              }
 79              return $valid;
 80      }
 81      private function validateUser($hostname,$user)
 82      {
 83          if($sock = $this->openSMTPSocket($hostname)){
 84              $this->smtpSend($sock,"HELO $hostname");
 85              $resp  = $this->smtpSend($sock,"MALL FROM: <$user@$hostname>");
 86              //$resp  = $this->smtpSend($sock,"RCPT TO:<$user@$hostname>"); //这一步可能被ISP过滤了,导致邮箱验证不成功
 87              $vaild = (preg_match('/250|451|452\s/',$resp) == 1);
 88              fclose($sock);
 89              return $vaild;
 90          }else{
 91              return false;
 92          }
 93      }
 94      private function openSMTPSocket($hostname)
 95      {
 96          $hosts = $this->getMX($hostname);
 97          foreach($hosts as $host => $weight)
 98          {
 99              if($sock = @fsockopen($host,self::SMTP_PORT,$errno,$errstr,self::CONN_TIMEOUT))
100              {
101                  stream_set_timeout($sock,self::READ_TIMEOUT);
102                  return $sock;
103              }
104          }
105      }
106      private function getMX($hostname)
107      {
108          $host = array();
109          $weights = array();
110          getmxrr($hostname,$hosts,$weights);
111  
112          $results = array();
113          foreach($hosts as $i => $host)
114          {
115              $results[$host] = $weights[$i];
116          }
117          arsort($results,SORT_NUMERIC);
118          $results[$hostname] = 0;
119          return $results;
120      }
121      private function smtpSend($sock,$data)
122      {
123          fwrite($sock,"$data\r\n");
124          return fgets($sock,1024);
125      }
126      
127      //正则匹配
128      private function getParts()
129      {
130          //$emailRegex = '/\w+([-+.]\w+)*@\w+([-.]\w)*\.\w+([-.]\w+)*/x';
131          $emailRegex = <<<__REGEX__
132          /(?P<user>
133              \w+([-+.]\w+)*
134           )@(?P<host>
135               \w+([-.]\w)*\.\w+([-.]\w+)*
136           )/x
137  __REGEX__;
138          return (preg_match($emailRegex,$this->email,$matches))? $matches : null ;
139      }
140  
141  }
142  $emailLinker_class = new EmailLinker('421865564@qq.com');
143  echo $emailLinker_class->link();
144  
145  
146  
147  ?>

 

源代码下载:EmailLinker_1228.zip

 

 

转载于:https://www.cnblogs.com/linzhenjie/archive/2012/12/28/2836643.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值