sub _toporretr {   my($self, %args) = @_;   my $msgidx = $args{MSGID} || 1;   my $lines = $args{LINES} || 0;   my $cmd = $args{CMD};   my $fh = $args{FH};   my $nohead = $args{NOHEAD};   $lines =~ /\d+/ or $lines = 0;   if($cmd eq POP3CMD_TOP) { $self->print(POP3CMD_TOP." $msgidx $lines", $self->eol()); }   else { $self->print(POP3CMD_RETR." $msgidx", $self->eol()); }   my $line = $self->getline();   chomp $line;   my $buflen = 0;   $line =~ /^\+OK/ or $self->message("Bad return from $cmd: $line") and return;   $line =~ /^\+OK (\d+) / and $buflen = $1;   my $retval = '';   while(defined($line = $self->getline()))   {            unless($nohead)      {         $line =~ /^\.\s*$/ and last;         $line =~ s/^\.\././;         $fh ? (print $fh $line) : ($retval .= $line);      }      $nohead and $line =~ /^\s*$/ and $nohead = 0;   }   return $fh ? 1 : wantarray ? split(/\r?\n/, $retval) : $retval; } sub header {   my($self, $msgid, $lines, $fh) = @_;   return $self->_toporretr(CMD => POP3CMD_TOP, MSGID => $msgid, LINES => $lines, FH => $fh); } sub header_body {   my($self, $msgid, $fh) = @_;   return $self->_toporretr(CMD => POP3CMD_RETR, MSGID => $msgid, FH => $fh); } sub body {   my($self, $msgid, $fh) = @_;   return $self->_toporretr(CMD => POP3CMD_RETR, MSGID => $msgid, FH => $fh, NOHEAD => 1); }