в общем такая проблема : так как одним recv не принять всё сообщение (если оно большое), то разбиваю сообщение на 1024 байта и потом соединяю. но не знаю как, мне 1-ое сообщение приходит несколько раз, и из-за этого теряются другие сообщения. использую, если что, io socket. помогите разобраться, пожалуйста)
open F, ">mail.txt";
sub LISTandRETR {
print $socket "LIST\n";
my $invitation=<$socket>;
$invitation=~/(\d+)\s(\d+)/; # выделяем кол-во сообщений и их объём
$qt=$1; # колличество сообщений
$s=$2; # объём почтового ящика
for($i=1;$i<$qt+1;$i++) {
$invitation=<$socket>;
$invitation=~m/(\d+)\s(\d+)/; # для вывода номера и размера письма
print F"Number : $1\n";
print F"Octets : $2\n";
$let=$1;
#######################################################################
print $socket "RETR $i\n";
$aaa = 1*$2/1024; $bbb = 1*$2 - $aaa*1024; # разбиваем сообщения
for (1..$aaa) {
recv$socket,$ccc,1024,0;
push@hhh,$ccc;
}
recv$socket,$sss,$bbb,0;
push@hhh,$sss;
$invitation = join '', @hhh;
#print $invitation;
while($invitation=~/Content-Disposition:\sattachment;\sfilename="(.*)"/g){
$filename=$1;
open S, ">$filename";
close S;
}
if($invitation=~m/Date:\s(.+)/g){print F "Date : $1\n";}
if($invitation=~/From:\s\=\?KOI8\-R\?B\?(.*)\?\=(.+)/i){
$a=$1;
$s=decode_base64($a);
Encode::from_to($s, "KOI8-R", "cp1251");
print F "From : $s $2\n";
}
elsif($invitation=~/From:\s(.+\<.*\>)/i){print F "From : $1\n";}
print F"<--------------------------->\n";
}
close F;
} LISTandRETR;