Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сокеты и получение почты с помощью php
 
 автор: Ziq   (11.10.2006 в 21:47)   письмо автору
 
 

Подскажите как это все исполнить грамотно.

Вот нашел протокол POP3 http://zeus.sai.msu.ru:7000/nets/semenov/4/44/pop34414.shtml
по нему я и собираюсь этому научиться, может уже и начал неправильно?

Короче, там сказано, что

USER name, где name - характеризует почтовый ящик сервера. 

Команда используется на фазе авторизации или после неудачного завершения команд USER 
или PASS. При авторизации клиент должен сначала послать команду USER и лишь после 
получения положительного отклика команду PASS. Команда может вызвать следующие отклики: 

+OK name is a valid mailbox
-ERR never heard of mailbox name
Примеры использования команды USER: 

К: USER frated
С: -ERR sorry, no mailbox for frated here
...
К: USER mrose
С: +OK mrose is a real hoopy frood


как все это отослать и куда честно сказать не очень представляю :(. Но очень хочется :)

1. Я не понимаю как отослать эту команду и куда и на какой порт. Я делал что-то типа

$fp = fsockopen("pop.list.ru", 80, $errno, $errstr);    

почему 80 я не знаю :( и вообще как определить номер порта на какой отсылать?

2. Я не знаю как общаться с сервером. Как отправить и получить запрос. Я пытался что-то сделать с помощью fgets() и fwrite(), но ничего путного из этого не вышло :(

Короче, если не знаете как получить почту, то объясните хотябы как "общаться" с удаленным сервером.

P.S. Пишите, если не сложно, на простом языке, а то я в этой теме полный 0.

P.P.S. Если глупость где сморозил ногами не бить :)

Заранее ОГРОМНОЕ спасибо!!!

   
 
 автор: cheops   (11.10.2006 в 22:37)   письмо автору
 
   для: Ziq   (11.10.2006 в 21:47)
 

Хм... почту лучше с помощью IMAP получать - она всё равно на сервере хранится.

   
 
 автор: Ziq   (11.10.2006 в 22:42)   письмо автору
 
   для: cheops   (11.10.2006 в 22:37)
 

Честно говоря я не знаю просто что лучше. Где-то читал на форуме, что самый простой способ это POP3 вот и решил начать с простого.

   
 
 автор: Trianon   (12.10.2006 в 09:29)   письмо автору
 
   для: Ziq   (11.10.2006 в 22:42)
 

порт сервера POP3 - 110.
В остальном Вы идете в верном направлении.
Устанавливать соединение нужно с помощью fsockopen
Отправлять команды - с помощью fwrite
Принимать ответы - с помощью fgets
Обратите внимание на то, что некоторые команды выдают ответ одной строкой,
а некоорые другие - многострочный ответ, заканчивающийся строкой с точкой.

   
 
 автор: Ziq   (12.10.2006 в 22:36)   письмо автору
 
   для: Trianon   (12.10.2006 в 09:29)
 

попытался что-то сделать короче вот

<?
$fp 
fsockopen("pop.list.ru"110$errno$errstr);
if(!
$fp) echo $errstr.'dd';

fwrite($fp"USER ziq@list.ru");
while (!
feof($fp)) {
  echo 
fgets($fp128);
}

f
  
echo fgets($fp128);
}

fclose($fp);
?>

ответ такой

+OK 
Fatal error: Maximum execution time of 30 seconds exceeded in D:\www\lab\index.php on line 7

Что не так делаю? Помогите, пожалуйста.

   
 
 автор: kasmanaft   (12.10.2006 в 22:40)   письмо автору
 
   для: Ziq   (12.10.2006 в 22:36)
 

while (!feof($fp)) здесь не пройдет ..
в данном случае можно попробовать просто fgets($fp);

или послать кучу команд, закрыть соединение и читать уже while (!feof($fp))

   
 
 автор: Ziq   (12.10.2006 в 22:40)   письмо автору
 
   для: kasmanaft   (12.10.2006 в 22:40)
 

...

   
 
 автор: Ziq   (12.10.2006 в 23:01)   письмо автору
 
   для: kasmanaft   (12.10.2006 в 22:40)
 

изменил код на

<?
$fp 
fsockopen("pop.list.ru"110$errno$errstr);
if(!
$fp) echo $errstr.'dd';

fwrite($fp"USER ziq@list.ru");
echo 
fgets($fp128)."a";
fwrite($fp"PASS sdfdsfdsf");
echo 
fgets($fp128)."s";
fwrite($fp"LIST");
echo 
fgets($fp128)."d";
fwrite($fp"QUIT");
echo 
fgets($fp128)."f";

fclose($fp);
?>

ответ

+OK a
Fatal error: Maximum execution time of 4 seconds exceeded in D:\www\lab\index.php on line 11


Вы говорили закрыть соединение и читать уже while (!feof($fp)). Если закрыть соединение (fclose()), то feof() выдает ошибку.

   
 
 автор: Trianon   (13.10.2006 в 09:45)   письмо автору
 
   для: Ziq   (12.10.2006 в 23:01)
 

Уберите команду LIST
Это команда с многострочным ответом, и его Вы до конца не считываете. Отсюда и проблемы.
Кроме того, Вы переусердствовали с ограничением: 4 секунды на всю сессию может и не хватить.

   
 
 автор: kasmanaft   (13.10.2006 в 12:35)   письмо автору
 
   для: Ziq   (12.10.2006 в 23:01)
 

>> закрыть соединение и ....
я имел ввиду QUIT послать ...

а LIST можно читать до тех пор, пока не встретим точку:

while (trim($str) != '.')
    $str = fgets($fp, 128);


еще вы забыли про " \n " ... "Maximum execution time" тут наверное из-за етого
fwrite($fp, "USER ziq@list.ru\n");

(аналогично в остальных случаях)

   
 
 автор: Trianon   (13.10.2006 в 13:08)   письмо автору
 
   для: kasmanaft   (13.10.2006 в 12:35)
 

Да, действительно. Почти наверняка сервер ожидает конца строки.
Только не \n а \r\n

fwrite($fp, "USER ziq@list.ru\r\n"); 

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования