php判断邮箱地址是否存在的方法


Posted in PHP onFebruary 13, 2016

PHP校验邮箱地址的方法很多, 比较常用的就是自己写正则了, 不过正则多麻烦, 我PHP自带了方法做校验。

filter_var

filter_var是PHP内置的一个变量过滤的方法, 提供了很多实用的过滤器, 可以用来校验整数、浮点数、邮箱、URL、MAC地址等。

具体的过滤器参考: filters.validate

filter_var如果返回false, 说明变量无法通过过滤器, 也就是不合法了。

$email = "lastchiliarch@163.com";
 
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
 
 
$email = "asb";
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
 
$email = "1@a.com";
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
 
输出:
 
 
string(21) "lastchiliarch@163.com"
bool(false)
string(7) "1@a.com"

对于asb这种非法邮箱格式返回了false, 但对于1@a.com则通过了,还是略有瑕疵啊。

不过一般的正则也通过会认为1@a.com是一个合法的邮箱, 那有啥办法可以更精准的验证呢?

checkdnsrr

checkdnsrr其实是用来查询指定的主机的DNS记录的,我们可以借用它来验证邮箱是否存在。

对于1@a.com肯定是MX记录不存在的。

$email = "lastchiliarch@163.com";
  var_dump(checkdnsrr(array_pop(explode("@",$email)),"MX"));
  $email = "1@a.com";
  var_dump(checkdnsrr(array_pop(explode("@",$email)),"MX"));
 
  输出:
  bool(true)
  bool(false)

可以看到, 很完美, 唯一的缺点就是太慢了, 毕竟是要做一次网络请求。 所以不适合同步对大量的邮箱采用这种做法去校验。

filter_var+checkdnsrr

我们可以接合filter_var 和checkdnsrr做校验, 对于绝大多数的非法邮箱肯定会在filter_var的时候就挂掉了, 剩下的再用

checkdnsrr进一步判断。

$email_arr = array("lastchiliarch@163.com", "1@a.com");
  foreach($email_arr as $email) {
    if (filter_var($email) === false) {
      echo "invalid email: $email \n";
      continue;
    }
 
    if(checkdnsrr(array_pop(explode("@",$email)),"MX") === false) {
      echo "invalid email: $email \n";
      continue;
    }
  }
 
  输出: invalid email: 1@a.com

但要注意的是, 由于只是检查MX记录, 所以只能判断163.com是存在的, 但不能说明lastchiliarch这个用户是存在的。

想要更精确的判断邮箱存在, 那只能连接到smtp服务器去验证了。

下面为大家分享的php邮箱地址正则表达式验证,具体内容如下

<?php
 header ( "Content-Type: text/html; charset=UTF-8" );
 $reply = "";
 if ( isset($_POST["email_address"]) )
 {
  $email_address = $_POST["email_address"];
  $pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
  if ( preg_match( $pattern, $email_address ) )
  {
   $reply = "您输入的电子邮件地址合法<br /><br />\n";
   $user_name = preg_replace( $pattern ,"$1", $email_address );
   $domain_name = preg_replace( $pattern ,"$2", $email_address );
   $reply .= "用户名:".$user_name."<br />\n";
   $reply .= "域名:".$domain_name."<br />\n\n";
  }
  else
  {
   $reply = "您输入的电子邮件地址不合法";
  }
 }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh" xml:lang="zh">
<head>
<title>电子邮件地址验证程序</title>
</head>
<body style="text-align: center;">
<h1>电子邮件地址验证程序</h1>
<form action="#" method="post">
请输入电子邮件地址:<input name="email_address" type="text" style="width: 300px;" /><br />
<input type="submit" value="验证电子邮件地址" />
</form>
<?php
 echo $reply;
?>
</body>
</html>

希望大家喜欢这篇文章,对大家有所帮助。

PHP 相关文章推荐
PHP 地址栏信息的获取代码
Jan 07 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
Yii使用ajax验证显示错误messagebox的解决方法
Dec 03 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
Yii2前后台分离及migrate使用(七)
May 04 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
浅谈thinkphp5 instance 的简单实现
Jul 30 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 PHP
php打包网站并在线压缩为zip
Feb 13 #PHP
php session 写入数据库
Feb 13 #PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 #PHP
PHP信号量基本用法实例详解
Feb 12 #PHP
PHP消息队列用法实例分析
Feb 12 #PHP
PHP共享内存用法实例分析
Feb 12 #PHP
PHP连接MSSQL方法汇总
Feb 05 #PHP
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
PHP解析RSS的方法
2015/03/05 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Python中的__init__作用是什么
2020/06/09 Python
岗位职责的定义
2013/11/10 职场文书
品质主管的岗位职责
2013/12/04 职场文书
银行介绍信范文
2014/01/10 职场文书
商业项目策划方案
2014/06/05 职场文书
新品发布会策划方案
2014/06/08 职场文书
胡桃夹子观后感
2015/06/11 职场文书
2015国庆节感想
2015/08/04 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书