Show read.html syntax highlighted
% # vim: set syntax=mason:
<%args>
$folder => 'none'
$uid => -1
$uidv => -1
$sorted_offset => 1
$sortby => 'date'
$literal => 0
$printable => 0
$full_headers => 0
$n => 0
$msg => ''
$filter => ''
$search_string => ''
</%args>
<& /mail/header.mhtml, title => "Read: " . HTML::Entities::encode($header->{subject}), folder => $folder, message => $msg, hide_controls => $printable &>
<table class="message_display">
% if(!$printable) {
<tr>
<th>
<div class="controls">
<div class="left">
% if($user->getAttribute('credential_3') eq "pda") {
<% hyperlink("$base/mail/index.html", "< index") %>
% }
<form name="action_form" method="post"
action="<% $base %>/mail/process_read_message.html">
<input type="submit" name="replyall" value="Reply All">
<input type="submit" name="reply" value="Reply">
<input type="submit" name="forward" value="Forward">
% if($deleted) {
<input type="submit" name="undelete" value="Undelete">
% } else {
<input type="submit" name="delete" value="Delete">
% }
<select name="action" onChange="document.action_form.submit()">
<option selected value="none">More Actions ...</option>
% if($marked) {
<option value="unmark"> Unflag</option>
% } else {
<option value="mark"> Flag</option>
% }
<option value="report"> Report Spam</option>
<optgroup label="Move to:">
% for $fldr (@alt_folders, @$folderlist) {
% $displayname = $fldr;
% eval { $displayname = $tr->decode($fldr); };
% $displayname =~ s/^\Q$prefix\E//;
<option value="to:<% $fldr |h %>"><% decode('utf8', $displayname) |h %></option>
% }
</optgroup>
</select>
% if(!$user->getAttribute('javascript')) {
<input type="submit" name="nothing" value="Go">
% }
<input type="hidden" name="folder" value="<% $folder |h %>">
<input type="hidden" name="uid" value="<% $uid |h %>">
<input type="hidden" name="uidv" value="<% $uidvalidity |h %>">
<input type="hidden" name="sorted_offset" value="<% $sorted_offset |h %>">
<input type="hidden" name="n" value="<% $n |h %>">
<input type="hidden" name="sortby" value="<% $sortby |h %>">
<input type="hidden" name="fullheaders" value="<% $full_headers |h %>">
% if($sorted_offset > 1 && $headers->[2]{uid} > 0) {
<input type="hidden" name="nextuid" value="<% $headers->[2]{uid} |h %>">
% } elsif($sorted_offset == 1 && $headers->[1]{uid} > 0) {
<input type="hidden" name="nextuid" value="<% $headers->[1]{uid} |h %>">
% }
</form>
<br>
<% hyperlink("$base/mail/index.html", "Return to index", {
folder => $folder, search_string => $search_string,
filter => $filter }) %>
</div>
<span class="right">
% if($sorted_offset > 1) {
<a href="<% build_url("$base/mail/read.html",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[0]{uid},
sorted_offset => $sorted_offset-1,
sortby => $sortby, filter => $filter,
search_string => $search_string
}) |h %>"
% $tip = $headers->[0]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g;
onmouseover="return escape('<% $tip %>');">
< Previous
</a>
<% $sorted_offset %> of <% $msgcnt %>
% if($headers->[2]{uid} > 0) {
<a href="<% build_url("$base/mail/read.html",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[2]{uid},
sorted_offset => $sorted_offset+1,
sortby => $sortby, filter => $filter,
search_string => $search_string
}) |h %>"
% $tip = $headers->[2]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g;
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% }
% if($filter) {
<br>Filter: <% $search_string |h %>
% }
% } elsif($headers->[1]{uid} > 0) {
1 of <% $msgcnt %>
<a href="<% build_url("$base/mail/read.html",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[1]{uid},
sorted_offset => $sorted_offset+1,
sortby => $sortby, filter => $filter,
search_string => $search_string
}) |h %>"
% $tip = $headers->[1]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g;
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% if($filter) {
<br>Filter: <% $search_string |h %>
% }
% }
</span>
</div>
</th>
</tr>
% } # end of not printable
<tr>
<td class="messageHeader">
<div class="messageHeader">
% if(!$full_headers) {
<b>Subject:</b> <% $header->{subject} |h %>
<br><b>To:</b> <% $header->{to} |h %> <% hyperlink("$base/mail/addressbook/take.html", "Add to address book...", { folder => $folder, uid => $uid, uidv => $uidv, sorted_offset => $sorted_offset, sortby => $sortby, literal => $literal, printable => $printable, full_headers => $full_headers , n => $n, addresslist => AlphaMail::MailTool::encode_utf8addresses($header->{to}) }) %>
% if(defined($header->{cc}) && $header->{cc} ne "") {
<br><b>Cc:</b> <% $header->{cc} |h %> <% hyperlink("$base/mail/addressbook/take.html", "Add to address book...", { folder => $folder, uid => $uid, uidv => $uidv, sorted_offset => $sorted_offset, sortby => $sortby, literal => $literal, printable => $printable, full_headers => $full_headers , n => $n, addresslist => AlphaMail::MailTool::encode_utf8addresses($header->{cc}) }) %>
% }
<br><b>From:</b> <% $header->{from} |h %> <% hyperlink("$base/mail/addressbook/take.html", "Add to address book...", { folder => $folder, uid => $uid, uidv => $uidv, sorted_offset => $sorted_offset, sortby => $sortby, literal => $literal, printable => $printable, full_headers => $full_headers , n => $n, addresslist => AlphaMail::MailTool::encode_utf8addresses($header->{from}) }) %>
<br><b>Date:</b> <% $header->{date} |h %>
<br> <% hyperlink("$base/mail/read.html",
"full header",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $uid,
printable => $printable, literal => $literal,
sorted_offset => $sorted_offset, sortby => $sortby,
full_headers => 1 }) %>
% } else {
<pre>
<% $header->{full_header} |h %>
</pre>
<% hyperlink("$base/mail/read.html",
"minimal header",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $uid,
printable => $printable, literal => $literal,
sorted_offset => $sorted_offset, sortby => $sortby
}) %>
% }
| <a href="<% build_url("$base/mail/read.html",
{ sortby => $sortby, sorted_offset => $sorted_offset,
folder => $folder, uidv => $uidvalidity, uid => $uid,
n => $n, literal => $literal, printable => !$printable,
full_headers => $full_headers }) |h %>"><% $printable ? "normal":"printable" %> view</a>
| <a onmouseover="return escape('In formatted view, text is wrapped according to browser window and extra whitespace is removed. Literal view preserves the original spacing and line breaks.')" href="<% build_url("$base/mail/read.html",
{ sortby => $sortby, sorted_offset => $sorted_offset,
folder => $folder, uidv => $uidvalidity, uid => $uid,
n => $n, literal => !$literal, printable => $printable,
full_headers => $full_headers }) |h %>"><% $literal ? "formatted":"literal" %></a>
% if($prefs->get("enable_raw", 0)) {
| <a href="<% build_url("$base/mail/raw.html",
{ sortby => $sortby, sorted_offset => $sorted_offset,
folder => $folder, uidv => $uidvalidity, uid => $uid,
n => $n }) |h %>">raw MIME message</a>
% }
</div>
</td>
</tr><tr>
<td>
<div class="messageBody">
<% main_body($inline, $attachments, $literal, $prefs, $base) %>
</div>
</td>
</tr>
<tr>
<td>
% if(@$attachments) {
<div class="attachments">
% for my $a (@$attachments) {
% $filename = mimewords_to_utf8($a->{recommended_filename});
% $filename =~ s!^.*/([^/]*)$!$1!;
% my $fn = $a->{path};
% $fn =~ s/^\Q$dir\E//;
Download: <% hyperlink("$base/mail/get_attachment.html",
"$filename",
{ type => $a->{type}, subtype => $a->{subtype},
suggested_name => $a->{recommended_filename},
file => $fn }, "file") %>
<br>
<span class="type"><% $a->{type} |h %>/<% $a->{subtype} |h %></span>
<span class="size">(<% $a->{size} %> bytes)</span>
<br>
<% viewer_link($a, $prefs, $config, $user) %>
<br>
<br>
% }
</div>
% }
</td>
</tr>
<tr>
<th>
% if(!$printable) {
<div class="controls">
<div class="left">
% if($user->getAttribute('credential_3') eq "pda") {
<% hyperlink("$base/mail/index.html", "< index") %>
% }
<form name="action_form2" method="post"
action="<% $base %>/mail/process_read_message.html">
<input type="submit" name="replyall" value="Reply All">
<input type="submit" name="forward" value="Forward">
<input type="submit" name="reply" value="Reply">
% if($deleted) {
<input type="submit" name="undelete" value="Undelete">
% } else {
<input type="submit" name="delete" value="Delete">
% }
<select name="action" onChange="document.action_form2.submit()">
<option selected value="none">More Actions ...</option>
% if($marked) {
<option value="unmark"> Unflag</option>
% } else {
<option value="mark"> Flag</option>
% }
<option value="report"> Report Spam</option>
<optgroup label="Move to:">
% for $fldr (@alt_folders, @$folderlist) {
% $displayname = $fldr;
% eval { $displayname = $tr->decode($fldr); };
% $displayname =~ s/^\Q$prefix\E//;
<option value="to:<% $fldr |h %>"><% decode('utf8', $displayname) |h %></option>
% }
</optgroup>
</select>
% if(!$user->getAttribute('javascript')) {
<input type="submit" name="nothing" value="Go">
% }
<input type="hidden" name="folder" value="<% $folder |h %>">
<input type="hidden" name="uid" value="<% $uid |h %>">
<input type="hidden" name="uidv" value="<% $uidvalidity |h %>">
<input type="hidden" name="sorted_offset" value="<% $sorted_offset |h %>">
<input type="hidden" name="n" value="<% $n |h %>">
<input type="hidden" name="sortby" value="<% $sortby |h %>">
<input type="hidden" name="fullheaders" value="<% $full_headers |h %>">
% if($sorted_offset > 1 && $headers->[2]{uid} > 0) {
<input type="hidden" name="nextuid" value="<% $headers->[2]{uid} |h %>">
% } elsif($sorted_offset == 1 && $headers->[1]{uid} > 0) {
<input type="hidden" name="nextuid" value="<% $headers->[1]{uid} |h %>">
% }
</form>
</div>
<span class="right">
% if($sorted_offset > 1) {
<a href="<% build_url("$base/mail/read.html",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[0]{uid},
sorted_offset => $sorted_offset-1,
sortby => $sortby, filter => $filter,
search_string => $search_string
}) |h %>"
% $tip = $headers->[0]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g; # "
onmouseover="return escape('<% $tip %>');">
< Previous
</a>
<% $sorted_offset %> of <% $msgcnt %>
% if($headers->[2]{uid} > 0) {
<a href="<% build_url("$base/mail/read.html",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[2]{uid},
sorted_offset => $sorted_offset+1,
sortby => $sortby, filter => $filter,
search_string => $search_string
}) |h %>"
% $tip = $headers->[2]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g; # "
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% }
% if($filter) {
<br>Filter: <% $search_string |h %>
% }
% } elsif($headers->[1]{uid} > 0) {
1 of <% $msgcnt %>
<a href="<% build_url("$base/mail/read.html",
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[1]{uid},
sorted_offset => $sorted_offset+1,
sortby => $sortby, filter => $filter,
search_string => $search_string
}) |h %>"
% $tip = $headers->[1]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g; # "
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% if($filter) {
<br>Filter: <% $search_string |h %>
% }
% }
</span>
</div>
</th>
</tr>
% }
</table>
<!--
Startup time: <% sprintf("%4.2f", tv_interval( $page_st, $middleware_st)) %>
Header read time: <% sprintf("%4.2f", tv_interval( $middleware_st, $parse_st)) %>
Parsing time: <% sprintf("%4.2f", tv_interval( $parse_st, $render_st)) %>
Rendering time: <% sprintf("%4.2f", tv_interval( $render_st, [gettimeofday])) %>
Total time: <% sprintf("%4.2f", tv_interval( $page_st, [ gettimeofday ])) %>
-->
<& /mail/footer.mhtml, hide_controls => $printable &>
<%init>
$m->redirect(build_url("$base/mail/index.html", { message => "Unable to process request. Please try again."})) if($folder eq 'none' || $uid == -1 || $uidv == -1);
my $page_st = [gettimeofday];
my $middleware_st;
my $parse_st;
my $render_st;
my $user = Apache2::SiteControl->getCurrentUser($r);
my $prefs = new AlphaMail::Preferences($user->getUsername(),
$user->getAttribute('mx'), $config);
my $c;
my $tip;
my $fldr;
my $displayname;
my $error = 0;
my $message;
my $entity;
my $headers;
my $msgcnt;
my $uidvalidity;
my $filename;
my $parser = undef;
my $reply_address;
my $altfolders = $prefs->get('alt_folders', '');
my @alt_folders = split /,/, $altfolders if($altfolders);
my $folderlist = AlphaMail::SessionUtil::getFolderList($r, $user, $config);
my $tr = Unicode::IMAPUtf7->new();
my ($prefix, $separator) = $config->getFolderPrefix($user);
$prefix .= $separator;
# The cleanup scripts run every few minutes, and clean up things that are older
# than cachetime minutes. If we cache a parse, and the files get removed, then
# it will not work...so shorten the cache time slightly.
my $cachetime = ($config->get("message_tmpdir_cachetime", 10)-1) . ' min';
my $key;
my $forwardsize;
if($prefs->get('replyto') =~ m/\@/) {
$reply_address = $prefs->get('replyto');
} else {
$reply_address = $user->getUsername() . '@' . $user->getAttribute('mx');
}
if(!$n) {
my @allowed_per_page = $config->getList('allowed_per_page', 20, 35, 50);
$n = $prefs->get('messages_per_page', $allowed_per_page[0]);
}
$user->setAttribute($r, 'reading_folder', $folder);
$user->setAttribute($r, 'reading_uid', $uid);
$user->setAttribute($r, 'reading_uidv', $uidv);
$user->setAttribute($r, 'reading_offset', $sorted_offset);
$user->setAttribute($r, 'reading_sortby', $sortby);
my $dir;
my $attachments = [];
my $inline = [];
my $header = {};
my ($deleted, $replied, $forwarded, $marked);
eval {
$dir = $config->getScratchDir($user);
if(!-d $dir) {
mkdir $dir or die "Could not create temporary storage for message: $dir.";
}
$middleware_st = [gettimeofday];
$c = new AlphaMail::Middleware($user->getAttribute('imap'),
$user->getUsername(),
$user->getAttribute('password'),
$config);
$message = $c->getMessage($folder, $uid, $uidv, $config->getScratchDir($user));
$forwardsize = (stat($message))[7];
if($sorted_offset > 1) {
$headers = $c->getMessageHeaders($folder, $sorted_offset-1, 3, $sortby, $filter);
$deleted = $headers->[1]{deleted};
$replied = $headers->[1]{answered};
$forwarded = $headers->[1]{forwarded};
$marked = $headers->[1]{flagged};
} else {
$headers = $c->getMessageHeaders($folder, $sorted_offset, 2, $sortby, $filter);
$deleted = $headers->[0]{deleted};
$replied = $headers->[0]{answered};
$forwarded = $headers->[0]{forwarded};
$marked = $headers->[0]{flagged};
}
$msgcnt = $headers->[0]{count};
$uidvalidity = $headers->[0]{uidvalidity};
if($uidv != $uidvalidity) {
die("UID validity changed. Returning user to index");
}
$parse_st = [gettimeofday];
# Cache the results of a message parse, in case the page is reloaded (i.e.
# after an attachment view, etc.) so we don't reparse the thing.
$key = $user->getUsername() . "_" . $user->getAttribute('mx') . "_${folder}_${uid}_${uidv}_${sorted_offset}_${sortby}_${n}";
my $data_cache = $m->cache->get($key);
if(!defined($data_cache)) {
$parser = new MIME::Parser;
$parser->output_dir($dir);
$parser->decode_headers(0);
$parser->ignore_errors(0);
$entity = $parser->parse_open("<$message");
parse_entity($entity, "", "", $inline, $attachments, $header);
$data_cache = {
inline => $inline,
attachments => $attachments,
header => $header
};
$m->cache->set($key, $data_cache, $cachetime);
} else {
$inline = $data_cache->{inline};
$attachments = $data_cache->{attachments};
$header = $data_cache->{header};
}
$c->close;
};
if($@) {
$logger->error("Read.html failed: $@");
$error = 1;
}
$m->redirect(build_url("$base/mail/index.html", { message => "Folder changed. Please try again."})) if $error;
chomp $header->{date};
chomp $header->{subject};
chomp $header->{from};
$render_st = [gettimeofday];
</%init>
<%once>
use Encode;
use AlphaMail::HTMLHelper qw(url_encode viewer_link hyperlink build_url linkify);
use AlphaMail::MailTool qw(mimewords_to_utf8);
use AlphaMail::Message qw(main_body parse_entity);
use Time::HiRes qw( gettimeofday tv_interval );
our $logger = Log::Log4perl->get_logger('alphamail');
our $base = $config->get('base_uri');
</%once>
See more files for this project here