#!/usr/local/bin/perl
# Display a form for replying to or composing an email
require './mailboxes-lib.pl';
&ReadParse();
&can_user($in{'user'}) || &error($text{'mail_ecannot'});
@uinfo = &get_mail_user($in{'user'});
@uinfo || &error($text{'view_eugone'});
@folders = &list_user_folders($in{'user'});
$folder = $folders[$in{'folder'}];
if ($in{'new'}) {
# Composing a new email
$html_edit = 1 if ($config{'html_edit'} == 2);
$sig = &get_signature($in{'user'});
if ($html_edit) {
$sig =~ s/\n/
\n/g;
$quote = "
| $text{'view_headers'} | ||||||||||
|
\n"; # Just display the mail body for printing if ($body eq $textbody) { print "
";
foreach $l (&wrap_lines($body->{'data'},
$config{'wrap_width'})) {
print &eucconv_and_escape($l),"\n";
}
print " |
| \n"; print &safe_html($body->{'data'}); print " |
",&text('detach_ok', "$paths[$i]", $sz),"
\n"; } &mail_page_footer("view_mail.cgi?idx=$in{'idx'}&folder=$in{'folder'}&user=$in{'user'}", $text{'view_return'}, "list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'}, "", $text{'index_return'}); exit; } elsif ($in{'black'}) { # Add sender to global SpamAssassin blacklist, and tell user &mail_page_header($text{'black_title'}); &foreign_require("spam", "spam-lib.pl"); local $conf = &spam::get_config(); local @from = map { @{$_->{'words'}} } &spam::find("blacklist_from", $conf); local %already = map { $_, 1 } @from; local ($spamfrom) = &address_parts($mail->{'header'}->{'from'}); if ($already{$spamfrom}) { print "",&text('black_already', "$spamfrom"),"
\n"; } else { push(@from, $spamfrom); &spam::save_directives($conf, 'blacklist_from', \@from, 1); &flush_file_lines(); print "",&text('black_done', "$spamfrom"),"
\n"; } &mail_page_footer("list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'}, "", $text{'index_return'}); exit; } elsif ($in{'razor'}) { # Report message to Razor and tell user &mail_page_header($text{'razor_title'}); print "$text{'razor_report'}\n"; print "
";
local $cmd = &spam_report_cmd($in{'user'});
local $temp = &transname();
&send_mail($mail, $temp, 0, 1);
&open_execute_command(OUT, "$cmd <$temp 2>&1", 1);
local $error;
while() {
print &html_escape($_);
$error++ if (/failed/i);
}
close(OUT);
unlink($temp);
print " \n";
if ($? || $error) {
print "$text{'razor_err'}\n"; } else { if ($config{'spam_del'}) { # Delete message too &lock_folder($folder); &mailbox_delete_mail($folder, $mail); &unlock_folder($folder); print "$text{'razor_deleted'}
\n"; } else { print "$text{'razor_done'}
\n"; } } &mail_page_footer("list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'}, "", $text{'index_return'}); exit; } if (!@mailforward) { &parse_mail($mail); @attach = @{$mail->{'attach'}}; } if ($in{'strip'}) { # Remove all non-body attachments local $newmail = { 'headers' => $mail->{'headers'}, 'header' => $mail->{'header'}, 'fromline' => $mail->{'fromline'} }; foreach $a (@attach) { if ($a->{'type'} eq 'text/plain' || $a->{'type'} eq 'text') { $newmail->{'attach'} = [ $a ]; last; } } &lock_folder($folder); &mailbox_modify_mail($mail, $newmail, $folder); &unlock_folder($folder); &redirect("list_mail.cgi?user=$in{'user'}&folder=$in{'folder'}"); exit; } if ($in{'enew'}) { # Editing an existing message, so keep same fields $to = $mail->{'header'}->{'to'}; $rto = $mail->{'header'}->{'reply-to'}; $from = $mail->{'header'}->{'from'}; $cc = $mail->{'header'}->{'cc'}; $ouser = $1 if ($from =~ /^(\S+)\@/); } else { if (!$in{'forward'} && !@mailforward) { # Replying to a message, so set To: field $to = $mail->{'header'}->{'reply-to'}; $to = $mail->{'header'}->{'from'} if (!$to); } if ($in{'rall'}) { # If replying to all, add any addresses in the original # To: or Cc: to our new Cc: address. # XXX should strip own addresses $cc = $mail->{'header'}->{'to'}; $cc .= ", ".$mail->{'header'}->{'cc'} if ($mail->{'header'}->{'cc'}); } } # Work out new subject, depending on whether we are replying # our forwarding a message (or neither) local $qu = !$in{'enew'} && (!$in{'forward'} || !$config{'fwd_mode'}); $subject = &html_escape(&decode_mimewords( $mail->{'header'}->{'subject'})); $subject = "Re: ".$subject if ($subject !~ /^Re/i && !$in{'forward'} && !@mailforward && !$in{'enew'}); $subject = "Fwd: ".$subject if ($subject !~ /^Fwd/i && ($in{'forward'} || @mailforward)); # Construct the initial mail text $sig = &get_signature($in{'user'}); ($quote, $html_edit, $body) = "ed_message($mail, $qu, $sig); if ($in{'forward'} || $in{'enew'}) { @attach = grep { $_ ne $body } @attach; } else { undef(@attach); } # Show header &mail_page_header( $in{'forward'} || @mailforward ? $text{'forward_title'} : $in{'enew'} ? $text{'enew_title'} : $text{'reply_title'}, undef, $html_edit ? "onload='initEditor()'" : "", &folder_link($in{'user'}, $folder)); } print "
\n"; &mail_page_footer("list_mail.cgi?folder=$in{'folder'}&user=$in{'user'}", $text{'mail_return'}, "", $text{'index_return'}); sub decode_and_sub { return if (!$mail); &parse_mail($mail); @sub = split(/\0/, $in{'sub'}); $subs = join("", map { "&sub=$_" } @sub); foreach $s (@sub) { # We are looking at a mail within a mail .. local $amail = &extract_mail( $mail->{'attach'}->[$s]->{'data'}); &parse_mail($amail); $mail = $amail; } }