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 相关文章推荐
php5新改动之短标记启用方法
Sep 11 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
php 字符串替换的方法
Jan 10 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
PHP也能干大事 随机函数
Apr 14 PHP
zend framework重定向方法小结
May 28 PHP
php简单处理XML数据的方法示例
May 19 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
PHP微商城开源代码实例
Mar 27 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
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
PHP模块memcached使用指南
2014/12/08 PHP
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
python实现指定字符串补全空格的方法
2015/04/30 Python
Python匹配中文的正则表达式
2016/05/11 Python
python实现批量修改文件名代码
2017/09/10 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
python如何制作英文字典
2019/06/25 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
化学专业毕业生自荐信
2013/11/15 职场文书
电子商务专员岗位职责
2013/12/11 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
教师对学生的寄语
2014/04/03 职场文书
学习雷锋标语
2014/06/25 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
2019军训心得体会
2019/06/27 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS