| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > POP3 |
| Автор: dixoNICH 5.4.2011, 16:35 | ||
| в общем, вопрос в том : как мне получить сообщение? в RFC написано, что команда RETR выводит содержимое сообщение, но, ответ от сервера примерно ввиде : +OK, 120 octets. а как собственно сообщение прочитать? где мне его увидеть? средствами перла. т.е понятно, что отправляю серверу :
|
| Автор: Pfailed 5.4.2011, 17:56 | ||
Нужно
где $id - идентификатор сообщения, полученный командой LIST. Также смотрите в исходники Net::POP3 |
| Автор: dixoNICH 5.4.2011, 18:07 | ||||
пишу без модуля pop3) надо было уточнить. ну и что, напишу я это, в ответ же мне придёт что-то в стиле +OK 120 octets а как вывести само сообщение? recv мб мне может помочь? |
| Автор: Pfailed 5.4.2011, 19:08 |
| Читайте дальше пока не встретите строку равную ".\015\012". Net::POP3 имелся ввиду как источник где можно подсмотреть пример реализации. |
| Автор: dixoNICH 5.4.2011, 21:13 |
| не, всё же реализация через Net::POP3, по-моему, сильно отличается от моей не совсем понял, как извлеку я сообщения оттуда со своей реализацией) |
| Автор: dixoNICH 6.4.2011, 16:13 |
| всё, разобрался. вывожу в фором с помощью recv. осталось парсить строку только кстати если мне приходит русский текст или картинка - то как мне их обработать? |
| Автор: dixoNICH 7.4.2011, 19:09 |
| _ЙoЗПѓєЗАЯЪДїхrn>Б>lоКяЇ€тЋРЉ с в общем воспользовался я use MIME::Base64; и получил это что это и как мне получить русский текст? )) |
| Автор: Pfailed 7.4.2011, 19:10 |
| Какая кодировка у письма? Покажите вообще полученное сообщение до изменений. |
| Автор: dixoNICH 7.4.2011, 20:29 | ||||||
это картинка так пришла.
заголовок (на русском)
вот, вроде, сообщение. |
| Автор: Pfailed 7.4.2011, 20:42 |
| После декодирования base64 перекодируйте в нужную кодировку. Очевидно, что здесь сообщение в кодировке koi8-r. perldoc Encode |
| Автор: dixoNICH 7.4.2011, 20:59 |
| а какая кодировка мне нужна, чтобы получить русский текст и вывести его в eml файл? |
| Автор: Pfailed 7.4.2011, 21:17 |
| Та, которую понимает ваш просмотрщик. |
| Автор: dixoNICH 9.4.2011, 13:18 |
| а есть универсальная функция для перекодировки в cp1251? (ну, или что там поймёт виндовс и eml) чтобы, например, не из utf8 в cp1251, а из любой кодировки ну или как из koi8-r получить cp1251 (ну, или что понимает виндовс просто не могу разобраться, перлдок не очень помогает, и гугл тоже( |
| Автор: dixoNICH 10.4.2011, 13:49 | ||
| ещё одна проблема : если отправляю файл, то он, каким-то образом ломает сообщения мне )) взависимости от размера. если большой - то все, если не очень то парочку вот код, помогите разобраться, пожалуйста
|
| Автор: Pfailed 11.4.2011, 08:01 |
Функция from_to() из модуля Encode |
| Автор: dixoNICH 11.4.2011, 17:29 | ||
выделяю так то, что должен декодировать и загоняю в cp1251 получаетсяя что то вроде : 12412425151 просто цифры. если не декодировать base64 - то так же) |
| Автор: dixoNICH 11.4.2011, 17:50 | ||
делаю так. собственно, выводит что-то в стиле : 12421421421421321 ) без декодировки из бейс64 аналогично |
| Автор: Pfailed 11.4.2011, 18:19 |
| Прочтите внимательнее документацию по этой функции. Она не возвращает строку, а изменяет переданную. |
| Автор: dixoNICH 15.4.2011, 07:56 |
| спасибо. |
| Автор: dixoNICH 22.4.2011, 20:46 | ||
| Проблема такая : до меня доходят не все сообщения. точнее, когда как : иногда ничего не приходит, иногда 1 сообщение, иногда 2..n. интуитивно понимаю в чём ошибка, точнее догадываюсь. возможно, что я отправляю ему команду LIST, а он ещё отослал ему всё, а я ему RETR уже шлю. но, как это исправить - не представляю. прошу помощи (
|
| Автор: dixoNICH 23.4.2011, 16:12 |
| проблему решил |
| Автор: dixoNICH 27.4.2011, 12:58 | ||
| пытался решить проблему. всё сообщение не принять одним recv, пытался делить его на части по 1024 байта. появилась проблема - он посылает мне первое сообщение несколько раз, не знаю, где я накосячил(
|
| Автор: shamber 27.4.2011, 22:34 |
| dixoNICH, чего-то в вашем скрипте не заметно перебора писем после команды List. видно что вы все время одно и тоже письмо запрашиваете. Логично получить количество писем в массив. а потом перебрав массив, получить все письма. |
| Автор: dixoNICH 28.4.2011, 22:16 |
| почему не заметно? отправляю лист, узнаю кол-во сообщений, запускаю фор от единицы, до кол-во сообщений + 1, в форе отправляю print $socket "RETR $i\n"; потом сразу разбиваю и пушу в массив, потом джоин в строку |
| Автор: shamber 29.4.2011, 10:26 | ||
| For проглядел. Однако я погонял код у себя: 0. добавьте use strict; 1. ваша регулярка для получения количества писем не очень, на моем почтовом ящике не сработала лучше переписать так (\d+)\D+(\d+) 2. В моем случае, писем много и после запроса их индексов, а вы ведь после первого же письма сразу хотите получать тело, в тело попадают остатки команды LIST. 3. ваш код my $aaa = $2/1024; my $bbb = 1*$2 - $aaa*1024; ну очень плохо отрабатывает например размер 1921. может лучше my $aaa = int($size/1024); my $bbb = ($size % 1024); А вообще попробуйте так:
|
| Автор: dixoNICH 29.4.2011, 17:23 | ||
не работает, вообще ничего никуда не выводит. вот мой код, возможно у вас заработает
|
| Автор: shamber 29.4.2011, 22:41 | ||||||
Вот вы все равно упорствуете. посмотрите. что я вам написал нулевым пунктом?
Дальше ваши ошибки
Потом сравните мою 39 строку и вашу 68. Дальше писать? И кстати, что за странный способ писать подпрограмму, а потом ее вызвать?(Да и еще забывать ее вызывать?) Во вложении почту узнаете? Добавлено @ 22:51
Вообщем, ищите отличия, в них вся соль. |
| Автор: dixoNICH 1.5.2011, 01:02 |
| извините за мою не компетентность огромное спасибо за помощь! |
| Автор: shamber 1.5.2011, 01:45 |
| Пожалуйста. |