Проверьте, существует ли электронная почта php

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

Но, похоже, что yahoo, hotmail, aol и другие провайдеры принимают любые электронные письма и не отклоняют недействительные электронные письма.

Только Gmail и многие домены, такие как stackoverflow.com, отклоняют электронные письма no vaild.

Проверьте мой сценарий и дайте мне знать, могу ли я сделать некоторые, чтобы проверить yahoo и других.

html post form

<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! :("; ?> 

Solutions Collecting From Web of "Проверьте, существует ли электронная почта php"

Если вам необходимо убедиться, что существует адрес электронной почты, отправьте ему E-Mail. Он должен содержать ссылку со случайным идентификатором. Только когда эта ссылка нажата и содержит правильный случайный идентификатор, активируется учетная запись пользователя (или публикуется реклама, или отправляется заказ, или что бы вы ни делали).

Это единственный надежный способ проверить наличие адреса электронной почты и убедиться, что у пользователя, заполняющего форму, есть доступ к нему.

Нет надежного способа проверки достоверности адреса электронной почты на 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 часа, то, вероятно, есть некоторые проблемы с адресом.

Вы можете проверить «используемые или настоящие» электронные письма с данными Telnet и MX, более подробно здесь , поскольку для PHP существует большой вызов библиотеки php-smtp-email-validation , упрощающий процесс.

Вы создаете логическую функцию с файлом example1.php и вызываете ее, когда будете проверять текст электронной почты. Для Gmail, Hotmail, Outlook, Live и MSM у меня есть какие-то проблемы, но с Yahoo и Terra библиотека не может правильно проверять электронную почту

Проблема в том, что gmail использует порт 25 для своих исходящих сообщений smtp, другие провайдеры используют разные порты для своего соединения. Ваш ответ выглядит нормально для gmail.com .

Когда вы подключаетесь к gmail smtp, он дает вам response 250 2.1.5 OK j5si2542844pbs.271 - gsmtp

Но когда вы подключаетесь к любому другому smtp, который не использует порт 25, он дает null ответ.