Code Search for Developers
 
 
  

read.html from AlphaMail at Krugle


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") %>
                    &nbsp;
%    }
                 <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">&nbsp;&nbsp;&nbsp;Unflag</option> 
%    } else {
                       <option value="mark">&nbsp;&nbsp;&nbsp;Flag</option> 
%    }
                       <option value="report">&nbsp;&nbsp;&nbsp;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") %>
                    &nbsp;
%    }
                 <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">&nbsp;&nbsp;&nbsp;Unflag</option> 
%    } else {
                       <option value="mark">&nbsp;&nbsp;&nbsp;Flag</option> 
%    }
                       <option value="report">&nbsp;&nbsp;&nbsp;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 %>');">
                          &lt; 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 &gt;
                          </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/&/&amp;/g;
                  $l =~ s/\</&lt;/g;
                  $l =~ s/\>/&gt;/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

AlphaMail

AlphaMail is an accelerated web mail interface with a C++ middleware layer that is more effective than an IMAP proxy which is a highly scalable (10k+ users). The interface includes modern features, Section 508 compliance, and universal browser support.

Project homepage: http://sourceforge.net/projects/alphamail
Programming language(s): C++,Java,JavaScript,Perl
License: other

  addressbook/
    edit.mhtml
    import.mhtml
    import_complete.html
    import_csv.html
    import_csv_save.html
    import_fname.html
    import_imho.html
    import_lname.html
    index.html
    lists.mhtml
    process_edit.html
    process_lists.html
    process_take.html
    take.html
  settings/
    altfolder_update.html
    altprefix_update.html
    edit_folders.html
    folders.mhtml
    general.mhtml
    index.html
    share.mhtml
    sharing_agree.html
    signatures.mhtml
    update_folderlist.html
    update_general.html
    update_signatures.html
  viewers/
    excel.html
    html.html
    targz.html
    text.html
    word.html
    zip.html
  address_mail.html
  addresslist.html
  autohandler
  check_spelling.html
  compose.html
  error.html
  first_login.html
  fix_spelling.html
  folderlist.mhtml
  footer.mhtml
  get_attachment.html
  header.mhtml
  help.html
  index.html
  logout.html
  menu.mhtml
  other_folders.html
  process_compose.html
  process_first_login.html
  process_messages.html
  process_read_message.html
  quota.html
  quota_graph.html
  raw.html
  read.html
  remove_attachment.html
  renew_session.html
  sanitized.html
  share_options.html
  share_upload.html
  show_stats.html
  verify_password.html
  view_attachment.html