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 файл принялся нормально.
в чём проблема?
Здравствуйте, 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 на эту тему.