Показать полную графическую версию : Как прочитать письма на мейл сервере из PHP?
Vlad Drakula
16-06-2004, 23:22
Как прочитать письма на мейл сервере из PHP?
Зависит от того по какому протоколу он (сервер) предоставляет доступ. Если 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 я прочитал, там нет ничего сложного!
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 а куда нужно обратиться за получением уникального статуса?
Vlad Drakula
послушай, uucp э-э-э, как бы это сказать помягче, немножко не очень широко в наше время используемый протокол. Его мягко говоря, мало где сейчас используют.
Причем машины, которые раздают почту по uucp/uupc сами ее благополучно выкидывают/получают по smtp/pop3
(если ты работаешь с соответствующим сервером СПбГУ - то его все вышесказанное касается напрямую)
Это я к тому, что с uucp разобраться, конечно полезно и почетно, но по нечетным лучше smtp/pop3 заняться :)
Vlad Drakula
19-06-2004, 00:04
mar
под UUCP я имел ввиду локалный сервер который заведует у меня почтой. К нему я коннекчусь по POP3.
понятно :) я уж решила восхититься :) под 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, но я не понял как понять что письмо уже кончилось... :(
может кто подскажет?
признак конца письма, если мне не изменяет пямять, \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>
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>
к сожелению тут нету тега :(
Vlad Drakula
конечно, интересно :)
Vlad Drakula
21-06-2004, 02:07
mar
если еще чтонибуть будет интересно, то спрашивай!
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.