4

電子メールが存在するかどうかを確認するコードを作成する方法は? たとえば、donkey_sdh123@gmail.com、donkey_sdh123@yahoo.com、または donkey_sdh123@lycos.com など、これらの電子メールはすべて gmail、yahoo、および lycos データベースには存在しません。
ここに画像の説明を入力


スクリーンショットを参照してください。donkey_sdh123@gmail.com はダメです。つまり、存在しないということです。私のプロジェクトで同じことをどのように実装できますか?

javascript、jquery シェル スクリプト、c または c++ は大歓迎です。.netなし。

4

3 に答える 3

7

要するに、それは不可能です。せいぜい、問題のドメインに MX レコードがあるかどうかを確認し、そのメール サーバーに接続してみてください。それでも動作することを保証するものではありません。

多くのサーバーが採用しているマスカレードとエイリアシングには多くのアプローチがあるため、標準化された方法で特定の電子メールが存在するかどうかを確認することは絶対にできません。サーバーは、SMTP 交換で存在しないアドレスを有効であると報告することができますし、そうするVRFYでしょMAILRCPT。あなたが得ることができる唯一の明確な答えは、電子メールがMAIL/によって拒否された場合、電子メールは無効RCPTであるということですが、電子メール処理の行で拒否される可能性があるため、受け入れられたからといってそれが有効であるという明確な証拠にはなりません。実際に何も送信せずに悪用することもMAIL、ブロックされる可能性があります。RCPT

ユーザーが提供した電子メールを確認したい場合は、そこに確認の手紙を送るのが最善の策です。

また、動作確認済みの電子メールが本当に必要かどうかも確認する必要があります。

于 2012-06-20T13:21:10.007 に答える
2

telnet 経由でリモート smtp サーバーに接続できます。

http://www.yuki-onna.co.uk/email/smtp.html

唯一のことは、多くのメール サーバーが smtp (yahoo など) を受け入れないことです。アドレスがスパマーにとって価値があるかどうかに関する情報であるため、どのメール アドレスが存在するかを簡単に発見できるようにすることは、どのメール ホストの利益にもなりません。

ping やその他のネットワーク スキャンを使用してドメインが存在するかどうかの基本的なチェックを行うことができます。また、Google API を使用して、インターネット上に平文でリストされている場合にメール アドレスを検索することもできます。しかし、それはあなたと同じことをしているすべての詐欺師であるため、おそらく試す価値はありません.

注意すべきもう 1 つの点は、多くの電子メール プロバイダーがユーザーに派生、一時、またはエイリアス アドレスを提供することを許可していることです。これは、限られた時間または用途で機能しますが、メールボックス自体ではありません。この状況では、機能するチェッカーでさえ、ユーザーが送信された電子メールを受信したとしても、アドレスが存在しないと考えるでしょう。

有効期限が切れたアドレスはおそらく公開されないため (前のユーザーのメールを他のユーザーが受信するのを防ぐため)、偽陽性 (チェックは「はい」と表示されているが間違っている) と偽陰性 (チェックは「いいえ」と表示されているが間違っている) のソースが存在します。 、スパマーのように扱われることのすべての摩擦に加えて.

于 2012-06-20T13:17:57.293 に答える
1

ウェブから取得したこのコードを参照してください。

 class SmtpValidator {

    private $options = array(
            "port" => 25,
            "timeout" => 1,  // Connection timeout to remote mail server.
            "sender" => "info@webtrafficexchange.com",
            "short_response" => false,
    );

    /**
     *  Override the options for those specified.
     */
    function __construct($options = null) {
        if (!empty($options)) {
            if (is_array($options)) {
                foreach ($options as $key => $value) {
                    $this->options[$key] = $value;
                }
            }
        }
    }

    /**
     *  Validate the email address via SMTP.
     *  If 'shore_response' is true, the method will return true or false;
     *  Otherwise, the entire array of useful information will be provided.
     */
    public function validate($email, $options = null) {

        $result = array("valid" => false);
        $errors = array();

        // Email address (format) validation
        if (empty($email)) {
            $errors = array("Email address is required.\n");
        } else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors = array("Invalid email address.\n");
        } else {
            list($username, $hostname) = split('@', $email);
            if (function_exists('getmxrr')) {
                if (getmxrr($hostname, $mxhosts, $mxweights)) {
                    $result['mx_records'] = array_combine($mxhosts, $mxweights);
                    asort($result['mx_records']);
                } else {
                    $errors = "No MX record found.";
                }
            }

            foreach ($mxhosts as $host) {
                $fp = @fsockopen($host, $this->options['port'], $errno, $errstr, 
                                       $this->options['timeout']);
                if ($fp) {
                    $data = fgets($fp);
                    $code = substr($data, 0, 3);
                    if($code == '220') {
                        $sender_domain = split('@', $this->options['sender']);
                        fwrite($fp, "HELO {$sender_domain}\r\n");
                        fread($fp, 4096);
                        fwrite($fp, "MAIL FROM: <{$this->options['sender']}>\r\n");
                        fgets($fp);
                        fwrite($fp, "RCPT TO:<{$email}>\r\n");
                        $data = fgets($fp);
                        $code = substr($data, 0, 3);
                        $result['response'] = array("code" => $code, "data" => $data);
                        fwrite($fp, "quit\r\n");
                        fclose($fp);
                        switch ($code) {
                            case "250":  // We're good, so exit out of foreach loop
                            case "421":  // Too many SMTP connections
                            case "450":
                            case "451":  // Graylisted
                            case "452":
                                $result['valid'] = true;
                                break 2;  // Assume 4xx return code is valid.
                            default:
                                $errors[] = "({$host}) RCPT TO: {$code}: {$data}\n";
                        }
                    } else {
                        $errors[] = "MTA Error: (Stream: {$data})\n";
                    }
                } else {
                    $errors[] = "{$errno}: $errstr\n";
                }
            }
        }
        if (!empty($errors)) {
            $result['errors'] = $errors;
        }
        return ($this->options['short_response']) ? $result['valid'] : $result;
    }
}
于 2012-06-20T13:56:29.283 に答える