process_messages.html from AlphaMail at Krugle
Show process_messages.html syntax highlighted
% # vim: set syntax=mason:
<%args>
$folder => 'none'
@uids => ()
$uidv => 0
$action => 'none'
$action2 => 'none'
$empty => 0
$delete => 0
$purge => 0
$search_string => ''
</%args>
<& /mail/index.html, message => $msg, search_string => $search_string, filter => $filter &>
<%init>
my $filter = '';
if($folder eq 'none' || $uidv == 0) {
$logger->error("User attempted to run process_messages without passing a folder:" . Dumper($m));
$m->redirect(build_url("$base/mail/index.html", { folder => 'inbox', message => 'Unable to process the request. Please try again.' }));
}
$action = $action2 if($action eq 'none');
my $user = Apache2::SiteControl->getCurrentUser($r);
if(!$user || !$user->isa('Apache2::SiteControl::User')) {
$logger->error("Unable to find a user for the given session key.");
$m->redirect("$base");
}
my $c;
my $msg = "";
my $prefs = new AlphaMail::Preferences($user->getUsername(),
$user->getAttribute('mx'), $config);
my $trash = $prefs->get('trash_folder', 'none');
my $destfolder;
my $date = Email::Date::format_date;
my $lastsearch = $user->getAttribute('lastsearch') || '';
$user->setAttribute($r, 'lastsearch', $search_string) if($lastsearch ne $search_string);
if($search_string) {
my $oss = $search_string;
my @or_items = ();
my @and_items = ();
while($oss =~ m/from:([a-zA-Z0-9.@]+)(\s|$)/) {
push @or_items, qq(FROM "$1");
$oss =~ s/from:([a-zA-Z0-9.@]+)(\s|$)//;
}
while($oss =~ m/to:([a-z0-9.@]+)(\s|$)/i) {
push @or_items, qq(TO "$1");
$oss =~ s/to:([a-z0-9.@]+)(\s|$)//i;
}
while($oss =~ m/"([^"]*)"/) { # "
push @and_items, qq(TEXT "$1");
$oss =~ s/"[^"]*"//; # "
}
my @words = split /\s+/, $oss;
for my $w (@words) {
push @and_items, qq(TEXT "$w");
}
if(@or_items > 2) {
$filter .= "OR ";
for(my $i = 0; $i < @or_items; $i++) {
if($i == scalar(@or_items)-1) {
$filter .= $or_items[$i];
} else {
$filter .= qq(OR $or_items[$i] );
}
}
} elsif(@or_items == 2) {
$filter .= qq(OR $or_items[0] $or_items[1] );
} else {
$filter .= qq($or_items[0] );
}
for my $ai (@and_items) {
$filter .= qq($ai );
}
$filter =~ s/^\s*//;
$filter =~ s/\s*$//;
$logger->debug("QUERY: $filter");
}
eval {
$c = new AlphaMail::Middleware($user->getAttribute('imap'),
$user->getUsername(),
$user->getAttribute('password'),
$config);
if($folder eq $trash && $empty && $lastsearch eq $search_string) {
# Get all the uids
my $hdrs = $c->getMessageHeaders($trash, 1, 100000, 'date');
@uids = ();
for my $h (@$hdrs) {
push @uids, $h->{uid} if($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 && $search_string eq $lastsearch) {
$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($config->getScratchDir($user));
$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, $config->getScratchDir($user));
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 AlphaMail::MailTool qw(send_mail);
use Data::Dumper;
use AlphaMail::HTMLHelper qw(build_url hyperlink);
our $logger = Log::Log4perl->get_logger('alphamail');
our $base = $config->get('base_uri');
</%once>
See more files for this project here