[php] Помогите доработать скрипт чекер.

Discussion in 'PHP' started by swarj, 28 Nov 2012.

  1. swarj

    swarj New Member

    Joined:
    8 Oct 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Есть база smtp такого вида:
    Чтобы чекнуть на валидность, написали простейший чекер с таким кодом:
    PHP:
    <?php
        
    class ParserClass
        
    {
            var 
    $file;
            
    //var $socket;
            //var $connect;
            
            
    function __construct()
            {
                
    $this->file=file('smtp_chek.txt');
                
    $name_1=md5(time())."_1".".txt";
                
    $name_2=md5(time())."_2".".txt";
                
    $name_3=md5(time())."_3".".txt";
                
    $out_1=fopen($name_1,"w");
                
    $out_2=fopen($name_2,"w");
                
    $out_3=fopen($name_3,"w");
                
                
    $i=1;
                foreach(
    $this->file as $value)
                {
                    
    preg_match('/Email\:([\w\@\.\-\_]+)\s\|'.iconv("UTF-8","CP1251","Сервер").'\:\s([\w\d\.\-\_]+)\s\|'.iconv("UTF-8","CP1251","Пользователь").'\:\s([\w\d\@\.\_\-\%\+]+)\s\|'.iconv("UTF-8","CP1251","Пароль").'\:\s([\w\d\!\@\#\$\%\^\&\*\(\)\:\;\/\\\\\'\"\.\,\<\>\|\?\+\=\-\_]+)/',$value,$res);
                    
                    
                    
                    
    $socket=socket_create(AF_INETSOCK_STREAMSOL_TCP);
                
                    if(
    $socket<0)
                    {
                        throw new 
    Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
                    }
                    echo 
    $i++." - ";
                    
                    if (isset(
    $res[0])?socket_connect($socket,$res[2],25):false)
                    {
                        if(
    $this->check_connect($socket))
                        {
                            
                            if(
    $this->check_auth($socket,$res[3],$res[4]))
                            {
                                echo 
    "<b>работает</b><br/>";
                                
    preg_match('/.+@(.+)/',$res[1],$domain);
                                
                                
    fwrite($out_1,$domain[1].",".$res[2].",no,no,no limit\r\n");
                                
    fwrite($out_2,$res[1].",".$res[3].",".$res[4]."\r\n");
                            }
                            else
                            {
                                echo 
    "<font style=\"color:#ff0000\">не пройдена авторизация</font><br/>";
                            }
                            
    $this->close_connect($socket);
                        }
                        else
                        {
                            
    fwrite($out_3,$value);
                            echo 
    "<font style=\"color:#ff0000\">сервер не ответил</font><br/>";
                        }
                    }
                    else
                        
    fwrite($out_3,$value);
                        echo 
    "<font style=\"color:#ff0000\">не подключено</font><br/>";
                    if(isset(
    $socket)) 
                        
    socket_close($socket);
                }
                
    fclose($out_1);
                
    fclose($out_2);
                
    fclose($out_3);
                echo 
    "Результат:<br/><a href=\"$name_1\">$name_1</a><br/><a href=\"$name_2\">$name_2</a>";
            }
            
            public function 
    check_connect($socket)
            {
                
    $this->read_smtp_answer($socket);
                
                
    // Приветствуем сервер
                
    $this->write_smtp_response($socket'EHLO '.$_SERVER['REMOTE_ADDR']);
                return 
    $this->read_smtp_answer($socket); // ответ сервера
            
    }
            
            public function 
    check_auth($socket,$login,$pass)
            {
                
    // Делаем запрос авторизации
                
    $this->write_smtp_response($socket'AUTH LOGIN');
                
    $this->read_smtp_answer($socket); // ответ сервера
            
                // Отравляем логин
                
    $this->write_smtp_response($socketbase64_encode($login));
                if(!
    $this->read_smtp_answer($socket)) // ответ сервера
                    
    return false;
               
                
    // Отравляем пароль
                
    $this->write_smtp_response($socketbase64_encode($pass));
                if(!
    $this->read_smtp_answer($socket)) // ответ сервера
                    
    return false;
                return 
    true;
            }
            
            public function 
    close_connect($socket)
            {
                
    $this->write_smtp_response($socket'QUIT');
                
    $this->read_smtp_answer($socket); // ответ сервера
            
    }
            
            public function 
    read_smtp_answer($socket)
            {
                
    $read socket_read($socket1024);
               if (!empty(
    $read)) 
                if (
    $read{0} != '2' && $read{0} != '3')
                {
                    
    /*if (!empty($read)) {
                        throw new Exception('SMTP failed: '.$read{0}."\n");
                    } else {
                        throw new Exception('Unknown error'."\n");
                    }*/
                    
    return false;
                }
                return 
    true;
            }
            
            public function 
    write_smtp_response($socket$msg="")
            {
                
    $msg $msg."\r\n";
                
    socket_write($socket$msgstrlen($msg));
            }
        }
    ?>
    Собственно он вроде бы проверяет аки верно. Но очень часто в файле $name_3 оказываются сервера, к которым можно подключиться и они вполне нормально отвечают на приветствие (при ручной проверке). Хотя их там быть не должно.
    Можно это как-ибудь исправить?
     
  2. ultimatum

    ultimatum Elder - Старейшина

    Joined:
    28 Apr 2007
    Messages:
    142
    Likes Received:
    65
    Reputations:
    -13
    Code:
                
     $name_1=md5(time())."_1".".txt";             $name_2=md5(time())."_2".".txt";             
    $name_3=md5(time())."_3".".txt"; 
    
    Бестолковый код, равносильно,
    Не бестолковый, если он будет записывать в переменную название файла больше одной секунды.

    Полагаю, но не утверждаю, что проблема с сокетами, видимо на открытие сокетов ограничение.
    На какой оси запускали?
    Скрипт не запускал, код просмотрел поверхностно.