Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Как прочитать письма на мейл сервере из PHP? (http://forum.oszone.net/showthread.php?t=31133)

Vlad Drakula 16-06-2004 23:22 213486

Как прочитать письма на мейл сервере из PHP?

ivank 17-06-2004 00:12 213487

Зависит от того по какому протоколу он (сервер) предоставляет доступ. Если POP3, то подойдёт Net_POP3 из PEAR, если IMAP, то Net_IMAP оттуда же.

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

Добавлено:

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

Vlad Drakula 17-06-2004 00:37 213488

ivank
черт чегото я с тормозил....
в PHP есть встроенные функции для работы с IMAP причем скорее всего у меня есть доступ по этому протоколу к почтовому ящику....

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

Vlad Drakula 17-06-2004 22:44 213489

ivank
как не странно, но я решил писать все сам, RFC я прочитал, там нет ничего сложного!

mar 18-06-2004 10:44 213490

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


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

Vlad Drakula 18-06-2004 22:21 213491

сейчас пишу маленький скрипт...
научился коннектиться и начал забирать почту...
но вот только по непонятной причине я не могу дочитать письмо до конца, т.е. 3/4 прочитал, а потом сервер повис....

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

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


Добавлено:

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

mar 18-06-2004 22:57 213492

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

Vlad Drakula 19-06-2004 00:04 213493

mar
под UUCP я имел ввиду локалный сервер который заведует у меня почтой. К нему я коннекчусь по POP3.

mar 19-06-2004 00:23 213494

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

Vlad Drakula 19-06-2004 00:49 213495

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

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

Vlad Drakula 20-06-2004 21:28 213496

читал я RFC, но я не понял как понять что письмо уже кончилось... :(

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

mar 20-06-2004 22:23 213497

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

Vlad Drakula 20-06-2004 22:28 213498

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 213499

Vlad Drakula
а слабо
Цитата:

для тех кому тоже интересно
откомметировать поподробней ;)

Vlad Drakula 21-06-2004 00:16 213500

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 213501

Vlad Drakula
конечно, интересно :)

Vlad Drakula 21-06-2004 02:07 213502

mar
если еще чтонибуть будет интересно, то спрашивай!

mar 21-06-2004 12:18 213503

обязательно :biglaugh:

vadimiron 21-06-2004 14:10 213504

Мне тоже интересно :)

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

Vlad Drakula

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

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

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

Vlad Drakula 21-06-2004 18:50 213505

vadimiron
в PHP я не нашол функций для работы с POP3, тас есть для работы с SMTP & imap & NNTP

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

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

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

vadimiron 21-06-2004 21:21 213506

Vlad Drakula

Подожди, как то нету???
Вот здесь почитай, я конечно не спец, но похоже на то

Vlad Drakula 22-06-2004 01:13 213507

vadimiron
да там есть фукции имап, я об этом уже писал выше, но это имат а не поп3 у амапа бругой протокол и юругой прот.

всатаки это полезно написать самому.

к тому же я обнаружил в чем проблеммы с письмами от форума, если не уметь работать с сервером на прямую то это никто никогда не обнаружил бы!



vadimiron 22-06-2004 02:47 213508

Цитата:

да там есть фукции имап, я об этом уже писал выше, но это имат а не поп3 у амапа бругой протокол и юругой прот.
Странно-а зачем они в мануале тогда IMAP, POP3 and NNTP Functions пишут ? :(

Vlad Drakula 22-06-2004 19:37 213509

vadimiron
возмодно там гдето и есть чтонибуть про поп3, но я нинашол ни одного упоминания о нем как кроме этого заголовка.

грабли на которые я наступал
я хочу поделиться с вами личным опытом и предупредить об ошибках которых могло и не быть.

первые грабли :
на запророс "RETR 1"
сервер волне может ответить "+OK" и ничего больше!
это надо учитывать!

т.е. перед тем как запросить "RETR 1" надо запросить "LIST 1"


Время: 03:27.

Время: 03:27.
© OSzone.net 2001-