process_messages.html from AlphaMail at Krugle
Show process_messages.html syntax highlighted
% # vim: set syntax=mason:
<%args>
$folder => 'none'
@uids => ()
$uidv => 0
$start => 0
$n => 0
$sortby => 0
$action => 'none'
$action2 => 'none'
$empty => 0
$delete => 0
$purge => 0
</%args>
<& /mail/index.html, message => $msg &>
<%init>
my $logger = Log::Log4perl->get_logger('alphamail');
if($folder eq 'none' || $uidv == 0) {
$logger->error("User attempted to run process_read_message without passing a folder:" . Dumper($m));
$m->redirect(build_url('/mail/index.html', { folder => 'inbox', message => 'Unable to process the request. Please try again.' }));
}
$action = $action2 if($action eq 'none');
my $user = Apache::SiteControl->getCurrentUser($r);
if(!$user || !$user->isa('Apache::SiteControl::User')) {
$logger->error("Unable to find a user for the given session key.");
$m->redirect("/");
}
my $c;
my $msg = "";
my $prefs = new AlphaMail::Preferences($user->getUsername(),
$user->getAttribute('imap'), $config);
my $trash = $prefs->get('trash_folder', 'none');
my $dir = $config->get('message_tmpdir', '/tmp');
my $destfolder;
my $date = Email::Date::format_date;
eval {
$c = new AlphaMail::Middleware($user->getAttribute('imap'),
$user->getUsername(),
$user->getAttribute('password'),
$config);
if($folder eq $trash && $empty) {
# Get all the uids
my $hdrs = $c->getMessageHeaders($trash, 1, 100000, 'date');
@uids = ();
for my $h (@$hdrs) {
push @uids, $h->{uid};
}
$c->deleteMessages($trash, $hdrs->[0]{uidvalidity}, \@uids) if(@uids);
$c->expungeFolder($trash);
$msg = "Trash folder emptied";
} elsif(@uids && $delete) {
if($folder eq $trash) { # We are in the trash folder
$c->deleteMessages($folder, $uidv, \@uids);
$c->expungeFolder($folder);
} elsif($trash eq 'none') { # Wait for purge request to expunge
$c->deleteMessages($folder, $uidv, \@uids);
} else {
eval {
$c->moveMessages($folder, $uidv, \@uids, $trash);
$c->expungeFolder($folder);
$msg = "Message(s) moved to trash folder $trash";
};
if($@) {
# Failure...probably over quota. Switch to no trash and mark
# deleted.
$logger->error('Unable to move messages to trash. User probably over quota.');
$msg = "Unable to move messages to $trash. You either deleted your trash folder from the system, or you are over quota. Your settings were changed so that no trash folder is in use. Press the 'Purge Deleted Messages' to complete the message removal. NOTE: This will permanently remove the deleted messages. Use Settings to select a Trash folder if you want one.";
$prefs->set('trash_folder', 'none');
$c->deleteMessages($folder, $uidv, \@uids);
}
}
} elsif(@uids && $action =~ m/^(un)?mark$/i) {
my $on = $action eq 'mark';
for my $uid (@uids) {
$c->setFlag($folder, $uid, $uidv, 'F', $on);
}
} elsif(@uids && $action =~ m/^unread$/i) {
for my $uid (@uids) {
$c->setFlag($folder, $uid, $uidv, 'S', 0);
}
} elsif(@uids && $action =~ m/^kill$/i) {
$c->deleteMessages($folder, $uidv, \@uids);
$c->expungeFolder($folder);
$msg = "Messages discarded.";
} elsif(@uids && $action =~ m/^undelete$/i) {
$c->undeleteMessages($folder, $uidv, \@uids);
} elsif(@uids && $action =~ m/^to:(.*)$/) {
$destfolder = $1;
if($folder eq $destfolder) {
$msg = "That message is already in $destfolder. Please select a different destination folder before clicking on Move.";
} else {
$c->moveMessages($folder, $uidv, \@uids, $destfolder);
$c->expungeFolder($folder);
$msg = "Message(s) moved to $destfolder";
}
} elsif($purge) {
$c->expungeFolder($folder);
} elsif(($action =~ m/^(move|undelete)$/ || $delete) && !@uids) {
$msg = "Please select messages first.";
} elsif($action eq 'report' && @uids) {
eval {
my $rv;
my $reply_address = $user->getUsername() . "@" . $user->getAttribute('mx');
my $spam_address = $config->get('spam_address', '');
$msg = "System error: Spam reporting not configured!";
$logger->logcroak('Spam address not set for reporting') if($spam_address !~ m/\@/);
my $parser = new MIME::Parser;
$parser->output_dir($dir);
$parser->decode_headers(0);
$parser->ignore_errors(1);
for my $uid (@uids) {
my $entity = MIME::Entity->build(
Type =>"multipart/mixed",
'X-Mailer' => "AlphaMail $AlphaMail::VERSION",
From => $reply_address,
To => $spam_address,
Date => $date,
Subject => "Forwarded SPAM (webmail report)");
### Part #1: a simple text document:
$entity->attach(Data=>"The attached message was forwarded from the webmail Report Spam button.",
Type => 'text/plain',
Charset => "us-ascii");
my $message = $c->getMessage($folder, $uid, $uidv);
my $msg_entity = $parser->parse_open("<$message");
$entity->add_part($msg_entity);
$rv = send_mail($config, $reply_address, $entity);
die "Send failed" if(!@$rv);
# Delete it
if($folder eq $trash || $trash eq 'none') {
eval {
$c->deleteMessages($folder, $uidv, [ $uid ]);
};
}
}
if($folder eq $trash) {
eval {
$c->expungeFolder($folder);
};
} elsif($trash ne 'none') { # Wait for purge request to expunge
eval {
$c->moveMessages($folder, $uidv, \@uids, $trash);
$c->expungeFolder($folder);
};
if($@) {
$logger->error('Unable to move messages to trash. User probably over quota.');
$prefs->set('trash_folder', 'none');
eval { $c->deleteMessages($folder, $uidv, \@uids); };
}
}
};
if($@) {
$logger->error("Unable to forward spam: $@");
$msg = "Could not report spam. There was an internal error.";
} else {
$msg = "The message(s) were reported";
}
} elsif($action eq 'none') {
$msg = "";
} else {
$msg = "Invalid request. Make sure you select messages first.";
}
$c->close;
};
if($@) {
$logger->error("ERROR: $@. user, r, m: " . Dumper($user, $r, $m));
$msg = "Unable to complete the request.";
}
</%init>
<%once>
use MIME::Words;
use AlphaMail::MailTool qw(send_mail);
use AlphaMail;
use Email::Date;
use Data::Dumper;
</%once>
See more files for this project here