забор и обработка писем с пмощью PHP скрипта
| |
Andy-go | Дата: Вторник, 24 Июля 2012, 15:07 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Делаю все по урокам тут: 1 и тут: 2
Пытаюсь работать с ящиком на yandex.ru Возникают следующие "непонятки": 1- пишем такой вот код Code $pop_conn = fsockopen("pop.yandex.ru", 110,$errno, $errstr, 10); $code=fgets($pop_conn,1024); print $code; Должно ответить: +OK Вместо этого(точнее вместе) я получаю: +OK POP Ya! v1.0.0na@5 pvidxPiRsOs1
ну ладно думаю я мало ли чего он там бормочет, работает же вроде как и продолжаю: Code $pop_conn = fsockopen("pop.yandex.ru", 110,$errno, $errstr, 10); $code=fgets($pop_conn,1024); fputs($pop_conn,"USER username\r\n"); $code= fgets($pop_conn,1024); fputs($pop_conn,"PASS pass\r\n"); $code= fgets($pop_conn,1024); print $code; Должно ответить: +OK username@yandex.ru maildrop has 2 messages (8192 octets) вместо этого я получаю: +OK 5 7692 Ладно снова думаю я это ведь по сути то же само только короче, и тут начинается самое "интересное": я пишу: Code $pop_conn = fsockopen("pop.yandex.ru", 110,$errno, $errstr, 10); $code=fgets($pop_conn,1024); fputs($pop_conn,"USER username\r\n"); $code= fgets($pop_conn,1024); fputs($pop_conn,"PASS pass\r\n"); $code= fgets($pop_conn,1024); fputs($pop_conn,"LIST \r\n"); $code= fgets($pop_conn,1024); print $code; И ожидаю, согласно урока увидеть что-то на подобии: +OK 2 messages (8192 octets) 1 6654 2 1372 ... Но вместо этого получаю знакомое: +OK 5 7692 И ничего более( В тут чем проблема? далее при попытке получить первые строки определенного письма: Code $pop_conn = fsockopen("pop.yandex.ru", 110,$errno, $errstr, 10); $code=fgets($pop_conn,1024); fputs($pop_conn,"USER username\r\n"); $code= fgets($pop_conn,1024); fputs($pop_conn,"PASS pass\r\n"); $code= fgets($pop_conn,1024); fputs($pop_conn,"TOP 1 3\r\n"); $code= fgets($pop_conn,1024); print $code;
я вроде бы должен получить ответ наподобии: +OK Received: from [212.164.71.38] (port=43490 helo=imx2.ngs.ru) by user.mail.ru with esmtp Date: Mon, 27 Aug 2007 18:08:00 +0700 X-Mailer: The Bat! (v3.99.3) Professional X-Priority: 3 (Normal) X-Spam: Not detected [.....тут идут дальше заголовки, я их вырезал, в целях экономии места...]
Здравствуйте.
это идет текст письма…
а Вместо этого получаю: +OK 1541 octets. Да в примере предлагается использовать код: Code fputs($pop_conn,"TOP 1 3\r\n"); print get_data($pop_conn); Но функция get_data не определенна и соответственно я получаю сообщение об ошибке... Если вы можете, подскажите как все это сделать чтобы работало, или где почитать туориал по этой теме такой чтобы с примерами кода и работающими.
Сообщение отредактировал Andy-go - Вторник, 24 Июля 2012, 15:11 |
|
| |
TimKruz | Дата: Вторник, 24 Июля 2012, 19:43 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Andy-go, всё правильно работает. Просто разные POP-сервера по-разному отвечают на запросы. Quote (Andy-go) Но функция get_data не определенна В уроке по твоей же первой ссылке в самом верху записана эта функция. Просто добавь её в начало кода. Quote (Andy-go) Должно ответить: +OK Вместо этого(точнее вместе) я получаю: +OK POP Ya! v1.0.0na@5 pvidxPiRsOs1 Всё правильно. Сервер Яндекса выдаёт тебе свою версию и уникальный код после символа "@" (если повторно подключиться, код изменится). Quote (Andy-go) Должно ответить: +OK username@yandex.ru maildrop has 2 messages (8192 octets) вместо этого я получаю: +OK 5 7692 Тут тоже всё правильно. Он тебе сообщает, что заброс принят, ты авторизован и в твоём почтовом ящике хранится 5 сообщений общим весом 7692 байта. Если бы ты выводил каждую строку на экран, получил бы что-то типа этого: Quote +OK POP Ya! v1.0.0na@2 q9nZpXKcA4Y1 //"Запрос принят, вот моя версия, вот ваш индентификатор" +OK password, please. //"Логин принят, введите пароль" +OK 226 2293747 //"Пароль принят, в почтовом ящике столько-то сообщений на столько-то байт всего" Quote (Andy-go) Но вместо этого получаю знакомое: +OK 5 7692 И ничего более( В тут чем проблема? Просто POP-сервер отправляет тебе сразу несколько строк, и ты должен считать их все. Ты считал только первую строку - а она как раз содержит информацию о том, сколько в ящике сообщений и сколько они весят. Далее, начиная со второй строки и до предпоследней, строка имеет вид "[номер сообщения] [вес сообщения в байтах]", например: "132 3229". Последняя строка содержит только точку (конец, дальше строк нет). Quote (Andy-go) далее при попытке получить первые строки определенного письма: я вроде бы должен получить ответ наподобии: а Вместо этого получаю: +OK 1541 octets. И опять всё правильно получаешь. Ты принял только первую строчку, в которой содержится сообщение о том, сколько байт содержит сообщение, которое ты собираешься прочитать. Остальные строки содержат информацию о сообщении, само сообщение, и последняя строка - только точку.
Короче, я вот написал так, и всё работает: Code <?php //Опишем простую функцию чтения сразу всех строк, отправленных сервером function get_data($pop_conn) { $data=""; while (!feof($pop_conn)) { $buffer = chop(fgets($pop_conn,1024)); $data .= "$buffer<br>"; //Соединяем строки if(trim($buffer) == ".") break; //Если точка, прекращаем чтение } return $data; //Возвращаем полученный текст }
$pop_conn = fsockopen("pop.yandex.ru", 110, $errno, $errstr, 10); //Попытка соединения echo fgets($pop_conn,1024)."<br>"; fputs($pop_conn,"USER lol\r\n"); //Имя пользователя (логин) echo fgets($pop_conn,1024)."<br>"; fputs($pop_conn,"PASS 12345678\r\n"); //Пароль пользователя (аккаунта) echo fgets($pop_conn,1024)."<br>"; fputs($pop_conn,"LIST \r\n"); //Проверяем список сообщений echo get_data($pop_conn); fputs($pop_conn,"RETR 224 \r\n"); //Читаем сообщение №224 echo get_data($pop_conn); fputs($pop_conn,"QUIT \r\n"); //Уходим с сервера echo get_data($pop_conn); ?> В ответ получил (сократил, там дофига инфы выдает): Quote +OK POP Ya! v1.0.0na@5 eUnxvvoo7uQ1 +OK password, please. +OK 226 2293747 +OK 226 2293747 1 3638 2 2672 3 21797 <вырезал нафиг> 224 5070 225 29867 226 2694 . +OK 5070 octets. X-Yandex-FolderName: Vhodyashchie Received: from mxfront5h.mail.yandex.net ([127.0.0.1]) by mxfront5h.mail.yandex.net with LMTP id tbSuZTAN for ; Tue, 17 Jul 2012 21:55:37 +0400 Received: from srv1.ucozmail.com (srv1.ucozmail.com [193.109.247.130]) by mxfront5h.mail.yandex.net (nwsmtp/Yandex) with ESMTP id tbH4IIJP-tbHG2UU8; Tue, 17 Jul 2012 21:55:37 +0400 <вырезал середину этой стены букв, итак всё ясно> [----- абаПаИбаАбббб аОб баАбббаЛаКаИ -----] http://gcup.ru/index/... [----- абаПаИбаАбббб аОб баАбббаЛаКаИ -----]
. +OK shutting down. Кстати. Список команд протокола POP3 легко найдёшь в интернете, но "варианты ответа" не принимай как единственно верные, ведь у каждого сервера они могут отличаться...
|
|
| |
Andy-go | Дата: Среда, 08 Августа 2012, 11:42 | Сообщение # 3 |
участник
Сейчас нет на сайте
| TimKruz, СПС тебе огромное! Добавлено (08.08.2012, 11:42) --------------------------------------------- Ещё одна проблемка появилась: письма приходят в кодировке windows-1251 а я скрипт в utf-8, и соответственно вместо тела письма я получаю:
=CF=EE=EB=FC=E7=EE=E2=E0=F2=E5=EB=FC # 79016108769 =EE=EF=EB=E0=F2=E8=EB =
Как это перевести в человеческий язык?
|
|
| |
gmmmm | Дата: Среда, 08 Августа 2012, 13:01 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| На php есть функция iconv() http://www.php.su/functions/?iconv
Пример. Пример использования iconv():
Code <?php echo iconv("windows-1251", "UTF-8", "Пора переходить на юникод."); ?>
пусто!)
|
|
| |
|