【问题标题】:Check if email exist php检查电子邮件是否存在php
【发布时间】:2013-01-05 02:21:58
【问题描述】:

我有一个问题,我有一个 php 脚本来检查电子邮件地址是否存在。

但似乎 yahoo、hotmail、aol 和其他提供商正在接受任何电子邮件,而不是拒绝无效电子邮件。

只有 Gmail 和许多像 stackoverflow.com 这样的域都拒绝无效的电子邮件。

检查我的脚本,如果我可以做一些检查雅虎和其他人,请告诉我。

html 发布表单

<html>
<body>
<form action="checkemail.php" method="POST">
<b>E-mail</b> <input type="text" name="email">
<input type="submit">
</form>
</body>
</html>

php

<?php

/* Validate an email address. */
function jValidateEmailUsingSMTP($sToEmail, $sFromDomain = "gmail.com", $sFromEmail = "email@gmail.com", $bIsDebug = false) {

    $bIsValid = true; // assume the address is valid by default..
    $aEmailParts = explode("@", $sToEmail); // extract the user/domain..
    getmxrr($aEmailParts[1], $aMatches); // get the mx records..

    if (sizeof($aMatches) == 0) {
        return false; // no mx records..
    }

    foreach ($aMatches as $oValue) {

        if ($bIsValid && !isset($sResponseCode)) {

            // open the connection..
            $oConnection = @fsockopen($oValue, 25, $errno, $errstr, 30);
            $oResponse = @fgets($oConnection);

            if (!$oConnection) {

                $aConnectionLog['Connection'] = "ERROR";
                $aConnectionLog['ConnectionResponse'] = $errstr;
                $bIsValid = false; // unable to connect..

            } else {

                $aConnectionLog['Connection'] = "SUCCESS";
                $aConnectionLog['ConnectionResponse'] = $errstr;
                $bIsValid = true; // so far so good..

            }

            if (!$bIsValid) {

                if ($bIsDebug) print_r($aConnectionLog);
                return false;

            }

            // say hello to the server..
            fputs($oConnection, "HELO $sFromDomain\r\n");
            $oResponse = fgets($oConnection);
            $aConnectionLog['HELO'] = $oResponse;

            // send the email from..
            fputs($oConnection, "MAIL FROM: <$sFromEmail>\r\n");
            $oResponse = fgets($oConnection);
            $aConnectionLog['MailFromResponse'] = $oResponse;

            // send the email to..
            fputs($oConnection, "RCPT TO: <$sToEmail>\r\n");
            $oResponse = fgets($oConnection);
            $aConnectionLog['MailToResponse'] = $oResponse;

            // get the response code..
            $sResponseCode = substr($aConnectionLog['MailToResponse'], 0, 3);
            $sBaseResponseCode = substr($sResponseCode, 0, 1);

            // say goodbye..
            fputs($oConnection,"QUIT\r\n");
            $oResponse = fgets($oConnection);

            // get the quit code and response..
            $aConnectionLog['QuitResponse'] = $oResponse;
            $aConnectionLog['QuitCode'] = substr($oResponse, 0, 3);

            if ($sBaseResponseCode == "5") {
                $bIsValid = false; // the address is not valid..
            }

            // close the connection..
            @fclose($oConnection);

        }

    }

    if ($bIsDebug) {
        print_r($aConnectionLog); // output debug info..
    }

    return $bIsValid;

}
$email = $_POST['email'];

$bIsEmailValid = jValidateEmailUsingSMTP("$email", "gmail.com", "email@gmail.com");
echo $bIsEmailValid ? "<b>Valid!</b>" : "Invalid! :(";
?>

