#!/usr/local/bin/perl # mail_search.cgi # Find mail messages matching some pattern require './spam-lib.pl'; &foreign_require("mailbox", "mailbox-lib.pl"); &ReadParse(); if ($in{'simple'}) { # Make sure a search was entered $in{'search'} ne "" || &error($mailbox::text{'search_ematch'}); } elsif (defined($in{'score'})) { # Make sure a score was entered $in{'score'} =~ /^\d+$/ || &error($text{'search_escore'}); } else { # Validate search fields for($i=0; defined($in{"field_$i"}); $i++) { if ($in{"field_$i"}) { $in{"what_$i"} || &error(&mailbox::text('search_ewhat', $i+1)); $neg = $in{"neg_$i"} ? "!" : ""; push(@fields, [ $neg.$in{"field_$i"}, $in{"what_$i"} ]); } } @fields || &error($mailbox::text{'search_enone'}); } &ui_print_header(undef, $mailbox::text{'search_title'}, ""); $folder = &spam_file_folder(); if ($in{'simple'}) { # Just search by Subject and From in one folder, or body, depending # on preferences ($mode, $words) = &mailbox::parse_boolean($in{'search'}); if ($userconfig{'search_body'} && $mode != 2) { # Do an 'and' or 'or' search of body @searchlist = map { [ 'body', $_ ] } @$words; @rv = &mailbox::mailbox_search_mail(\@searchlist, $mode, $folder); } elsif ($mode == 0) { # Can just do a single 'or' search @searchlist = map { ( [ 'subject', $_ ], [ 'from', $_ ] ) } @$words; @rv = &mailbox::mailbox_search_mail(\@searchlist, 0, $folder); } elsif ($mode == 1) { # Need to do two 'and' searches and combine @searchlist1 = map { ( [ 'subject', $_ ] ) } @$words; @rv1 = &mailbox::mailbox_search_mail(\@searchlist1, 1, $folder); @searchlist2 = map { ( [ 'from', $_ ] ) } @$words; @rv2 = &mailbox::mailbox_search_mail(\@searchlist2, 1, $folder); @rv = @rv1; %gotidx = map { $_->{'idx'}, 1 } @rv; foreach $mail (@rv2) { push(@rv, $mail) if (!$gotidx{$mail->{'idx'}}); } } else { &error($mailbox::text{'search_eboolean'}); } print "

",&mailbox::text('search_results2', scalar(@rv), "$in{'search'}"),"

\n"; } elsif (defined($in{'score'})) { # Search by score @rv = &mailbox::mailbox_search_mail( [ [ 'x-spam-level', '*' x $in{'score'} ] ], 0, $folder); print "

",&text('search_results5', scalar(@rv), $in{'score'}),"

\n"; } else { # Complex search @rv = &mailbox::mailbox_search_mail(\@fields, $in{'and'}, $folder); print "

",&mailbox::text('search_results4', scalar(@rv)),"

\n"; } @rv = reverse(@rv); &mailbox::set_sort_indexes($folder, \@rv); print "

\n"; if ($mailbox::userconfig{'top_buttons'} && @rv) { &show_buttons(1); print "$mailbox::text{'mail_all'} \n"; print "$mailbox::text{'mail_invert'} \n"; } if (@rv) { print "\n"; print " ", " ", " ", " ", " ", "\n"; } foreach $m (@rv) { local $idx = $m->{'sortidx'}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } if (@rv) { print "
 $mailbox::text{'mail_from'}$mailbox::text{'mail_date'}$mailbox::text{'mail_size'}$text{'mail_level'}$mailbox::text{'mail_subject'}
", &mailbox::simplify_from($m->{'header'}->{$showto?'to':'from'}),"",&mailbox::simplify_date($m->{'header'}->{'date'}),"",int($m->{'size'}/1000)+1," kB","",length($m->{'header'}->{'x-spam-level'}),"", "
",&mailbox::simplify_subject($m->{'header'}->{'subject'}), " "; if ($m->{'header'}->{'content-type'} =~ /multipart\/\S+/i) { print ""; } local $p = int($m->{'header'}->{'x-priority'}); if ($p == 1) { print " "; } elsif ($p == 2) { print " "; } print "
\n"; print "$mailbox::text{'mail_all'} \n"; print "$mailbox::text{'mail_invert'} \n"; &show_buttons(2); } else { print "$text{'search_none'}

\n"; } print "

\n"; &ui_print_footer("mail.cgi", $text{'mail_return'});