Войти

Показать полную графическую версию : Как прочитать письма на мейл сервере из PHP?


Страниц : [1] 2

Vlad Drakula
16-06-2004, 23:22
Как прочитать письма на мейл сервере из PHP?

ivank
17-06-2004, 00:12
Зависит от того по какому протоколу он (сервер) предоставляет доступ. Если POP3, то подойдёт Net_POP3 (http://pear.php.net/package/Net_POP3) из PEAR, если IMAP, то Net_IMAP (http://pear.php.net/package/Net_IMAP) оттуда же.

Либо можно взять/посмотреть inc/class.uebimiau_mail.php из почтового клиента UebiMiau (google it). Он дружит с обоими протоколами, и не требует PEAR совсем.

Добавлено:

Забыл третий вариант: читать RFC и писать реализацию клиентского протокола самому, используя сокеты и иже с ними. Хотя, думаю, он и так будет отвергнут...

Vlad Drakula
17-06-2004, 00:37
ivank
черт чегото я с тормозил....
в PHP есть встроенные функции для работы с IMAP причем скорее всего у меня есть доступ по этому протоколу к почтовому ящику....

тогда возникает другой вопрос - где взять imap сервер для тогочтобы все это можно было тестировать на локалхосте?

Vlad Drakula
17-06-2004, 22:44
ivank
как не странно, но я решил писать все сам, RFC я прочитал, там нет ничего сложного!

mar
18-06-2004, 10:44
Vlad Drakula насколько я тебя знаю - не странно :) и ихмо правильно, а ivank, просто пошутил.
В POP3 протоколе мало сложного. Развлекон начинается в кодировках, mime и прочих RFC на те же темы.
А если использовать IMAP, то встроенные функции языка, как вкомпиленные *:) работать будут скорее всего эффективнее, чем свои.


Исправлено: mar, 10:45 18-06-2004

Vlad Drakula
18-06-2004, 22:21
сейчас пишу маленький скрипт...
научился коннектиться и начал забирать почту...
но вот только по непонятной причине я не могу дочитать письмо до конца, т.е. 3/4 прочитал, а потом сервер повис....

может кто с таки м сталкивался?

PS
в качестве мейл сервера я использую UUCP


Добавлено:

ivank а куда нужно обратиться за получением уникального статуса?

mar
18-06-2004, 22:57
Vlad Drakula
послушай, uucp э-э-э, как бы это сказать помягче, немножко не очень широко в наше время используемый протокол. Его мягко говоря, мало где сейчас используют.
Причем машины, которые раздают почту по uucp/uupc сами ее благополучно выкидывают/получают по smtp/pop3
(если ты работаешь с соответствующим сервером СПбГУ - то его все вышесказанное касается напрямую)
Это я к тому, что с uucp разобраться, конечно полезно и почетно, но по нечетным лучше smtp/pop3 заняться :)

Vlad Drakula
19-06-2004, 00:04
mar
под UUCP я имел ввиду локалный сервер который заведует у меня почтой. К нему я коннекчусь по POP3.

