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 相关文章推荐
4.与数据库的连接
Oct 09 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
yii2 页面底部加载css和js的技巧
Apr 21 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 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
改变Apache端口等配置修改方法
2008/06/05 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
javascript iframe编程相关代码
2009/12/28 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
探究python中open函数的使用
2016/03/01 Python
python与C互相调用的方法详解
2017/07/14 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python简易远程控制单线程版
2018/06/20 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
国外软件测试工程师面试题
2016/12/09 面试题
校园安全广播稿
2014/02/08 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
学校教学工作总结2015
2015/05/19 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL