php email smpt ошибка проверки отправки 34 байтов не удалось - PullRequest
0 голосов
/ 02 июня 2018

я хочу подтвердить, что адрес электронной почты действителен или нет через smtp

Я не могу проверить электронную почту в codeigniter.

это ошибка

fwrite (): отправка 34 байтов завершилась неудачно с errno = 10054 Существующее соединение было принудительно закрыто удаленным хостом.

Этот метод проверяет, существует ли электронная почта на самом деле или нет

я получилдве одинаковые ошибки в этом коде в разных строках

function isValidEmail($email){
   $result=false;

   # BASIC CHECK FOR EMAIL PATTERN WITH REGULAR EXPRESSION
   if(!preg_match('/^[_A-z0-9-]+((\.|\+)[_A-z0-9-]+)*@[A-z0-9-]+(\.[A-z0-9-]+)*(\.[A-z]{2,4})$/',$email))
       return $result;

   # MX RECORD CHECK
     list($name, $domain)=explode('@',$email);

   if(!checkdnsrr($domain,'MX'))
      return $result;

   # SMTP QUERY CHECK
   $max_conn_time = 30;
   $sock='';
   $port = 25;
   $max_read_time = 5;
   $users=$name;

   # retrieve SMTP Server via MX query on domain
   $hosts = array();
   $mxweights = array();
   getmxrr($domain, $hosts, $mxweights);
   $mxs = array_combine($hosts, $mxweights);
   asort($mxs, SORT_NUMERIC);

   #last fallback is the original domain
   $mxs[$domain] = 100;
   $timeout = $max_conn_time / count($mxs);

   # try each host
   while(list($host) = each($mxs)) {
    #connect to SMTP server
    if($sock = fsockopen($host, $port, $errno, $errstr, (float) $timeout)){
      stream_set_timeout($sock, $max_read_time);
      break;
    }
   } 

   # did we get a TCP socket
   if($sock) {
      $reply = fread($sock, 2082);
      preg_match('/^([0-9]{3}) /ims', $reply, $matches);
      $code = isset($matches[1]) ? $matches[1] : '';

      if($code != '220') {
        # MTA gave an error...
        return $result;
      }

      # initiate smtp conversation
      $msg="HELO ".$domain;
      fwrite($sock, $msg."\r\n");
      $reply = fread($sock, 2082);

      # tell of sender
      $msg="MAIL FROM: <".$name.'@'.$domain.">";
      fwrite($sock, $msg."\r\n");
      $reply = fread($sock, 2082);


      #ask of recepient
      $msg="RCPT TO: <".$name.'@'.$domain.">";
      fwrite($sock, $msg."\r\n");
      $reply = fread($sock, 2082);

      #get code and msg from response
      preg_match('/^([0-9]{3}) /ims', $reply, $matches);
      $code = isset($matches[1]) ? $matches[1] : '';

      if($code == '250') {
        #you received 250 so the email address was accepted
        $result=true;
      }elseif($code == '451' || $code == '452') {
        #you received 451 so the email address was greylisted
        #_(or some temporary error occured on the MTA) - so assume is ok
        $result=true;
      }else{
        $result=false;
      }

      #quit smtp connection
      $msg="quit";
      fwrite($sock, $msg."\r\n");

      # close socket
      fclose($sock);

   }

   return $result;


}

$email='test1221s@gmail.com';

if(isValidEmail($email))
  echo "**** EMAIL EXISTS ****";
else
  echo "**** NOT A VALID EMAIL ****";

1 Ответ

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

Этот метод проверяет, действительно ли электронная почта существует или нет

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

В прошлом сканеры собирали адреса электронной почты, спрашивая сервер, существует ли user@domain.com.Тогда user1@domain.com.Затем user2@domain.com и т. Д.

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

С тех пор почтовые серверы стали гораздо менее открытыми и "болтливыми" ине будет отвечать на эти запросы и фактически заблокирует ваш адрес после ряда сбоев.

Все, что вы можете сделать, это отправить реальное электронное письмо и обработать отказ, если он не доставлен.Если вы настаиваете на «проверке» адресов электронной почты, чтобы убедиться, что они хороши, вы скоро обнаружите, что у вас есть черный список IP-адресов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...