Суббота, 23 Ноября 2024, 05:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
забор и обработка писем с пмощью 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.

И опять всё правильно получаешь. smile Ты принял только первую строчку, в которой содержится сообщение о том, сколько байт содержит сообщение, которое ты собираешься прочитать. Остальные строки содержат информацию о сообщении, само сообщение, и последняя строка - только точку.

Короче, я вот написал так, и всё работает:
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", "Пора переходить на юникод.");
?>


пусто!)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг