3 # Delete, mark, move or copy multiple messages
5 require './mailboxes-lib.pl';
7 &can_user($in{'user'}) || &error($text{'mail_ecannot'});
8 @delete = sort { $a <=> $b } split(/\0/, $in{'d'});
9 @folders = &list_user_folders($in{'user'});
10 $folder = $folders[$in{'folder'}];
12 if ($in{'mark1'} || $in{'mark2'}) {
13 # Marking emails with some status
14 @delete || &error($text{'delete_emnone'});
15 @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
16 dbmopen(%read, "$module_config_directory/$in{'user'}.read", 0600);
17 local $m = $in{'mark1'} ? $in{'mode1'} : $in{'mode2'};
18 foreach $d (@delete) {
19 local $hid = $mail[$d]->{'header'}->{'message-id'};
28 $perpage = $folder->{'perpage'} || $config{'perpage'};
29 &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
31 elsif ($in{'move1'} || $in{'move2'}) {
32 # Moving mails to some other user's inbox
33 &check_modification($folder);
34 @delete || &error($text{'delete_emovenone'});
35 $muser = $in{'move1'} ? $in{'mfolder1'} : $in{'mfolder2'};
36 &can_user($muser) || &error($text{'delete_emovecannot'});
37 @mfolders = &list_user_folders($muser);
38 @mfolders || &error($text{'delete_emoveuser'});
40 @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
41 foreach $d (@delete) {
42 $mail[$d] || &error($text{'mail_eexists'});
43 push(@movemail, $mail[$d]);
45 &lock_folder($folder);
46 &lock_folder($mfolder);
47 &mailbox_move_mail($folder, $mfolders[0], @movemail);
48 &unlock_folder($mfolder);
49 &unlock_folder($folder);
50 &webmin_log("movemail", undef, undef, { 'from' => $folder->{'file'},
51 'to' => $mfolders[0]->{'file'},
52 'count' => scalar(@delete) } );
53 &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
55 elsif ($in{'copy1'} || $in{'copy2'}) {
56 # Copying mails to some other folder
57 @delete || &error($text{'delete_ecopynone'});
58 $cuser = $in{'copy1'} ? $in{'mfolder1'} : $in{'mfolder2'};
59 &can_user($cuser) || &error($text{'delete_ecopycannot'});
60 @cfolders = &list_user_folders($cuser);
61 @cfolders || &error($text{'delete_ecopyuser'});
63 @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
64 foreach $d (@delete) {
65 $mail[$d] || &error($text{'mail_eexists'});
66 push(@copymail, $mail[$d]);
68 &lock_folder($cfolder);
69 &mailbox_copy_mail($folder, $cfolders[0], @copymail);
70 &unlock_folder($cfolder);
71 &webmin_log("copymail", undef, undef, { 'from' => $folder->{'file'},
72 'to' => $cfolders[0]->{'file'},
73 'count' => scalar(@delete) } );
74 &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
76 elsif ($in{'forward'}) {
77 # Forwarding selected mails .. redirect
78 @delete || &error($text{'delete_efnone'});
79 &redirect("reply_mail.cgi?folder=$in{'folder'}&user=$in{'user'}&".
80 join("&", map { "mailforward=$_" } @delete));
83 # Need to redirect to compose form
84 &redirect("reply_mail.cgi?new=1&folder=$in{'folder'}&user=$in{'user'}");
86 elsif ($in{'black'} || $in{'white'}) {
87 # Deny or allow all senders
88 $dir = $in{'black'} ? "blacklist_from" : "whitelist_from";
89 @delete || &error($text{'delete_ebnone'});
90 @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
91 foreach $d (@delete) {
92 push(@addrs, map { $_->[0] } &split_addresses($mail[$d]->{'header'}->{'from'}));
94 &foreign_require("spam", "spam-lib.pl");
95 local $conf = &spam::get_config();
96 local @from = map { @{$_->{'words'}} }
97 &spam::find($dir, $conf);
98 local %already = map { $_, 1 } @from;
99 @newaddrs = grep { !$already{$_} } &unique(@addrs);
100 push(@from, @newaddrs);
101 &spam::save_directives($conf, $dir, \@from, 1);
103 &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");
105 elsif ($in{'razor'} || $in{'ham'}) {
106 # Report as ham or spam all messages, and show output to the user
107 @delete || &error($in{'razor'} ? $text{'delete_ebnone'}
108 : $text{'delete_ehnone'});
110 &ui_print_header(undef, $in{'razor'} ? $text{'razor_title'}
111 : $text{'razor_title2'}, "");
113 print "<b>$text{'razor_report2'}</b>\n";
116 print "<b>$text{'razor_report3'}</b>\n";
120 # Write all messages to a temp file
121 @mail = &mailbox_list_mails($delete[0], $delete[@delete-1], $folder);
122 $temp = &transname();
123 $cmd = $in{'razor'} ? &spam_report_cmd() : &ham_report_cmd();
124 foreach $d (@delete) {
125 $mail[$d] || &error($text{'mail_eexists'});
126 &send_mail($mail[$d], $temp);
127 push(@delmail, $mail[$d]);
130 # Call reporting command on them
131 &open_execute_command(OUT, "$cmd <$temp 2>&1", 1);
134 print &html_escape($_);
135 $error++ if (/failed/i);
141 print "<b>$text{'razor_err'}</b><p>\n";
144 if ($config{'spam_del'} && $in{'razor'}) {
146 &lock_folder($folder);
147 &mailbox_delete_mail($folder, @delmail);
148 &unlock_folder($folder);
149 print "<b>$text{'razor_deleted'}</b><p>\n";
152 print "<b>$text{'razor_done'}</b><p>\n";
155 print "window.location = 'list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}';\n";
158 &ui_print_footer("list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'}, "", $text{'index_return'});
160 elsif ($in{'delete'} || $in{'deleteall'}) {
161 # Just deleting emails
162 &check_modification($folder);
163 @delete || $in{'deleteall'} || &error($text{'delete_enone'});
164 if (!$in{'confirm'} && &need_delete_warn($folder)) {
165 # Need to ask for confirmation before deleting
166 &ui_print_header(undef, $text{'confirm_title'}, "");
168 print &ui_confirmation_form("delete_mail.cgi",
169 ($in{'deleteall'} ? &text('confirm_warnall') :
170 &text('confirm_warn', scalar(@delete)))."<br>".
171 ($config{'delete_warn'} ne 'y' ?
172 $text{'confirm_warn2'} :
173 $text{'confirm_warn4'}),
174 [ &inputs_to_hiddens(\%in) ],
175 [ [ 'confirm', $text{'confirm_ok'} ] ],
178 &ui_print_footer("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'});
181 # Go ahead and delete
182 &lock_folder($folder);
183 if ($in{'deleteall'}) {
184 # Clear the whole folder
185 $delcount = &mailbox_folder_size($folder);
186 &mailbox_empty_folder($folder);
189 # Just delete selected messages
190 @mail = &mailbox_list_mails($delete[0],
193 foreach $d (@delete) {
194 $mail[$d] || &error($text{'mail_eexists'});
195 push(@delmail, $mail[$d]);
197 &mailbox_delete_mail($folder, @delmail);
198 $delcount = scalar(@delmail);
200 &unlock_folder($folder);
201 &webmin_log("delmail", undef, undef,
202 { 'from' => $folder->{'file'},
203 'all' => $in{'deleteall'},
204 'count' => $delcount } );
205 &redirect("list_mail.cgi?start=$in{'start'}&folder=$in{'folder'}&user=$in{'user'}");