如何使用PHP检查电子邮件地址是否真实或有效


How to check if an email address is real or valid using PHP

我发现一些网站声称可以验证电子邮件地址是否有效。是否可以仅使用 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来做到这一点吗?

您无法仅使用单个 PHP 方法验证(具有足够的准确性来依赖(电子邮件是否确实存在。您可以向该帐户发送电子邮件,但即使仅凭此也无法验证该帐户是否存在(见下文(。您至少可以验证它的格式至少像一个

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
}

许多人走到这一步,仍然不相信那里没有一些隐藏的方法。以下是一些注意事项,供您考虑是否绑定并决心验证电子邮件:

  1. 垃圾邮件发送者也知道"连接技巧"(您开始发送电子邮件并依靠服务器在此时反弹(。另一个答案链接到这个有这个警告的库

    某些邮件服务器会静默拒绝测试邮件,以防止垃圾邮件发送者检查其用户的电子邮件并过滤有效电子邮件,因此此功能可能无法在所有邮件服务器上正常工作。

    换句话说,如果存在无效地址,

    则可能不会收到无效地址响应。事实上,几乎所有的邮件服务器都带有接受所有传入邮件的选项(以下是使用 Postfix 进行操作的方法(。 链接到验证库的答案忽略了该警告。

  2. 垃圾邮件黑名单。他们按IP地址列入黑名单,如果您的服务器不断进行验证连接,您将面临在Spamhaus或其他阻止列表中结束的风险。如果您被列入黑名单,验证电子邮件地址对您有什么好处?

  3. 如果验证电子邮件地址真的那么重要,那么可接受的方法是强制用户回复电子邮件。向他们发送一封完整的电子邮件,其中包含他们必须单击才能验证的链接。它不是垃圾邮件,您可以保证任何回复都有有效的地址。

2023 年更新:今天,如果它有效的话,这会让你被阻止。请参阅评论。

您应该与 SMTP 联系。

这意味着您必须连接到该电子邮件的SMTP服务器。

连接到 SMTP 服务器后,应发送以下命令:

HELO somehostname.example
MAIL FROM: <no-reply@gmail.com>
RCPT TO: <emailtovalidate@domain.example>

如果您收到"<emailtovalidate@domain.example>中继访问被拒绝",则表示此电子邮件无效。

有一个简单的PHP类。您可以使用它:

http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html

我整个早上都在搜索相同的答案,并且几乎发现在您需要验证它时,可能无法验证您需要检查的每个电子邮件地址是否确实存在。因此,作为一种解决方法,我创建了一个简单的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;
        }
    }
    }
}
?>

截至 2023 年,应该没有可靠的技术方法来检查邮件地址的存在。如果有,这将是垃圾邮件发送者进一步垃圾邮件的好方法,因为他们可以轻松扫描有效的电子邮件。

唯一的方法是发送选择加入邮件。这不仅会检查地址是否存在,还会检查该地址是否适合该用户。如果地址存在但属于其他人,则无济于事。在欧洲等一些国家,这甚至是法律要求的。