如何使用 PHP 检查电子邮件地址是不是真实或有效
Posted
技术标签:
【中文标题】如何使用 PHP 检查电子邮件地址是不是真实或有效【英文标题】:How to check if an email address is real or valid using PHP如何使用 PHP 检查电子邮件地址是否真实或有效 【发布时间】:2013-10-16 05:15:42 【问题描述】:我发现一些网站声称可以验证电子邮件地址是否有效。是否可以仅使用 php 检查电子邮件地址是否有效?
<?php
if($_POST['email'] != '')
// The email to validate
$email = $_POST['email'];
// An optional sender
function domain_exists($email, $record = 'MX')
list($user, $domain) = explode('@', $email);
return checkdnsrr($domain, $record);
if(domain_exists($email))
echo('This MX records exists; I will accept this email as valid.');
else
echo('No MX record exists; Invalid email.');
?>
<form method="POST">
<input type="text" name="email">
<input type="submit" value="submit">
</form>
这就是我现在所拥有的。 它检查域是否存在,但它不能检查域是否存在 用户的电子邮件存在于该域中。是否可以使用 PHP 做到这一点?
【问题讨论】:
是的,给他们发一封电子邮件,看看他们是否回复。否则不会,因为垃圾邮件发送者。 验证电子邮件地址的唯一可靠方法是向其发送电子邮件。即使您验证了 MX 记录,也无法可靠地查询服务器,因为大多数电子邮件服务器不会响应查询。感谢您友好的社区垃圾邮件发送者。 ***.com/a/566121/2812842 你不能做到 100%。看看如何these people did it。这是一个彻底的,你可以得到 首先,您需要检查该电子邮件地址的 MX 记录。完成后,您需要检查 SMTP。我按照下面提到的文章和脚本的作用就像魅力:phpwala.in/php/… 【参考方案1】:仅使用一种 PHP 方法,您无法验证(以足够的准确性依赖)电子邮件是否确实存在。您可以向该帐户发送电子邮件,但仅此一项也无法验证该帐户是否存在(见下文)。您至少可以验证它的格式至少类似于 1
if(filter_var($email, FILTER_VALIDATE_EMAIL))
//Email is valid
如果需要,您可以添加另一个检查。解析域然后运行checkdnsrr
if(checkdnsrr($domain))
// Domain at least has an MX record, necessary to receive email
许多人到了这一点,仍然不相信那里没有隐藏的方法。如果您有义务并决心验证电子邮件,请参考以下注意事项:
垃圾邮件发送者也知道“连接技巧”(您开始发送电子邮件并依靠服务器在该点反弹)。其他答案之一链接到 this library 有这个警告
一些邮件服务器会静默拒绝测试邮件,以防止垃圾邮件发送者检查其用户的电子邮件并过滤有效电子邮件,因此此功能可能不适用于所有邮件服务器。
换句话说,如果存在无效地址,您可能不会收到无效地址响应。事实上,几乎所有邮件服务器都带有接受所有传入邮件的选项 (here's how to do it with Postfix)。链接到验证库的答案忽略了该警告。
垃圾邮件黑名单。他们按 IP 地址列入黑名单,如果您的服务器不断地进行验证连接,您就有可能在 Spamhaus 或其他阻止列表中清盘。如果你被列入黑名单,验证电子邮件地址对你有什么好处?
如果验证电子邮件地址真的那么重要,那么公认的方法是强制用户回复电子邮件。向他们发送一封完整的电子邮件,其中包含他们必须单击以进行验证的链接。这不是垃圾邮件,并且保证您的任何回复都有一个有效的地址。
【讨论】:
这不检查电子邮件是否存在..它就像正则表达式验证 他不建议检查电子邮件是否存在,只是检查其格式是否有效。 正如我在回答中所说,没有万无一失的检查来查看电子邮件是否存在。如果您尝试向其发送电子邮件,并非每个服务器都会告诉您帐户无效,并且如果您开始使用垃圾测试请求向服务器发送垃圾邮件,它可能会将您列入黑名单(即 Spamhaus 等) @BarışKURT 如果 sss.com 很乐意接受这两种方法,并且只是在不告诉你的情况下丢弃不存在的那一种呢?我一直惊讶于坚持认为有一种神奇的方法可以确定所有电子邮件都存在电子邮件。有些服务器会告诉你它是否存在,但很多不会 顺便说一句,我赞成的不是简单的验证,任何人都应该不假思索地做,而是正确地观察到你永远不能依赖服务器响应来确定电子邮件帐户状态,如果可以的话,世界上的每个垃圾邮件发送者都会使用这种方法来验证他们的电子邮件数据库,以避免发送到死邮件,这会花费他们金钱。事实上,他们不使用这些方法,而是依赖于带有查询字符串的服务器托管图像,或者点击链接来验证电子邮件,这实际上是您需要看到的所有内容,才能做到这一点。【参考方案2】:您应该使用 SMTP 检查。
这意味着您必须连接到该电子邮件的 SMTP 服务器。
连接到 SMTP 服务器后,您应该发送以下命令:
HELO somehostname.com
MAIL FROM: <no-reply@gmail.com>
RCPT TO: <emailtovalidate@domain.com>
如果您收到“
有一个简单的 PHP 类。你可以使用它:
http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html
【讨论】:
这个脚本很棒,但是,当我在 Outlook、live 和 hotmail 服务器上测试它时,响应代码 554 出现在存在的电子邮件上,然后脚本挂起直到超时 我试了这门课,每封有效的电子邮件都返回“有效,但不存在!” 这在技术上是正确的,但实际上是不可取的:ISP(尤其是 Yahoo 和 Hotmail)知道这一点,如果您经常这样做,他们会阻止您(甚至是确实存在的地址)的交付。简而言之,不要这样做。【参考方案3】:我整个上午都在寻找同样的答案,并且几乎发现不可能验证您需要检查的每个电子邮件地址是否在您需要验证时确实存在。因此,作为一种解决方法,我创建了一个简单的PHP
脚本来验证电子邮件地址的格式是否正确,并且它还验证所使用的域名是否正确。
GitHub
这里https://github.com/DukeOfMarshall/PHP---JSON-Email-Verification/tree/master
<?php
# What to do if the class is being called directly and not being included in a script via PHP
# This allows the class/script to be called via other methods like javascript
if(basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"]))
$return_array = array();
if($_GET['address_to_verify'] == '' || !isset($_GET['address_to_verify']))
$return_array['error'] = 1;
$return_array['message'] = 'No email address was submitted for verification';
$return_array['domain_verified'] = 0;
$return_array['format_verified'] = 0;
else
$verify = new EmailVerify();
if($verify->verify_formatting($_GET['address_to_verify']))
$return_array['format_verified'] = 1;
if($verify->verify_domain($_GET['address_to_verify']))
$return_array['error'] = 0;
$return_array['domain_verified'] = 1;
$return_array['message'] = 'Formatting and domain have been verified';
else
$return_array['error'] = 1;
$return_array['domain_verified'] = 0;
$return_array['message'] = 'Formatting was verified, but verification of the domain has failed';
else
$return_array['error'] = 1;
$return_array['domain_verified'] = 0;
$return_array['format_verified'] = 0;
$return_array['message'] = 'Email was not formatted correctly';
echo json_encode($return_array);
exit();
class EmailVerify
public function __construct()
public function verify_domain($address_to_verify)
// an optional sender
$record = 'MX';
list($user, $domain) = explode('@', $address_to_verify);
return checkdnsrr($domain, $record);
public function verify_formatting($address_to_verify)
if(strstr($address_to_verify, "@") == FALSE)
return false;
else
list($user, $domain) = explode('@', $address_to_verify);
if(strstr($domain, '.') == FALSE)
return false;
else
return true;
?>
【讨论】:
这不检查邮件是否存在,而是检查mx记录是否存在,这周做github.com/hbattat/verifyEmail以上是关于如何使用 PHP 检查电子邮件地址是不是真实或有效的主要内容,如果未能解决你的问题,请参考以下文章