принятие файла поп протоколу pop3.
От: dixoNN Россия  
Дата: 02.05.11 16:00
Оценка:
while($buf=~/Content-Disposition:\sattachment;\sfilename="(.*)"/g){ # filename, baby
            my $filename=$1;
            open S, ">$filename";
            if($buf=~/X-Attachment-Id:\s\w+[\r\n]{4}([\w\r\n\=\+\/]+)/sg){
                my $file=$1;
                #print $file;
                $file=decode_base64($file);
                print S $file;
                close S;
            }
        }

собственно, вот так принимаю файл. но, вместо картинки с милой птичкой получил что-то вроде зелёной блювотной массы, а вместо eml файла
бЮЬ ОНВРНБШИ

а txt файл принялся нормально.
в чём проблема?
Re: принятие файла поп протоколу pop3.
От: anonymous Россия http://denis.ibaev.name/
Дата: 03.05.11 05:38
Оценка:
Здравствуйте, dixoNN, Вы писали:

NN>в чём проблема?


Во первых, надо выставить дескриптору файла бинарный режим через binmode().
Re: принятие файла поп протоколу pop3.
От: Centaur Россия  
Дата: 03.05.11 07:42
Оценка:
Здравствуйте, dixoNN, Вы писали:

NN>while($buf=~/Content-Disposition:\sattachment;\sfilename="(.*)"/g){ # filename, baby
NN>            my $filename=$1;

Здесь потом понадобится уметь декодировать имена файлов, не представимые в кодировке us-ascii. Кроме того, будут проблемы с некоторыми кривыми, но распространёнными почтовыми клиентами-отправителями, которые будут передавать кириллицу не закодированной по RFC2184, без указания кодировки и/или с указанием неправильной кодировки.

NN>            open S, ">$filename";

Тут, как уже сказали, надо открывать в двоичном режиме.

Алсо, жду не дождусь публикации почтового адреса, который будет выгребать этот скрипт — чтобы послать туда специально сформированное письмо со строчкой

Content-Disposition: attachment; filename="/etc/passwd"

ну или, на худой конец, если скрипт таки будет работать от ограниченного пользователя,

Content-Disposition: attachment; filename="~/.bashrc"

и далее определением какого-нибудь удобного алиаса на sudo.

NN>            if($buf=~/X-Attachment-Id:\s\w+[\r\n]{4}([\w\r\n\=\+\/]+)/sg){

Что это за странный регексп? Никто не гарантирует, что последним заголовком будет X-Attachment-Id (и что он вообще будет). Кроме того, мне кажется, выражение в скобках рискует захватить больше, чем нужно.

NN>                my $file=$1;
NN>                #print $file;
NN>                $file=decode_base64($file);

Аттач не обязан быть закодирован именно как base64 — там может быть и quoted-printable.

NN>                print S $file;
NN>                close S;
NN>            }
NN>        }

NN>собственно, вот так принимаю файл. но, вместо картинки с милой птичкой получил что-то вроде зелёной блювотной массы, а вместо eml файла
NN>бЮЬ ОНВРНБШИ

Это текст «Ваш почтовый», записанное в кодировке windows-1251, если вы при просмотре думаете, что он в koi8-r.

NN>в чём проблема?


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