Есть база 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_INET, SOCK_STREAM, SOL_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($socket, base64_encode($login)); if(!$this->read_smtp_answer($socket)) // ответ сервера return false; // Отравляем пароль $this->write_smtp_response($socket, base64_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($socket, 1024); 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, $msg, strlen($msg)); } } ?> Собственно он вроде бы проверяет аки верно. Но очень часто в файле $name_3 оказываются сервера, к которым можно подключиться и они вполне нормально отвечают на приветствие (при ручной проверке). Хотя их там быть не должно. Можно это как-ибудь исправить?
Code: $name_1=md5(time())."_1".".txt"; $name_2=md5(time())."_2".".txt"; $name_3=md5(time())."_3".".txt"; Бестолковый код, равносильно, Не бестолковый, если он будет записывать в переменную название файла больше одной секунды. Полагаю, но не утверждаю, что проблема с сокетами, видимо на открытие сокетов ограничение. На какой оси запускали? Скрипт не запускал, код просмотрел поверхностно.