Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
|
Хочу совсем немного. Всего лишь реализовать отправку почты с сайта. Делаю для этого функцию. В принципе письма уходят.
Но вот как я этого добился:
PHP:
скопировать код в буфер обмена
if ($fp){ $in = fgets($fp, 256 ); //смотрим что нам ответил сервер echo "<--".$in."<br>"; //выводим это $sent = fputs($fp, "EHLO mail\r\n"); //посылаем ему команду if ($sent) echo "-->EHLO mail(".$sent.")<br>"; //выводим в браузер информацию о том что отправили $in = fgets($fp, 256)."<br>"; echo "<--".$in."<br>"; //Метка 1! $in = fgets($fp, 256)."<br>"; echo "<--".$in."<br>"; $in = fgets($fp, 256)."<br>"; echo "<--".$in."<br>"; $in = fgets($fp, 256)."<br>"; echo "<--".$in."<br>"; $in = fgets($fp, 256)."<br>"; echo "<--".$in."<br>"; $sent = fputs($fp, "AUTH LOGIN\r\n"); if ($sent) echo "-->AUTH LOGIN (".$sent.")<br>"; echo "<--".$in."<br>"; echo "<--".$in."<br>"; echo "<--".$in."<br>"; $sent = fputs($fp, "MAIL FROM: senderlogs@mail.ru\r\n"); if ($sent) echo "-->MAIL FROM senderlogs@mail.ru (".$sent.")<br>"; echo "<--".$in."<br>"; $sent = fputs($fp, "RCPT TO: кому\r\n"); if ($sent) echo "-->RCPT TO кому (".$sent.")<br>"; echo "<--".$in.""; $sent = fputs($fp, "DATA\r\n"); if ($sent) echo "-->DATA (".$sent.")<br>"; echo "<--".$in."<br>"; $sent = fputs($fp, $SEND."\r\n.\r\n"); //gпеременная $SEND сформирвана заранее if ($sent) echo "-->тело письма (".$sent.")<br>"; echo "<--".$in."<br>"; $sent = fputs($fp, "QUIT\r\n"); if ($sent) echo "-->QUIT (".$sent.")<br>";
В браузер это выводит следующее
"<--220 smtp3.mail.ru ESMTP ready
-->EHLO mail(11)
<--250-smtp3.mail.ru
<--250-SIZE 31457280
<--250-8BITMIME
<--250-AUTH PLAIN LOGIN
<--250 STARTTLS
-->AUTH LOGIN (12)
<--334 VXNlcm5hbWU6
-->*************(26)
<--334 UGFzc3dvcmQ6
-->*************(14)
<--235 Authentication succeeded
-->MAIL FROM ######@mail.ru (31)
<--250 OK
-->RCPT TO ########@mail.ru (32)
<--250 Accepted -->DATA (6)
<--354 Enter message, ending with "." on a line by itself
-->тело письма (356)
<--250 OK id=1QljVS-0008U6-00
-->QUIT (6)"
алгоритм такой сначала пишем в сокет команду fputs(), выводим что написали, затем читаем ответ fgets() и выводим его на экран.
Не устраивает меня вот, что.
Там где у меня "метка 1" видно что при таком подходе необходимо выполнять fgets() ровно столько раз сколько строк в ответе от сервера. - линейный алгоритм получается
Да, можно использовать feof() чтобы просто прочитать до конца НО! (вот мы и добрались до главного) если считать последний символ из сокета, или лучше сказать выполнить fgets() когда уже всё прочитано, то отправка прерывается и дальше не идёт, а в логах апача появляется запись
"PHP Fatal error: Maximum execution time of 30 seconds exceeded in C:\\Apache2.2\\htdocs\\localhost\\www\\smtp_send.php on line 94".
Вопрос такой, как сделать функцию, которая бы посылала команды получала ответы сервера и выводила их на экран?
Ой не знаю, надеюсь ситуацию понятно описал.
P.S> Ещё вот, возможно кто-то знает как можно узнать размер сообщений в сокете, подобно размеру файла, получаемому через filesize()? Это помогло бы узнать сколько можно считать.
Понимаю что возможо слегка глупо пишу, но я, при написании скрипта, представляю сокет как файл в который поочерёдно пишут клиент и сервер, где клиент это скрипт.(Отредактировано автором: 26 Июля, 2011 - 19:09:47)
|