Подтверждение электронной почты, чтобы узнать, что электронная почта действительно существует на сервере, используя php - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать функцию, с помощью которой я могу проверить, существует ли электронная почта на самом деле или нет. Я искал разные форумы, но код работает только с Gmail, а не с другими. Я проверяю записи mx. Могу ли я сделать что-то для подключения к этим записям mxи спросите у сервера, действительно ли электронная почта существует.Я добавил большую часть кода, чтобы вы могли понять, что мне нужно делать Спасибо

private function verifyEmail($toemail, $fromemail, $getdetails = false)
    {
        $result='';
        $details=' ';
        // Get the domain of the email recipient
        $email_arr = explode('@', $toemail);
        $domain = array_slice($email_arr, -1);
        $domain = $domain[0];

        // Trim [ and ] from beginning and end of domain string, respectively
        $domain = ltrim($domain, '[');
        $domain = rtrim($domain, ']');

        if ('IPv6:' == substr($domain, 0, strlen('IPv6:'))) {
            $domain = substr($domain, strlen('IPv6') + 1);
        }

        $mxhosts = array();
        // Check if the domain has an IP address assigned to it
        if (filter_var($domain, FILTER_VALIDATE_IP)) {
            $mx_ip = $domain;
        } else {
            // If no IP assigned, get the MX records for the host name
            getmxrr($domain, $mxhosts, $mxweight);
        }

        if (!empty($mxhosts)) {
            $mx_ip = $mxhosts[array_search(min($mxweight), $mxhosts)];
        } else {
            // If MX records not found, get the A DNS records for the host
            if (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
                $record_a = dns_get_record($domain, DNS_A);
                // else get the AAAA IPv6 address record
            } elseif (filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
                $record_a = dns_get_record($domain, DNS_AAAA);
            }

            if (!empty($record_a)) {
                $mx_ip = $record_a[0]['ip'];
            } else {
                // Exit the program if no MX records are found for the domain host
                $result = 'Invalid Email MX ';
                $details .= 'No suitable MX records found.';

                return ((true == $getdetails) ? array($result, $details) : $result);
            }
        }

        // Open a socket connection with the hostname, smtp port 25
        $connect = @fsockopen($mx_ip, 25);

        if ($connect) {

            // Initiate the Mail Sending SMTP transaction
            if (preg_match('/^220/i', $out = fgets($connect, 1024))) {

                // Send the HELO command to the SMTP server
                fputs($connect, "HELO $mx_ip\r\n");
                $out = fgets($connect, 1024);
                $details .= $out."\n";

                // Send an SMTP Mail command from the sender's email address
                fputs($connect, "MAIL FROM: <$fromemail>\r\n");
                $from = fgets($connect, 1024);
                $details .= $from."\n";

                // Send the SCPT command with the recepient's email address
                fputs($connect, "RCPT TO: <$toemail>\r\n");
                $to = fgets($connect, 1024);
                $details .= $to."\n";

                // Close the socket connection with QUIT command to the SMTP server
                fputs($connect, 'QUIT');
                fclose($connect);

                // The expected response is 250 if the email is valid
                if (!preg_match('/^250/i', $from) || !preg_match('/^250/i', $to)) {
                    $result = 'Invalid Email Address';
                } else {
                    $result = 'Valid Email Address';
                }
            }else{echo 'layht';}
        } else {
            $result = 'Invalid Email Address';
            $details .= 'Could not connect to server';
        }
        if ($getdetails) {
            return array($result, $details);
        } else {
            return $result;
        }
    }

1 Ответ

0 голосов
/ 08 июня 2018

Единственный способ узнать наверняка, существует ли адрес электронной почты, - это отправить ему письмо и получить ответ от пользователя.

Раньше можно было запрашивать удаленный сервер с помощью SMTP и спрашивать, был ли адрес действительным;однако, поскольку спаммеры использовали это для сбора адресов, он больше не работает.

В прошлом также можно было отправлять почту на сервер и, если он не был отклонен, предположить, что это был действительный адрес, однакоэто уже не надежно.

...