# HG changeset patch # User Matthias Förste foerste@schlittermann.de # Date 1324473277 -3600 # Node ID 87ddf3322246bfae5496871f37ccb312b8111da5 # Parent d01a8cd90e338f3490ac21b2a95a14f29f534ce1 use Mail::IMAPTalk instead of Mail::IMAPClient diff -r d01a8cd90e33 -r 87ddf3322246 TODO --- a/TODO Wed Nov 09 21:08:32 2011 +0100 +++ b/TODO Wed Dec 21 14:14:37 2011 +0100 @@ -1,1 +1,2 @@ +* hangs with certain mailbox names (.2007.11 fex, probably the leading dot) * how to (really) deal with possible errors? maybe '--keep-going'? diff -r d01a8cd90e33 -r 87ddf3322246 isearch --- a/isearch Wed Nov 09 21:08:32 2011 +0100 +++ b/isearch Wed Dec 21 14:14:37 2011 +0100 @@ -25,7 +25,9 @@ use Getopt::Long; use Pod::Usage; -use Mail::IMAPClient; +use Mail::IMAPTalk; + +sub folders($); my $opts; my %imapopts = ( @@ -47,9 +49,13 @@ "password=s" => \$imapopts{Password}, "p|port=s" => \$imapopts{Port}, "s|server=s" => \$imapopts{Server}, - "u|user=s" => \$imapopts{User} + "u|user=s" => \$imapopts{Username} ) or pod2usage(); -defined $opts->{criteria} and defined $imapopts{User} or pod2usage(); +defined $opts->{criteria} and defined $imapopts{Username} or pod2usage(); + +# quoting not supported, whitespace has to be escaped +my @criteria = split /(?{criteria}; +#my @criteria = qw(or or to schlittermann cc schlittermann bcc schlittermann); if (defined $imapopts{Password}) { @@ -73,11 +79,13 @@ } -my $imap = Mail::IMAPClient->new(%imapopts) +my $imap = Mail::IMAPTalk->new(%imapopts) or die "Could not connect to IMAP server\n"; -my $f = @ARGV ? [@ARGV] : $imap->folders; -die "Can't get folderlist: " . $imap->LastError . "\n" unless $f; +$imap->set_tracing(1) if $ENV{TRACE}; + +my $f = @ARGV ? [@ARGV] : folders($imap); +die "No folders found\n" unless $f; my $mids; @@ -88,26 +96,27 @@ print "Examining $_ ...\n"; unless ($imap->examine($_)) { - my $e = $imap->LastError; + my $e = $@; # skip folder with invalid name if ( $e =~ /BAD Error in IMAP command EXAMINE: 8bit data in atom$/ or $e =~ /NO Invalid mailbox name: /) { - warn "[WARN] Can't examine '$_': $e\n"; + warn "[WARN] Can't examine '$_': $e"; print "Skipping $_ ...\n"; next; } else { - die "Can't examine '$_': $e\n"; + die "Can't examine '$_': $e"; } } print "Searching $_ ...\n"; - if (my $m = $imap->search($opts->{criteria})) { + #if (my $m = $imap->search('1:*', $opts->{criteria})) { + if (my $m = $imap->search('1:*', @criteria)) { $mids->{$_} = $m; } elsif (my $e = $@) { @@ -138,9 +147,9 @@ if (@{$m}) { $imap->examine($f) - or die "Can't examine: " . $imap->LastError . "\n"; + or die "Can't examine: " . $@ . "\n"; my $h = $imap->parse_headers($mids->{$f}, @headers) - or die "Can't get summaries: " . $imap->LastError . "\n"; + or die "Can't get summaries: " . $@ . "\n"; for my $id (keys %{$h}) { @@ -157,6 +166,25 @@ print "Done\n"; +sub folders($) { + + my ($i) = @_; + + my $l; + my ($r, $f) = ('', '*'); + die "Can't list('$r', '$f'): $@" unless $l = $i->list($r, $f); + + # list looks like this: [ [[flags1], separator1, name1], [[flags2], separator2, name2], ... ] + ref $l eq 'ARRAY' and return [ map $_->[2], @{$l} ]; + + # this should not happen + ref $l and die "array ref or ordinary scalar expexted\n"; + + # assuming empty list result + return []; + +} + __END__ =pod