如何使用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可以做到这一点吗?


答案 1

您应该与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


答案 2

您无法仅使用单个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. 如果验证电子邮件地址确实很重要,则接受的方法是强制用户回复电子邮件。向他们发送一封完整的电子邮件,其中包含他们必须点击才能进行验证的链接。这不是垃圾信息,您可以保证任何回复都有一个有效的地址。


推荐