5

質問があります。メール アドレスが存在するかどうかを確認するための php スクリプトがあります。

しかし、yahoo、hotmail、aol などのプロバイダーはすべてのメールを受け入れており、無効なメールを拒否していないようです。

Gmail と、stackoverflow.com などの多くのドメインのみが、無効なメールを拒否しています。

私のスクリプトをチェックして、yahoo などをチェックするために何かできることがあれば教えてください。

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% 信頼できる方法はありません。ただし、少なくとも明らかに無効なアドレスを除外するためにできることがいくつかあります。

電子メール アドレスで発生する問題は、実際には普通郵便の問題と非常によく似ています。以下の 3 つのポイントはすべて、カタツムリ メールの送信にも使用できます (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 に答える
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 に答える