当前位置: 首页 > 知识库问答 >
问题:

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

马胜泫
2023-03-14

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

共有3个答案

冯通
2023-03-14

我整个上午都在搜索同一个答案,发现很可能无法验证您需要检查的每个电子邮件地址是否在您需要验证时都存在。因此,作为一种解决方法,我创建了一个简单的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-03-14

仅使用一个PHP方法无法验证电子邮件是否确实存在(准确度足以令人信赖)。您可以向该帐户发送电子邮件,但即使仅发送电子邮件也无法验证该帐户是否存在(见下文)。您至少可以验证它的格式是否至少像一个

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    //Email is valid
}

如果你愿意,你可以再加一张支票。解析出域名,然后运行check dnsrr

if(checkdnsrr($domain)) {
     // Domain at least has an MX record, necessary to receive email
}

许多人到了这一点,仍然不相信有什么隐藏的方法存在。这里有一些注释供您考虑,如果您被绑定并确定要验证电子邮件:

>

  • 垃圾邮件发送者也知道“连接技巧”(你开始发送电子邮件,然后依靠服务器在该点上恢复)。另一个答案是指向此库的链接,其中包含此警告

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

    换句话说,如果有一个无效的地址,您可能不会得到一个无效的地址响应。事实上,几乎所有的邮件服务器都有一个接受所有传入邮件的选项(以下是如何使用Postfix)。链接到验证库的答案忽略了这个警告。

    垃圾邮件黑名单。他们会按IP地址列出黑名单,如果您的服务器一直在进行验证连接,您就有可能被Spamhaus或其他阻止列表所覆盖。如果您被列入黑名单,验证电子邮件地址对您有什么好处?

    如果验证电子邮件地址真的那么重要,公认的方法是强制用户回复电子邮件。给他们发一封完整的电子邮件,上面有一个他们必须点击才能验证的链接。这不是垃圾邮件,你保证任何回复都有一个有效的地址。

  • 牧甫
    2023-03-14

    你应该和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

     类似资料:
    • 问题内容: 有没有一种使用正则表达式检查表单输入的好方法,以确保它是正确的样式电子邮件地址?自昨晚以来一直在搜索,如果它是子域的电子邮件地址,则回答了有关该主题的人们疑问的每个人似乎也有问题。 问题答案: 无关紧要。即使你可以验证该电子邮件地址在语法上是有效的,你仍然需要检查该电子邮件地址是否未键入错误,以及该地址是否确实属于你认为确实有用的人。唯一的方法是向他们发送电子邮件,并让他们单击链接进行

    • 问题内容: 我需要验证用户的电子邮件地址。不幸的是,很难使验证器符合标准 这是一个试图符合标准的正则表达式的示例 是否有任何PHP库(最好是开源的)可以验证电子邮件地址? 问题答案: 您是否看过PHP的filter_函数?它们并不完美,但是根据我的经验,它们做得相当不错。 用法示例(返回布尔值):

    • 问题内容: 我碰到过此PHP代码,无需发送电子邮件即可使用SMTP检查电子邮件地址。 有没有人尝试过类似的方法或对您有用?您能告诉客户/用户输入的电子邮件是否正确并且存在吗? 问题答案: 有时 可以使用两种方法来确定收件人是否确实存在: 您可以连接到服务器,然后发出命令。很少有服务器支持此命令,但正是为此目的而设计的。如果服务器以2.0.0 DSN响应,则该用户存在。 您可以发出,然后查看邮件是否

    • 我们可以检查电子邮件是否发送到CodeIgniter中的假地址吗?我使用了PHPMailer,它总是返回true。或者PHPMailer中还有另一个配置我不知道。

    • 问题内容: 我正在尝试检查是否已使用PDO注册了电子邮件,但是到目前为止,我还没有找到一种很好的方法来进行此操作。到目前为止,这就是我所拥有的。如果有帮助,则连接变量为“ $ con”。另外,我是否需要在同一文档中使用连接变量,还是在包含的文档中使用它? 问题答案: 尝试此操作,使用您的连接凭据填写DB_NAME,DB_USER_NAME和DB_USER_PASS,或者如果所有内容都正确地设置为P