Доброго дня. Изучаю код для отправки почты (сокеты). Не могу понять, зачем в функции цикл. Так ли он необходим? Правильно ли я понимаю, что цикл тут нужен для ожидания ответа сервера? Т.е. на случай, если сервер ответит не сразу. (Для практических целей использую Sendmail, понять хочу для себя(в учебных целях). Код (PHP): <?php function get_data($smtp_conn) { $data=""; while($str = fgets($smtp_conn,515)) { $data .= $str; if(substr($str,3,1) == " ") { break; } } return $data; } $header="Date: ".date("D, j M Y G:i:s")." +0700\r\n"; $header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Максим')))."?= <login@mail.ru>\r\n"; $header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n"; $header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Максим')))."?= <login@mail.ru>\r\n"; $header.="X-Priority: 3 (Normal)\r\n"; $header.="Message-ID: <172562218.".date("YmjHis")."@mail.ru>\r\n"; $header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Сергей')))."?= <qwe@asd.ru>\r\n"; $header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('проверка')))."?=\r\n"; $header.="MIME-Version: 1.0\r\n"; $header.="Content-Type: text/plain; charset=windows-1251\r\n"; $header.="Content-Transfer-Encoding: 8bit\r\n"; $text="привет, проверка связи."; $smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10); if(!$smtp_conn) {print "соединение с серверов не прошло"; fclose($smtp_conn); exit;} $data = get_data($smtp_conn); fputs($smtp_conn,"EHLO mail.ru\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 250) {print "ошибка приветсвия EHLO"; fclose($smtp_conn); exit;} fputs($smtp_conn,"AUTH LOGIN\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 334) {print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit;} fputs($smtp_conn,base64_encode("login")."\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 334) {print "ошибка доступа к такому юзеру"; fclose($smtp_conn); exit;} fputs($smtp_conn,base64_encode("password")."\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 235) {print "не правильный пароль"; fclose($smtp_conn); exit;} fputs($smtp_conn,"MAIL FROM:login@mail.ru\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 250) {print "сервер отказал в команде MAIL FROM"; fclose($smtp_conn); exit;} fputs($smtp_conn,"RCPT TO:qwe@asd.ru\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 250 AND $code != 251) {print "Сервер не принял команду RCPT TO"; fclose($smtp_conn); exit;} fputs($smtp_conn,"DATA\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 354) {print "сервер не принял DATA"; fclose($smtp_conn); exit;} fputs($smtp_conn,$header."\r\n".$text."\r\n.\r\n"); $code = substr(get_data($smtp_conn),0,3); if($code != 250) {print "ошибка отправки письма"; fclose($smtp_conn); exit;} fputs($smtp_conn,"QUIT\r\n"); fclose($smtp_conn); ?> Будет ли критично и неверно, если убрать цикл и проверки каждого кода, например, следующим образом: Код (PHP): function ch_code(&$a, $smtp_conn) { $a=fgets($smtp_conn,625); $a=substr($a,0,3); } $smtp_conn = fsockopen("smtp.rambler.ru", 25,$errno, $errstr, 10); ch_code($a, $smtp_conn); if(!$smtp_conn) {print "Connection Lost"; fclose($smtp_conn); exit;} fputs($smtp_conn,"HELO rambler.ru\r\n"); ch_code($a, $smtp_conn); fputs($smtp_conn,"AUTH LOGIN\r\n"); ch_code($a, $smtp_conn); и т.д., и т.д.
Re: PHP и smtp. Скрипт (сокет). fgets полюбому будет ждать ответа. цикл не просто для ожидания ответа, а для ожидания ответа в нужном формате. будет читать, пока не будет получен нужный фрагмент текста (код результата). неправильные строки игнорируются. offtopic: вижу ты пытался выделить строку в коде. но внутри [ code ] никакие другие ббкоды не действуют советую отредактировать пост, заменив [code] на [code=php] чтобы была подсветка синтаксиса, а также сделать нормальные отступы внутри { } и возле места, которое надо выделить, поставить комментарий типа // вот это место, оно будет подсвечено другим цветом удачи!
Re: PHP и smtp. Скрипт (сокет). Добавлено спустя 4 минуты 21 секунду: artoodetoo , спасибо. Самое главное было понять с fgets. Кода много, захотелось разобраться. Формат в цикле определяется, как я понял, отсутствием символа после трехзначного кода. Только если почтовые протоколы достаточно жестко стандартизированы, зачем определять формат. Спасибо еще раз. P.S. В качестве шутки. Получается, можно использовать sleep(); для ответа сервера.
Re: PHP и smtp. Скрипт (сокет). можно, но зачем? Добавлено спустя 1 минуту 11 секунд: p.s. [b] … [/b] ты забыл убрать ))) оно там явно лишнее
Re: PHP и smtp. Скрипт (сокет). Например, можно использовать для тестирования почтового сервера. В bash sleep часто упрощает некоторые задачи, обычно, когда что-то проверяешь. Я пару раз до написания программы для постоянного использования делал простую последовательность со sleep. Получается, своего рода прототип. Упрощает понимание порядка работы программы.