5

我有一个问题,我有一个 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! :(";
?>
4

4 回答 4

13

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

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

于 2013-01-21T23:02:36.573 回答
11

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

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

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

检查电子邮件地址的格式非常困难,但是 PHP 有一个验证过滤器可以尝试这样做。过滤器不处理“评论和折叠空白”,但我怀疑有人会注意到。

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 小时),那么地址可能存在问题。

于 2013-01-21T23:04:04.457 回答
7

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

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

于 2013-06-27T00:42:50.983 回答
3

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

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

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

于 2013-12-16T07:35:45.263 回答