3 # Find mail messages matching some pattern
5 require './mailboxes-lib.pl';
7 &can_user($in{'user'}) || &error($text{'mail_ecannot'});
8 @folders = &list_user_folders($in{'user'});
9 $uuser = &urlize($in{'user'});
12 # Make sure a search was entered
13 $in{'search'} || &error($text{'search_ematch'});
14 $ofolder = $folders[$in{'folder'}];
17 # Validate search fields
18 for($i=0; defined($in{"field_$i"}); $i++) {
19 if ($in{"field_$i"}) {
20 $in{"what_$i"} || &error(&text('search_ewhat', $i+1));
21 $neg = $in{"neg_$i"} ? "!" : "";
22 push(@fields, [ $neg.$in{"field_$i"}, $in{"what_$i"} ]);
25 @fields || &error($text{'search_enone'});
26 $ofolder = $folders[$in{'ofolder'}];
29 if ($in{'folder'} == -2) {
30 $desc = $text{'search_local'};
32 elsif ($in{'folder'} == -1) {
33 $desc = $text{'search_all'};
36 $folder = $folders[$in{'folder'}];
37 $desc = &text('mail_for', $folder->{'name'});
39 &ui_print_header($desc, $text{'search_title'}, "", undef, 0, 0, undef,
40 &folder_link($in{'user'}, $ofolder));
43 if ($in{'search'} =~ /^(\S+):\s*(.*)$/) {
44 # A specific field was entered
45 local ($field, $what) = ($1, $2);
46 @searchlist = ( [ $field, $what ] );
47 @rv = &mailbox_search_mail(\@searchlist, 0, $folder);
48 print "<p><b>",&text('search_results5', scalar(@rv),
49 "<tt>$field</tt>", "<tt>$what</tt>")," ..</b><p>\n";
52 # Just search by Subject and From in one folder
53 ($mode, $words) = &parse_boolean($in{'search'});
55 # Can just do a single 'or' search
56 @searchlist = map { ( [ 'subject', $_ ],
57 [ 'from', $_ ] ) } @$words;
58 @rv = &mailbox_search_mail(\@searchlist, 0, $folder);
61 # Need to do two 'and' searches and combine
62 @searchlist1 = map { ( [ 'subject', $_ ] ) } @$words;
63 @rv1 = &mailbox_search_mail(\@searchlist1, 1, $folder);
64 @searchlist2 = map { ( [ 'from', $_ ] ) } @$words;
65 @rv2 = &mailbox_search_mail(\@searchlist2, 1, $folder);
67 %gotidx = map { $_->{'idx'}, 1 } @rv;
68 foreach $mail (@rv2) {
69 push(@rv, $mail) if (!$gotidx{$mail->{'idx'}});
73 &error($text{'search_eboolean'});
75 print "<p><b>",&text('search_results2', scalar(@rv),
76 "<tt>$in{'search'}</tt>")," ..</b><p>\n";
79 $mail->{'folder'} = $folder;
83 # Complex search, perhaps over multiple folders!
84 if ($in{'folder'} == -2) {
85 @sfolders = grep { !$_->{'remote'} } @folders;
88 elsif ($in{'folder'} == -1) {
93 @sfolders = ( $folder );
95 foreach $sf (@sfolders) {
96 local @frv = &mailbox_search_mail(\@fields, $in{'and'}, $sf);
97 foreach $mail (@frv) {
98 $mail->{'folder'} = $sf;
102 print "<p><b>",&text('search_results4', scalar(@rv))," ..</b><p>\n";
106 # Show list of messages, with form
108 print &ui_form_start("delete_mail.cgi", "post");
109 print &ui_hidden("user", $in{'user'});
110 print &ui_hidden("folder", $in{'folder'});
111 if ($config{'top_buttons'} && !$multi_folder) {
112 &show_buttons(1, \@folders, $folder, \@rv, $in{'user'}, 1);
114 &show_mail_table(\@rv, $multi_folder ? undef : $ofolder, 0);
115 if (!$multi_folder) {
116 &show_buttons(2, \@folders, $folder, \@rv, $in{'user'}, 1);
118 print &ui_form_end();
121 print "<b>$text{'search_none'}</b> <p>\n";
124 &ui_print_footer($in{'simple'} ? ( ) : ( "search_form.cgi?folder=$in{'folder'}",
125 $text{'sform_return'} ),
126 "list_mail.cgi?user=$in{'user'}&folder=$in{'folder'}", $text{'mail_return'},
127 "", $text{'index_return'});