pop3, perl
От: dixoNN Россия  
Дата: 27.04.11 17:34
Оценка:
в общем такая проблема : так как одним 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;
pop3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.