mar
19-06-2004, 00:23
понятно :) я уж решила восхититься :) под uucp весьма заморочные строки посылать надо. В более молодых протоколах все намного проще. По поводу отвала сервера: ты решаешь задачу со слишком большим количеством неизвестных:
1) стоит у тебя, насколько я понимаю, винда, которая бог знает чем занята и никому ничем не обязана (начиная от шаловливости ее сокетов и кончая тем, что в это самое время какое-нибудь приложение выполнило недопустимую... далее по тексту
2) на ней какой-то (судя по всему uuconnect? или нечто подобное сервачек) Он вообще никому ничего не обязан.
3) и ты на всем этом сыром хозяйстве пытаешься отладить еще сырую программу.
(Помнится, когда мы писали маленький сишный почтовый сервер под *nix, мне для полноты картины захотелось скомпилировать (с соответствующими изменениями, конечно, все это под windows. Я уже не помню, чем дело кончилось, но поначалу под винды среди прочего всякий мусор в сокет лез :( А под unix все было хорошо: причем и под FreeBSD, и под Linux ) Может быть с чем-то подобным твои задержки и связаны.
Ну и в-четвертых, сейчас придет Prisoner и выгонит всех в программирование :gigi:

Vlad Drakula
19-06-2004, 00:49
mar
все это я уже знаю, завтра буду разговаривать с человеком который писал нечто подобное на похожей системме но на ASP.NET

mar
я не думаю что Prisoner нас выгонит отсюда, ведь разговор на прямую связан с написанием веб скрипта!

Vlad Drakula
20-06-2004, 21:28
читал я RFC, но я не понял как понять что письмо уже кончилось... :(

может кто подскажет?

mar
20-06-2004, 22:23
признак конца письма, если мне не изменяет пямять, \n.\n, (точка на отдельной строчке), ну и заголовки дальше начинаются. Но если ты не парсишь mailbox (те не пишешь pop3 - демон), а общаешься с pop3d, как почтовый клиент, то это дело демона знать, где заголовки, где тела писем и где все это кончается. Там же (в POP3 протоколе) и команды, помнится имеются, типа показать заголовки, показать такое-то письмо  и т.д.

Vlad Drakula
20-06-2004, 22:28
mar
да там есть команда показать письмо, но....
он выплевывает все это в поток, пока не скачаю все целиком он не воспринимает другие команды, т.е. я должен понять когда письмо закончилось, если я запрошу следующую строчку, то сервер повиснет :(

Добавлено:

я разобрался, ка это все делается!

для тех кому тоже интересно как это все делается привозу листинг  простейшего скрипта который подсоединяется в серверу скачивает первое писмо и закрывает соединение.


<html>
<body>
<?
$fp = fsockopen("localhost", 111, $errno, $errstr);

if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   print fgets($fp, 128).'<br />';
   fwrite($fp, "USER webmaster_vstyle\r\n");
   print fgets($fp, 128).'<br />';
   fwrite($fp, "PASS vlad\r\n");
   print fgets($fp, 128).'<br />';
   fwrite($fp, "STAT\r\n");
   print $s = fgets($fp, 128).'<br />';
   preg_match('#^\+OK (\d+) (\d+)#', $s, $r).'<br />';
   fwrite($fp, "RETR 1\r\n");
   print $s = fgets($fp, 128).'<br />';
   preg_match('#^\+OK (\d+)#', $s, $r).'<br />';
   $n = 0;
   while( $n < $r[1] )
   {
     $s = fgets($fp, 65536);
     $n += strlen($s);
     print $s.'<br />';
     flush();
   }
   print fgets($fp, 128).'<br />';
   fwrite($fp, "QUIT\r\n");
   print fgets($fp, 128).'<br />';

   fclose($fp);
}

?>
</body>
</html>

mar
20-06-2004, 23:23
Vlad Drakula
а слабо для тех кому тоже интересно откомметировать поподробней ;)

Vlad Drakula
21-06-2004, 00:16
mar
если тебе это интересно то конечно:

<html>
<body>
<?
// название хоста POP3 сервера
$Host = 'localhost';
// Номер порта POP3 сервера ( обычно 110 )
$Port = 111;
// имя учотной записи на сервере
$User = 'webmaster_vstyle';
// пароль учетной записи на сервере
$Password = 'vlad';
// открытие сетевого соединения
$fp = fsockopen( $Host, $Port, $errno, $errstr);

// проверка на удачность осединения
if (!$fp)
{
 // не удалось соединиться, выводим сообщение об ошибке
 echo $errstr.' ('.$errno.")<br />\n";
}
else
{
 // выводим преглошение сервера
 print fgets($fp, 128).'<br />';
 // посылаем запрос на авторизацию
 fwrite($fp, 'USER '.$User."\r\n");
 // выводим результат запроса
 print fgets($fp, 128).'<br />';
 // посылаем пароль
 fwrite($fp, 'PASS '.$Password."\r\n");
 // выводим подтверждение авторизации
 print fgets($fp, 128).'<br />';
 // запрашиваем статистику с сервера
 fwrite($fp, "STAT\r\n");
 // выводим статистику с сервера ( одна октава - один байт )
 print $s = fgets($fp, 128).'<br />';
 // запрашиваем первое письмо
 fwrite($fp, "RETR 1\r\n");
 // читаем резушьтат
 print $s = fgets($fp, 128).'<br />';
 // видираем из результата количество октав в письме
 preg_match('#^\+OK (\d+)#', $s, $r).'<br />';
 $n = 0;
 // читаем писмо пока не кончилось
 while( $n < $r[1] )
 {
   // читаем строку
   $s = fgets($fp, 65536);
   // добавляем размер прочитанной строки к счетчику
   $n += strlen($s);
   // выводим строку
   print $s.'<br />';
   // посылаем ее броузеру
   flush();
 }
 // выводим коней файла
 print fgets($fp, 128).'<br />';
 // посылаем комадду отсоединения от сервера
 fwrite($fp, "QUIT\r\n");
 // выводим сообщение об удачном отсоединении
 print fgets($fp, 128).'<br />';
 // закрываем соединение ссервером
 fclose($fp);
}
?>
</body>
</html>


к сожелению тут нету тега :(

mar
21-06-2004, 00:40
Vlad Drakula
конечно, интересно :)

Vlad Drakula
21-06-2004, 02:07
mar
если еще чтонибуть будет интересно, то спрашивай!

mar
21-06-2004, 12:18
обязательно :biglaugh:

vadimiron
21-06-2004, 14:10
Мне тоже интересно :)

Я никогда с почтой не работал

Vlad Drakula

Такой вопрос: а что нет стандартных каких нибудь функций в ПХП для работы с почтой?? Или хотелось просто что то своё написать???

А данный код я уже скопировал и сохранил. На будущее :)

Исправлено: vadimiron, 12:11 21-06-2004

Vlad Drakula
21-06-2004, 18:50
vadimiron
в PHP я не нашол функций для работы с POP3, тас есть для работы с SMTP & imap & NNTP

если кому интересно то я могу выложить на сеобщее обозрение программу которая организует WWW4MAIL, причем как с почтовым так и с веб интерфейсом.

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

кстати с помошью этого простого скрипта понял почему письма с осзоны вешают UUCP.




© OSzone.net 2001-2012