检查电子邮件是否存在php

Neo*_*lli 3 php email

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

但似乎雅虎,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>
Run Code Online (Sandbox Code Playgroud)

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! :(";
?>
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 12

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

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

  • 但是我们当然都使用那些一次性地址,所以它只能在很短的时间内"有效" (4认同)

Sve*_*sen 10

没有100%可靠的方法来检查电子邮件地址的有效性.但是,你可以采取一些措施来至少清除明显无效的地址.

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

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

检查电子邮件地址的格式非常困难,但PHP有一个尝试执行此操作的验证过滤器.过滤器不处理" 评论和折叠空白 ",但我怀疑有人会注意到.

if (filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE) {
    echo 'Valid email address formatting!';
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

3.将确认电子邮件发送到该地址

这是查看某人是否位于电子邮件地址另一端的最有效方式.如果没有以有序的方式回复确认电子邮件 - 例如3小时 - 那么地址可能存在一些问题.


小智 6

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

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