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 => ''
</%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('/mail/index.html', "< index") %>
% }
<form name="action_form" method="post"
action="/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 %>">
% 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('/mail/read.html',
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[0]{uid},
sorted_offset => $sorted_offset-1, sortby => $sortby
}) |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('/mail/read.html',
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[2]{uid},
sorted_offset => $sorted_offset+1, sortby => $sortby
}) |h %>"
% $tip = $headers->[2]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g;
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% }
% } elsif($headers->[1]{uid} > 0) {
1 of <% $msgcnt %>
<a href="<% build_url('/mail/read.html',
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[1]{uid},
sorted_offset => $sorted_offset+1, sortby => $sortby
}) |h %>"
% $tip = $headers->[1]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g;
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% }
</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("/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 => $header->{to} }) %>
% if(defined($header->{cc}) && $header->{cc} ne "") {
<br><b>Cc:</b> <% $header->{cc} |h %> <% hyperlink("/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 => $header->{cc} }) %>
% }
<br><b>From:</b> <% $header->{from} |h %> <% hyperlink("/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 => $header->{from} }) %>
<br><b>Date:</b> <% $header->{date} |h %>
<br> <% hyperlink('/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('/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('/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('/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('/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) %>
</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$tmpdir\E//;
Download: <% hyperlink("/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) %>
<br>
<br>
% }
</div>
% }
</td>
</tr>
<tr>
<th>
% if(!$printable) {
<div class="controls">
<div class="left">
% if($user->getAttribute('credential_3') eq "pda") {
<% hyperlink('/mail/index.html', "< index") %>
% }
<form name="action_form2" method="post"
action="/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 %>">
% 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('/mail/read.html',
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[0]{uid},
sorted_offset => $sorted_offset-1, sortby => $sortby
}) |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('/mail/read.html',
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[2]{uid},
sorted_offset => $sorted_offset+1, sortby => $sortby
}) |h %>"
% $tip = $headers->[2]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g; # "
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% }
% } elsif($headers->[1]{uid} > 0) {
1 of <% $msgcnt %>
<a href="<% build_url('/mail/read.html',
{ folder => $folder, n => $n,
uidv => $uidvalidity, uid => $headers->[1]{uid},
sorted_offset => $sorted_offset+1, sortby => $sortby
}) |h %>"
% $tip = $headers->[1]{subject}; $tip =~ s/"//g; $tip =~ s/'/\\'/g; # "
onmouseover="return escape('<% $tip %>');">
Next >
</a>
% }
</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('/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 = Apache::SiteControl->getCurrentUser($r);
my $prefs = new AlphaMail::Preferences($user->getUsername(),
$user->getAttribute('imap'), $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 = $prefs->get('folder_prefix', $config->get('folder_prefix', 'mail'));
# 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 $tmpdir = $config->get("message_tmpdir", '/tmp');
my $dir = $tmpdir . "/" . $user->getAttribute('imap') . "_" . $user->getUsername();
my $attachments = [];
my $inline = [];
my $header = {};
my ($deleted, $replied, $forwarded, $marked);
eval {
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);
$forwardsize = (stat($message))[7];
if($sorted_offset > 1) {
$headers = $c->getMessageHeaders($folder, $sorted_offset-1, 3, $sortby);
$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);
$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};
}
$user->setAttribute($r, 'replybody', plain_body($inline, $attachments));
$c->close;
};
if($@) {
$logger->error("Read.html failed: $@");
$error = 1;
}
$m->redirect(build_url('/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::Preferences;
use AlphaMail::HTMLHelper qw(url_encode viewer_link hyperlink build_url linkify);
use AlphaMail::MailTool qw(mimewords_to_utf8);
use HTML::Parser;
use Time::HiRes qw( gettimeofday tv_interval );
our $logger = Log::Log4perl->get_logger('alphamail');
our %skip = (
head => 2,
"link" => 2,
meta => 2,
title => 2,
body => 1,
object => 2,
iframe => 2,
embed => 2,
frame => 2,
html => 1,
script => 2,
);
our $imageskip = 1;
our $skipping = 0;
our %attrskip = (
target => 1,
);
our $purified_html = "";
sub init_html
{
my $prefs = shift;
$purified_html = "";
$skipping = 0;
$imageskip = $prefs->get('skip_images', 0);
}
sub start
{
my $tag = lc(shift);
my $attr = shift;
if($skip{$tag}) {
if($skip{$tag} == 2) {
$skipping++;
}
return;
}
if($tag eq 'a') {
if($attr->{href} =~ m/\d+\.\d+\.\d+\.\d+/) { # delete spammer links
$attr->{href} = "/mail/sanitized.html";
$purified_html .= qq(<div class="warning">WARNING: The mail system has determined that the following link is a fake. It is attempting to take you somewhere other than the location indicated. This message is almost certainly spam. The link has been sanitized.</div>);
}
}
$purified_html .= "<$tag ";
if($tag eq 'a') {
$purified_html .= qq(target="_blank" );
}
for my $a (sort keys %$attr) {
next if $a =~ m/^on/i;
next if $attrskip{lc($a)};
if($imageskip && lc($tag) eq 'img' && lc($a) eq 'src') {
$purified_html .= qq(src="broken.gif" );
} else {
$purified_html .= qq($a="$attr->{$a}" );
}
}
$purified_html .= ">";
}
sub end
{
my $tag = lc(shift);
if($skip{$tag}) {
if($skip{$tag} == 2) {
$skipping--;
}
return;
}
$purified_html .= "</$tag>";
}
sub text
{
my $t = shift;
$purified_html .= $t if !$skipping;
}
sub save_part
{
my $entity = shift;
my $charset = shift;
my $inline_parts = shift;
my $attachments = shift;
my $result = {};
$result->{charset} = $charset;
$result->{disposition} = $entity->head->mime_attr('content-disposition');
$result->{recommended_filename} = $entity->head->recommended_filename || "unknown";
($result->{type}, $result->{subtype}) = split('/', $entity->head->mime_type);
$result->{body} = $entity->bodyhandle;
my ($path, $size) = (0,0);
if($result->{body}) {
$path = $result->{body}->path;
$size = ($path ? (-s $path) : '???');
}
$result->{path} = $path;
$result->{size} = $size;
if($result->{type} eq 'text' && $result->{subtype} =~ m/^(plain|html)$/ &&
$result->{recommended_filename} eq "unknown")
{
push @$inline_parts, $result;
if($result->{subtype} eq 'html') {
$result->{recommended_filename} = 'Original_HTML_message.html';
push @$attachments, $result;
}
} else {
$logger->debug("Found $result->{type}/$result->{subtype} part with disposition $result->{disposition}. Saving as attachment.");
push @$attachments, $result;
}
}
sub parse_entity {
my $entity = shift;
my $name = shift;
my $charset = shift;
my $inline_parts = shift;
my $attachments = shift;
my $header = shift;
my $alternates = shift;
defined($name) or $name = "'anonymous'";
$charset = lc($entity->head->mime_attr('content-type.charset')) || 'us-ascii';
if($header && $entity->head->get('Subject')) {
$header->{subject} = mimewords_to_utf8($entity->head->get('Subject'));
$header->{date} = mimewords_to_utf8($entity->head->get('Date'));
$header->{from} = mimewords_to_utf8($entity->head->get('From'));
$header->{to} = mimewords_to_utf8($entity->head->get('To'));
$header->{cc} = mimewords_to_utf8($entity->head->get('Cc'));
$header->{full_header} = mimewords_to_utf8($entity->head->as_string);
$header->{to} =~ s/[\r\n]//g;
$header->{cc} =~ s/[\r\n]//g;
$header->{to} =~ s!\s{2,}! !g;
$header->{cc} =~ s!\s{2,}! !g;
}
my $has_alternatives = $entity->head->mime_type =~ m!multipart/alternative!i;
my @parts = $entity->parts;
if (@parts) {
my $i;
if($has_alternatives) {
my $curtype;
my $keeper;
$logger->debug("Choosing alternatives");
foreach $i (0 .. $#parts) {
my $e = $parts[$i];
# Prefer the HTML part, or text if no html
if($e->head->mime_type eq 'text/html') {
$logger->debug("Found an html part...keeping it");
$keeper = $e;
last;
} elsif($e->head->mime_type eq 'text/plain') {
$logger->debug("Found a plain part...looking for more");
$keeper = $e;
}
}
if(!defined($keeper)) {
$logger->debug("No good alternatives..adding the last one.");
save_part($parts[$#parts], $charset, $inline_parts, $attachments);
} else {
$logger->debug("Saving the last keeper I found.");
save_part($keeper, $charset, $inline_parts, $attachments);
}
} else {
foreach $i (0 .. $#parts) {
$logger->debug("Walking part $i");
parse_entity($parts[$i], "", $charset, $inline_parts, $attachments, undef, $has_alternatives);
}
}
} else {
$logger->debug("Saving the entity");
save_part($entity, $charset, $inline_parts, $attachments);
}
}
sub main_body
{
my $inline_parts = shift;
my $attachments = shift;
my $literal = shift;
my $prefs = shift;
my $linkify = $prefs->get('linkify', 0);
my $result = '';
my $show_separator = 0;
my $IO;
my $p = new HTML::Parser(api_version => 3,
start_h => [ \&start, "tagname, attr" ],
end_h => [ \&end, "tagname" ],
text_h => [ \&text, "text" ]
);
return '' if((!defined($inline_parts) || !@$inline_parts) && (!defined($attachments) || !@$attachments));
for my $part (@$inline_parts) {
if($part->{subtype} eq 'html') {
$logger->debug("Puifying HTML for display");
$result .= qq(<div class="warning">NOTE: The following HTML was modified from the original for security. Use the attachment link at the bottom to view the original.</div><div class="htmlbody">);
init_html($prefs);
$p->parse_file($part->{path});
$result .= $purified_html . qq(</div>);
} else {
$result .= qq(<div class="textbody">);
$result .= "<pre>\n" if($literal);
my $body = $part->{body};
if ($IO = $body->open("r")) {
while (defined($_ = $IO->getline)) {
my $l;
chomp;
eval {
$l = $_;
$l = HTML::Entities::encode(decode($part->{charset}, $l));
if(!$literal) {
$l =~ s/$/<br>/;
}
$l = linkify($l) if($linkify);
$result .= $l;
};
if($@) {
$logger->error("Unable to escape entities");
$l = $_;
$l =~ s/&/&/g;
$l =~ s/\</</g;
$l =~ s/\>/>/g;
if(!$literal) {
$l =~ s/^\s*$/<br><br>/;
$l =~ s/$/<br>/;
}
$l = linkify($l) if($linkify);
$result .= $l;
}
}
}
$IO->close;
$result .= "</pre>\n" if($literal);
$result .= qq(</div>);
}
}
return $result;
}
sub plain_body
{
my $inline_parts = shift;
my $attachments = shift;
my $result = '';
my $show_separator = 0;
my $IO;
my $elinks = $config->get('elinks', "/usr/bin/elinks");
my $sandbox_dir = $config->get('sandbox');
my $sandbox = $config->get('sandbox_util');
return '' if((!defined($inline_parts) || !@$inline_parts) && (!defined($attachments) || !@$attachments));
$show_separator = 1 if($#$inline_parts > 0);
for my $part (@$inline_parts) {
if($part->{subtype} eq 'html') {
my $name = $part->{path};
$name =~ s!^.*/([^/]*)$!$1!;
unlink "$sandbox_dir/tmp/$name";
link $part->{path}, "$sandbox_dir/tmp/$name" or $logger->error("Could not create link from $part->{path} to $sandbox_dir/tmp");
$result .= "NOTE: The following part of this message was originally in HTML.\n\n";
my @lines = qx($sandbox $elinks -no-home 1 -dump '/tmp/$name');
unlink "$sandbox_dir/tmp/$name";
for my $l (@lines) {
$result .= $l;
}
} else {
my $body = $part->{body};
if ($IO = $body->open("r")) {
while (defined($_ = $IO->getline)) {
eval {
$result .= decode($part->{charset}, $_);
};
if($@) {
$result .= $_;
}
}
}
$IO->close;
}
if($show_separator) {
$result .= "\n\n" . "-" x 72 . "\n";
$show_separator++;
}
}
return $result;
}
</%once>
See more files for this project here