【问题讨论】:

  • 这不是验证电子邮件地址的非常可靠的方法。许多服务器不会正确返回指示电子邮件是否存在以防止垃圾邮件收集的代码。
  • 我认为许多提供商不会让您测试这样的电子邮件地址(因为有人可以使用相同的技术来挖掘有效电子邮件中的垃圾邮件)。验证电子邮件地址的唯一真正方法是发送一封带有唯一令牌的电子邮件,并具有允许用户将令牌输入您的应用程序以确认他们收到电子邮件的机制。
  • 这永远不会以任何程度的可靠性工作
  • 典型的流程是向该地址发送一封验证电子邮件,并且必须用户通过点击电子邮件中的链接或输入一些代码来执行验证;回复电子邮件是另一种选择。
  • 你不能。故事结束:(

标签: php email


【解决方案1】:

如果您需要确保电子邮件地址存在,请向其发送电子邮件。它应该包含一个带有随机 ID 的链接。只有当该链接被点击并包含正确的随机 ID 时,用户的帐户才会被激活(或发布广告、发送订单或您正在执行的任何操作)。

这是验证电子邮件地址存在的唯一可靠方法,并确保填写表格的人可以访问它。

【讨论】:

  • 当然我们都使用那些一次性地址,所以它只是在很短的时间内“有效”
  • @Dagon,来自 mailinator.com 等服务的地址始终有效。他们可能不会一直受到监控,但他们总是接受并显示传入的电子邮件。
【解决方案2】:

没有 100% 可靠的方法来检查电子邮件地址的有效性。不过,您可以做一些事情来至少清除明显无效的地址。

电子邮件地址出现的问题实际上与蜗牛邮件的问题非常相似。以下三点也可用于发送蜗牛邮件(只需将 DNS 记录更改为物理地址即可)。

1.检查地址格式是否正确

检查电子邮件地址的格式非常困难,但 PHP 有一个 validation filter 尝试这样做。过滤器不处理“comments and folding whitespace”,但我怀疑有人会注意到。

if (filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE) {
    echo 'Valid email address formatting!';
}

2。检查域名的 DNS 记录是否存在

如果存在 DNS(域名系统)记录,那么至少有人设置了它。这并不意味着该地址有电子邮件服务器,但如果该地址存在则更有可能。

$domain = substr($email, strpos($email, '@') + 1);
if  (checkdnsrr($domain) !== FALSE) {
    echo 'Domain is valid!';
}

3.向该地址发送验证电子邮件

这是查看电子邮件地址另一端是否有人的最有效方法。如果确认电子邮件没有得到有序的回复(例如 3 小时),那么地址可能有问题。

【讨论】:

  • 请试试这个脚本。 yahoo 对 12xyzabcdefg@yahoo.com 有效,所以对于 yahoo 用户,我无法检查。
  • 好的,但是在这里我可以检查域是否存在,很容易在浏览器中检查,并且检查格式是否正确对我来说不可靠。谢谢
  • 你需要修改你的代码。正如您现在所说的那样,$domain 将返回“@domain.com”,这将导致检查失败。 $domain = substr($email, strpos($email, '@') + 1);不过效果很好。
  • checkdnsrr 非常简洁:)
【解决方案3】:

您可以使用 Telnet 验证“使用过的或真实的”电子邮件,MX 在here 中记录更多信息,因为 PHP 存在一个很棒的库调用 php-smtp-email-validation 可以简化流程。

您使用文件 example1.php 创建一个布尔函数,并在您验证电子邮件文本时调用它。对于 Gmail、Hotmail、Outlook、live 和 MSM,我没有任何问题,但使用 Yahoo 和 Terra 时,库无法正确验证电子邮件

【讨论】:

  • 我知道评论很旧,但这不起作用。截至 2013 年,它仅适用于非常有限的一组提供商。任何人都不应依赖它,或在实际环境中使用它。
【解决方案4】:

问题是 gmail 使用端口 25 进行 smtp 外发邮件,其他提供商使用不同的端口进行连接。对于gmail.com,您的回复似乎还可以。

当您连接到 gmail smtp 时,它会为您提供 response 250 2.1.5 OK j5si2542844pbs.271 - gsmtp

但是当您连接到任何其他不使用端口 25 的 smtp 时,它会给您null 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2022-01-20
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多