Source for file read_body.php

Documentation is available at read_body.php

  1. <?php
  2.  
  3. /**
  4.  * read_body.php
  5.  *
  6.  * This file is used for reading the msgs array and displaying
  7.  * the resulting emails in the right frame.
  8.  *
  9.  * @copyright 1999-2014 The SquirrelMail Project Team
  10.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  11.  * @version $Id: read_body.php 14450 2014-03-17 22:53:14Z pdontthink $
  12.  * @package squirrelmail
  13.  */
  14.  
  15. /** This is the read_body page */
  16. define('PAGE_NAME''read_body');
  17.  
  18. /**
  19.  * Path for SquirrelMail required files.
  20.  * @ignore
  21.  */
  22. define('SM_PATH','../');
  23.  
  24. /* SquirrelMail required files. */
  25. require_once(SM_PATH 'include/validate.php');
  26. require_once(SM_PATH 'functions/imap.php');
  27. require_once(SM_PATH 'functions/mime.php');
  28. require_once(SM_PATH 'functions/date.php');
  29. require_once(SM_PATH 'functions/url_parser.php');
  30. require_once(SM_PATH 'functions/html.php');
  31.  
  32. /**
  33.  * Given an IMAP message id number, this will look it up in the cached
  34.  * and sorted msgs array and return the index. Used for finding the next
  35.  * and previous messages.
  36.  *
  37.  * @return the index of the next valid message from the array
  38.  */
  39. function findNextMessage($passed_id{
  40.     global $msort$msgs$sort,
  41.            $thread_sort_messages$allow_server_sort,
  42.            $server_sort_array;
  43.     if (!is_array($server_sort_array)) {
  44.         $thread_sort_messages 0;
  45.         $allow_server_sort FALSE;
  46.     }
  47.     $result = -1;
  48.     if ($thread_sort_messages || $allow_server_sort{
  49.         $count count($server_sort_array1;
  50.         foreach($server_sort_array as $key=>$value{
  51.             if ($passed_id == $value{
  52.                 if ($key == $count{
  53.                     break;
  54.                 }
  55.                 $result $server_sort_array[$key 1];
  56.                 break;
  57.             }
  58.         }
  59.     else {
  60.         if (is_array($msort)) {
  61.             for (reset($msort)($key key($msort))(isset($key))next($msort)) {
  62.                 if ($passed_id == $msgs[$key]['ID']{
  63.                     next($msort);
  64.                     $key key($msort);
  65.                     if (isset($key)){
  66.                         $result $msgs[$key]['ID'];
  67.                         break;
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.     }
  73.     return $result;
  74. }
  75.  
  76. /** returns the index of the previous message from the array. */
  77. function findPreviousMessage($numMessages$passed_id{
  78.     global $msort$sort$msgs,
  79.            $thread_sort_messages,
  80.            $allow_server_sort$server_sort_array;
  81.     $result = -1;
  82.     if (!is_array($server_sort_array)) {
  83.         $thread_sort_messages 0;
  84.         $allow_server_sort FALSE;
  85.     }
  86.     if ($thread_sort_messages || $allow_server_sort {
  87.         foreach($server_sort_array as $key=>$value{
  88.             if ($passed_id == $value{
  89.                 if ($key == 0{
  90.                     break;
  91.                 }
  92.                 $result $server_sort_array[$key 1];
  93.                 break;
  94.             }
  95.         }
  96.     else {
  97.         if (is_array($msort)) {
  98.             for (reset($msort)($key key($msort))(isset($key))next($msort)) {
  99.                 if ($passed_id == $msgs[$key]['ID']{
  100.                     prev($msort);
  101.                     $key key($msort);
  102.                     if (isset($key)) {
  103.                         $result $msgs[$key]['ID'];
  104.                         break;
  105.                     }
  106.                 }
  107.             }
  108.         }
  109.     }
  110.     return $result;
  111. }
  112.  
  113. /**
  114.  * Displays a link to a page where the message is displayed more
  115.  * "printer friendly".
  116.  */
  117. function printer_friendly_link($mailbox$passed_id$passed_ent_id$color{
  118.     global $javascript_on;
  119.  
  120.     /* hackydiehack */
  121.  
  122.     // Pull "view_unsafe_images" from the URL to find out if the unsafe images
  123.     // should be displayed. The default is not to display unsafe images.
  124.     if!sqgetGlobalVar('view_unsafe_images'$view_unsafe_imagesSQ_GET) ) {
  125.         // If "view_unsafe_images" isn't part of the URL, default to not
  126.         // displaying unsafe images.
  127.         $view_unsafe_images false;
  128.     else {
  129.         //  If "view_unsafe_images" is part of the URL, display unsafe images
  130.         //  regardless of the value of the URL variable.
  131.         // FIXME: Do we really want to display the unsafe images regardless of the value in URL variable?
  132.         $view_unsafe_images true;
  133.     }
  134.  
  135.     $params '?passed_ent_id=' urlencode($passed_ent_id.
  136.               '&mailbox=' urlencode($mailbox.
  137.               '&passed_id=' urlencode($passed_id).
  138.               '&view_unsafe_images='. (bool) $view_unsafe_images;
  139.  
  140.     $print_text _("View Printable Version");
  141.  
  142.     $result '';
  143.     /* Output the link. */
  144.     if ($javascript_on{
  145.         $result '<script language="javascript" type="text/javascript">' "\n" .
  146.                   '<!--' "\n" .
  147.                   "  function printFormat() {\n" .
  148.                   '    window.open("../src/printer_friendly_main.php' .
  149.                   $params '","Print","width=800,height=600");' "\n".
  150.                   "  }\n" .
  151.                   "// -->\n" .
  152.                   "</script>\n" .
  153.                   "<a href=\"javascript:printFormat();\">$print_text</a>\n";
  154.     else {
  155.         $result '<a target="_blank" href="../src/printer_friendly_bottom.php' .
  156.                   "$params\">$print_text</a>\n";
  157.     }
  158.     return $result;
  159. }
  160.  
  161. function ServerMDNSupport($read{
  162.     /* escaping $ doesn't work -> \x36 */
  163.     $ret preg_match('/(\x36MDNSent|\\\\\*)/i'$read);
  164.     return $ret;
  165. }
  166.  
  167. function SendMDN $mailbox$passed_id$sender$message$imapConnection{
  168.     global $username$attachment_dir$color$default_move_to_sent,
  169.            $version$attachments$squirrelmail_language$default_charset,
  170.            $languages$useSendmail$domain$sent_folder,
  171.            $popuser$data_dir;
  172.  
  173.     sqgetGlobalVar('SERVER_NAME'$SERVER_NAMESQ_SERVER);
  174.  
  175.     $header $message->rfc822_header;
  176.     $hashed_attachment_dir getHashedDir($username$attachment_dir);
  177.  
  178.     $rfc822_header new Rfc822Header();
  179.     $content_type  new ContentType('multipart/report');
  180.     $content_type->properties['report-type']='disposition-notification';
  181.  
  182.     set_my_charset();
  183.     if ($default_charset{
  184.         $content_type->properties['charset']=$default_charset;
  185.     }
  186.     $rfc822_header->content_type $content_type;
  187.     $rfc822_header->to[$header->dnt;
  188.     $rfc822_header->subject _("Read:"' ' decodeHeader($header->subjecttruefalse);
  189.  
  190.     // FIXME: use identity.php from SM 1.5. Change this also in compose.php
  191.  
  192.     $reply_to '';
  193.     if (isset($identity&& $identity != 'default'{
  194.         $from_mail getPref($data_dir$username,
  195.                              'email_address' $identity);
  196.         $full_name getPref($data_dir$username,
  197.                              'full_name' $identity);
  198.         $from_addr '"'.$full_name.'" <'.$from_mail.'>';
  199.         $reply_to  getPref($data_dir$username,
  200.                              'reply_to' $identity);
  201.     else {
  202.         $from_mail getPref($data_dir$username'email_address');
  203.         $full_name getPref($data_dir$username'full_name');
  204.         $from_addr '"'.$full_name.'" <'.$from_mail.'>';
  205.         $reply_to  getPref($data_dir$username,'reply_to');
  206.     }
  207.  
  208.     // Patch #793504 Return Receipt Failing with <@> from Tim Craig (burny_md)
  209.     // This merely comes from compose.php and only happens when there is no
  210.     // email_addr specified in user's identity (which is the startup config)
  211.     if (preg_match('|^([^@%/]+)[@%/](.+)$|'$username$usernamedata)) {
  212.        $popuser $usernamedata[1];
  213.        $domain  $usernamedata[2];
  214.        unset($usernamedata);
  215.     else {
  216.        $popuser $username;
  217.     }
  218.  
  219.     if (!$from_mail{
  220.        $from_mail "$popuser@$domain";
  221.        $from_addr $from_mail;
  222.     }
  223.  
  224.     $rfc822_header->from $rfc822_header->parseAddress($from_addr,true);
  225.     if ($reply_to{
  226.        $rfc822_header->reply_to $rfc822_header->parseAddress($reply_to,true);
  227.     }
  228.  
  229.     // part 1 (RFC2298)
  230.     $senton getLongDateString$header->date$header->date_unparsed );
  231.     $to_array $header->to;
  232.     $to '';
  233.     foreach ($to_array as $line{
  234.         $to .= ' '.$line->getAddress();
  235.     }
  236.     $now getLongDateStringtime() );
  237.     set_my_charset();
  238.     $body _("Your message""\r\n\r\n" .
  239.             "\t" _("To"': ' decodeHeader($to,false,false,true"\r\n" .
  240.             "\t" _("Subject"': ' decodeHeader($header->subject,false,false,true"\r\n" .
  241.             "\t" _("Sent"': ' $senton "\r\n" .
  242.             "\r\n" .
  243.             sprintf_("Was displayed on %s")$now );
  244.  
  245.     $special_encoding '';
  246.     if (isset($languages[$squirrelmail_language]['XTRA_CODE']&&
  247.         function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
  248.         $body $languages[$squirrelmail_language]['XTRA_CODE']('encode'$body);
  249.         if (strtolower($default_charset== 'iso-2022-jp'{
  250.             if (mb_detect_encoding($body== 'ASCII'{
  251.                 $special_encoding '8bit';
  252.             else {
  253.                 $body mb_convert_encoding($body'JIS');
  254.                 $special_encoding '7bit';
  255.             }
  256.         }
  257.     elseif (sq_is8bit($body)) {
  258.         // detect 8bit symbols added by translations
  259.         $special_encoding '8bit';
  260.     }
  261.     $part1 new Message();
  262.     $part1->setBody($body);
  263.     $mime_header new MessageHeader;
  264.     $mime_header->type0 'text';
  265.     $mime_header->type1 'plain';
  266.     if ($special_encoding{
  267.         $mime_header->encoding $special_encoding;
  268.     else {
  269.         $mime_header->encoding '7bit';
  270.     }
  271.     if ($default_charset{
  272.         $mime_header->parameters['charset'$default_charset;
  273.     }
  274.     $part1->mime_header $mime_header;
  275.  
  276.     // part2  (RFC2298)
  277.     $original_recipient  $to;
  278.     $original_message_id $header->message_id;
  279.  
  280.     $report "Reporting-UA : $SERVER_NAME ; SquirrelMail (version $version) \r\n";
  281.     if ($original_recipient != ''{
  282.         $report .= "Original-Recipient : $original_recipient\r\n";
  283.     }
  284.     $final_recipient $sender;
  285.     $report .= "Final-Recipient: rfc822; $final_recipient\r\n.
  286.               "Original-Message-ID : $original_message_id\r\n.
  287.               "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
  288.  
  289.     $part2 new Message();
  290.     $part2->setBody($report);
  291.     $mime_header new MessageHeader;
  292.     $mime_header->type0 'message';
  293.     $mime_header->type1 'disposition-notification';
  294.     $mime_header->encoding '7bit';
  295.     $part2->mime_header $mime_header;
  296.  
  297.     $composeMessage new Message();
  298.     $composeMessage->rfc822_header $rfc822_header;
  299.     $composeMessage->addEntity($part1);
  300.     $composeMessage->addEntity($part2);
  301.  
  302.  
  303.     if ($useSendmail{
  304.         require_once(SM_PATH 'class/deliver/Deliver_SendMail.class.php');
  305.         global $sendmail_path$sendmail_args;
  306.         // Check for outdated configuration
  307.         if (!isset($sendmail_args)) {
  308.             if ($sendmail_path=='/var/qmail/bin/qmail-inject'{
  309.                 $sendmail_args '';
  310.             else {
  311.                 $sendmail_args '-i -t';
  312.             }
  313.         }
  314.         $deliver new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
  315.         $stream $deliver->initStream($composeMessage,$sendmail_path);
  316.     else {
  317.         require_once(SM_PATH 'class/deliver/Deliver_SMTP.class.php');
  318.         $deliver new Deliver_SMTP();
  319.  
  320.         $authPop (isset($pop_before_smtp&& $pop_before_smtptrue false;
  321.  
  322.         $user '';
  323.         $pass '';
  324.         if (empty($pop_before_smtp_host))
  325.             $pop_before_smtp_host $smtpServerAddress;
  326.  
  327.         get_smtp_user($user$pass);
  328.  
  329.         $stream $deliver->initStream($composeMessage,$domain,0,
  330.                 $smtpServerAddress$smtpPort$user$pass$authPop$pop_before_smtp_host);
  331.     }
  332.     $success false;
  333.     if ($stream{
  334.         $deliver->mail($composeMessage$stream);
  335.         $success $deliver->finalizeStream($stream);
  336.     }
  337.     if (!$success{
  338.         $msg  _("Message not sent.".' '.  _("Server replied:".
  339.             "\n<blockquote>\n" $deliver->dlv_msg '<br />' .
  340.             $deliver->dlv_ret_nr ' ' .
  341.             $deliver->dlv_server_msg "</blockquote>\n\n";
  342.         require_once(SM_PATH 'functions/display_messages.php');
  343.         plain_error_message($msg$color);
  344.     else {
  345.         unset ($deliver);
  346.  
  347.         // copy message to sent folder
  348.         $move_to_sent getPref($data_dir,$username,'move_to_sent');
  349.         if (isset($default_move_to_sent&& ($default_move_to_sent != 0)) {
  350.             $svr_allow_sent true;
  351.         else {
  352.             $svr_allow_sent false;
  353.         }
  354.  
  355.         if (isset($sent_folder&& (($sent_folder != ''|| ($sent_folder != 'none'))
  356.                 && sqimap_mailbox_exists$imapConnection$sent_folder)) {
  357.             $fld_sent true;
  358.         else {
  359.             $fld_sent false;
  360.         }
  361.  
  362.         if ((isset($move_to_sent&& ($move_to_sent != 0)) || (!isset($move_to_sent))) {
  363.             $lcl_allow_sent true;
  364.         else {
  365.             $lcl_allow_sent false;
  366.         }
  367.  
  368.         if (($fld_sent && $svr_allow_sent && !$lcl_allow_sent|| ($fld_sent && $lcl_allow_sent)) {
  369.             require_once(SM_PATH 'class/deliver/Deliver_IMAP.class.php');
  370.             $imap_deliver new Deliver_IMAP();
  371.             $imap_deliver->mail($composeMessage$imapConnection00$imapConnection$sent_folder);
  372.             unset ($imap_deliver);
  373.         }
  374.     }
  375.     return $success;
  376. }
  377.  
  378. function ToggleMDNflag ($set ,$imapConnection$mailbox$passed_id$uid_support{
  379.     $sg   =  $set?'+':'-';
  380.     $cmd  'STORE ' $passed_id ' ' $sg 'FLAGS ($MDNSent)';
  381.     $read sqimap_run_command ($imapConnection$cmdtrue$response,
  382.                                 $readmessage$uid_support);
  383. }
  384.  
  385. function formatRecipientString($recipients$item {
  386.     global $show_more_cc$show_more$show_more_bcc,
  387.            $PHP_SELF;
  388.  
  389.     $string '';
  390.     if ((is_array($recipients)) && (isset($recipients[0]))) {
  391.         $show false;
  392.  
  393.         if ($item == 'to'{
  394.             if ($show_more{
  395.                 $show true;
  396.                 $url set_url_var($PHP_SELF'show_more',0);
  397.             else {
  398.                 $url set_url_var($PHP_SELF'show_more',1);
  399.             }
  400.         else if ($item == 'cc'{
  401.             if ($show_more_cc{
  402.                 $show true;
  403.                 $url set_url_var($PHP_SELF'show_more_cc',0);
  404.             else {
  405.                 $url set_url_var($PHP_SELF'show_more_cc',1);
  406.             }
  407.         else if ($item == 'bcc'{
  408.             if ($show_more_bcc{
  409.                 $show true;
  410.                 $url set_url_var($PHP_SELF'show_more_bcc',0);
  411.             else {
  412.                 $url set_url_var($PHP_SELF'show_more_bcc',1);
  413.             }
  414.         }
  415.  
  416.         $cnt count($recipients);
  417.         foreach($recipients as $r{
  418.             $add decodeHeader($r->getAddress(true));
  419.             if ($string{
  420.                 $string .= '<br />' $add;
  421.             else {
  422.                 $string $add;
  423.                 if ($cnt 1{
  424.                     $string .= '&nbsp;(<a href="'.$url;
  425.                     if ($show{
  426.                        $string .= '">'._("less").'</a>)';
  427.                     else {
  428.                        $string .= '">'._("more").'</a>)';
  429.                        break;
  430.                     }
  431.                 }
  432.             }
  433.         }
  434.     }
  435.     return $string;
  436. }
  437.  
  438. function formatEnvheader($mailbox$passed_id$passed_ent_id$message,
  439.                          $color$FirstTimeSee{
  440.            $show_xmailer_default$mdn_user_support$PHP_SELF$javascript_on,
  441.            $squirrelmail_language;
  442.  
  443.     $header $message->rfc822_header;
  444.     $env array();
  445.     $env[_("Subject")decodeHeader($header->subject);
  446.     $from_name $header->getAddr_s('from');
  447.     if (!$from_name{
  448.         $from_name $header->getAddr_s('sender');
  449.         if (!$from_name{
  450.             $from_name _("Unknown sender");
  451.         }
  452.     }
  453.     $env[_("From")decodeHeader($from_name);
  454.     $env[_("Date")getLongDateString($header->date$header->date_unparsed);
  455.     $env[_("To")formatRecipientString($header->to"to");
  456.     $env[_("Cc")formatRecipientString($header->cc"cc");
  457.     $env[_("Bcc")formatRecipientString($header->bcc"bcc");
  458.     if ($default_use_priority{
  459.         $env[_("Priority")sm_encode_html_special_chars(getPriorityStr($header->priority));
  460.     }
  461.     if ($show_xmailer_default{
  462.         $env[_("Mailer")decodeHeader($header->xmailer);
  463.     }
  464.     if ($default_use_mdn{
  465.         if ($mdn_user_support{
  466.             if ($header->dnt{
  467.                 if ($message->is_mdnsent{
  468.                     $env[_("Read receipt")_("sent");
  469.                 else {
  470.                     $env[_("Read receipt")_("requested");
  471.                     if (!(handleAsSent($mailbox||
  472.                           $message->is_deleted ||
  473.                           $passed_ent_id)) {
  474.                         $mdn_url $PHP_SELF;
  475.                         $mdn_url set_url_var($mdn_url'mailbox'urlencode($mailbox));
  476.                         $mdn_url set_url_var($mdn_url'passed_id'$passed_id);
  477.                         $mdn_url set_url_var($mdn_url'passed_ent_id'$passed_ent_id);
  478.                         $mdn_url set_url_var($mdn_url'sendreceipt'1);
  479.                         if ($FirstTimeSee && $javascript_on{
  480.                             $script  '<script language="JavaScript" type="text/javascript">' "\n";
  481.                             $script .= '<!--'"\n";
  482.                             $script .= 'if(window.confirm("' .
  483.                                        _("The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?".
  484.                                        '")) {  '."\n" .
  485.                                        '    sendMDN()'.
  486.                                        '}' "\n";
  487.                             $script .= '// -->'"\n";
  488.                             $script .= '</script>'"\n";
  489.                             echo $script;
  490.                         }
  491.                         $env[_("Read receipt").= '&nbsp;<a href="' $mdn_url '">[' .
  492.                                                    _("Send read receipt now"']</a>';
  493.                     }
  494.                 }
  495.             }
  496.         }
  497.     }
  498.  
  499.     $s  '<table width="100%" cellpadding="0" cellspacing="2" border="0"';
  500.     $s .= ' align="center" bgcolor="'.$color[0].'">';
  501.     foreach ($env as $key => $val{
  502.         if ($val{
  503.             $s .= '<tr>';
  504.             $s .= html_tag('td''<b>' $key ':&nbsp;&nbsp;</b>''right''''valign="top" width="20%"'"\n";
  505.             $s .= html_tag('td'$val'left''''valign="top" width="80%"'"\n";
  506.             $s .= '</tr>';
  507.         }
  508.     }
  509.     echo '<table bgcolor="'.$color[9].'" width="100%" cellpadding="1"'.
  510.          ' cellspacing="0" border="0" align="center">'."\n";
  511.     echo '<tr><td height="5" colspan="2" bgcolor="'.
  512.           $color[4].'"></td></tr><tr><td align="center">'."\n";
  513.     echo $s;
  514.     do_hook('read_body_header');
  515.     formatToolbar($mailbox$passed_id$passed_ent_id$message$color);
  516.     echo '</table>';
  517.     echo '</td></tr><tr><td height="5" colspan="2" bgcolor="'.$color[4].'"></td></tr>'."\n";
  518.     echo '</table>';
  519. }
  520.  
  521. function formatMenuBar($mailbox$passed_id$passed_ent_id$message$mbx_response{
  522.     global $base_uri$draft_folder$where$what$color$sort,
  523.            $startMessage$PHP_SELF$save_as_draft,
  524.            $enable_forward_as_attachment;
  525.  
  526.     $topbar_delimiter '&nbsp;|&nbsp;';
  527.     $urlMailbox urlencode($mailbox);
  528.     $s '<table width="100%" cellpadding="3" cellspacing="0" align="center"'.
  529.          ' border="0" bgcolor="'.$color[9].'"><tr>' .
  530.          html_tag'td''''left''''width="33%"' '<small>';
  531.  
  532.     $msgs_url $base_uri 'src/';
  533.     if (isset($where&& isset($what)) {
  534.         $msgs_url .= 'search.php?smtoken=' sm_generate_security_token('&amp;where=' urlencode($where.
  535.                      '&amp;what=' urlencode($what'&amp;mailbox=' $urlMailbox;
  536.         $msgs_str  _("Search Results");
  537.     else {
  538.         $msgs_url .= 'right_main.php?sort=' $sort '&amp;startMessage=' .
  539.                      $startMessage '&amp;mailbox=' $urlMailbox;
  540.         $msgs_str  _("Message List");
  541.     }
  542.     $s .= '<a href="' $msgs_url '">' $msgs_str '</a>';
  543.  
  544.     $delete_url $base_uri 'src/delete_message.php?mailbox=' $urlMailbox .
  545.                   '&amp;message=' $passed_id '&amp;smtoken=' sm_generate_security_token('&amp;';
  546.     $unread_url $base_uri 'src/';
  547.     if (!(isset($passed_ent_id&& $passed_ent_id)) {
  548.         if ($where && $what{
  549.             $unread_url .= 'search.php?unread_passed_id=' $passed_id '&amp;smtoken=' sm_generate_security_token('&amp;where=' urlencode($where'&amp;what=' urlencode($what'&amp;mailbox=' $urlMailbox;
  550.         else {
  551.             $unread_url .= 'right_main.php?unread_passed_id=' $passed_id '&amp;sort=' $sort '&amp;startMessage=' $startMessage '&amp;mailbox=' $urlMailbox;
  552.         }
  553.         $s .= $topbar_delimiter;
  554.         $s .= '<a href="' $unread_url '">' _("Unread"'</a>';
  555.  
  556.         if ($where && $what{
  557.             $delete_url .= 'where=' urlencode($where'&amp;what=' urlencode($what);
  558.         else {
  559.             $delete_url .= 'sort=' $sort '&amp;startMessage=' $startMessage;
  560.         }
  561.         $s .= $topbar_delimiter;
  562.         $s .= '<a href="' $delete_url '">' _("Delete"'</a>';
  563.     }
  564.  
  565.     $comp_uri 'src/compose.php' .
  566.                 '?passed_id=' $passed_id .
  567.                 '&amp;mailbox=' $urlMailbox .
  568.                 '&amp;startMessage=' $startMessage .
  569.                 (isset($passed_ent_id)?'&amp;passed_ent_id='.urlencode($passed_ent_id):'');
  570.  
  571.     if (($mailbox == $draft_folder&& ($save_as_draft)) {
  572.         $comp_alt_uri $comp_uri '&amp;smaction=draft';
  573.         $comp_alt_string _("Resume Draft");
  574.     else if (handleAsSent($mailbox)) {
  575.         $comp_alt_uri $comp_uri '&amp;smaction=edit_as_new';
  576.         $comp_alt_string _("Edit Message as New");
  577.     }
  578.     if (isset($comp_alt_uri)) {
  579.         $s .= $topbar_delimiter;
  580.         $s .= makeComposeLink($comp_alt_uri$comp_alt_string);
  581.     }
  582.  
  583.     $s .= '</small></td><td align="center" width="33%"><small>';
  584.  
  585.     if (!(isset($where&& isset($what)) && !$passed_ent_id{
  586.         $prev findPreviousMessage($mbx_response['EXISTS']$passed_id);
  587.         $next findNextMessage($passed_id);
  588.         if ($prev != -1{
  589.             $uri $base_uri 'src/read_body.php?passed_id='.$prev.
  590.                    '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
  591.                    '&amp;startMessage='.$startMessage.'&amp;show_more=0';
  592.             $s .= '<a href="'.$uri.'">'._("Previous").'</a>';
  593.         else {
  594.             $s .= _("Previous");
  595.         }
  596.         $s .= $topbar_delimiter;
  597.         if ($next != -1{
  598.             $uri $base_uri 'src/read_body.php?passed_id='.$next.
  599.                    '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
  600.                    '&amp;startMessage='.$startMessage.'&amp;show_more=0';
  601.             $s .= '<a href="'.$uri.'">'._("Next").'</a>';
  602.         else {
  603.             $s .= _("Next");
  604.         }
  605.     else if (isset($passed_ent_id&& $passed_ent_id{
  606.         /* code for navigating through attached message/rfc822 messages */
  607.         $url set_url_var($PHP_SELF'passed_ent_id',0);
  608.         $s .= '<a href="'.$url.'">'._("View Message").'</a>';
  609.         $entities     array();
  610.         $entity_count array();
  611.         $c 0;
  612.  
  613.         foreach($message->parent->entities as $ent{
  614.             if ($ent->type0 == 'message' && $ent->type1 == 'rfc822'{
  615.                 $c++;
  616.                 $entity_count[$c$ent->entity_id;
  617.                 $entities[$ent->entity_id$c;
  618.             }
  619.         }
  620.  
  621.         $prev_link _("Previous");
  622.         if (!empty($entities[$passed_ent_id]&& ($entities[$passed_ent_id1)) {
  623.             $prev_ent_id $entity_count[$entities[$passed_ent_id1];
  624.             $prev_link   '<a href="'
  625.                          . set_url_var($PHP_SELF'passed_ent_id'$prev_ent_id)
  626.                          . '">' $prev_link '</a>';
  627.         }
  628.  
  629.         $next_link _("Next");
  630.         if (!empty($entities[$passed_ent_id]&& ($entities[$passed_ent_id$c)) {
  631.             $next_ent_id $entity_count[$entities[$passed_ent_id1];
  632.             $next_link   '<a href="'
  633.                          . set_url_var($PHP_SELF'passed_ent_id'$next_ent_id)
  634.                          . '">' $next_link '</a>';
  635.         }
  636.         $s .= $topbar_delimiter $prev_link;
  637.         $par_ent_id $message->parent->entity_id;
  638.         if ($par_ent_id{
  639.             $par_ent_id substr($par_ent_id,0,-2);
  640.             $s .= $topbar_delimiter;
  641.             $url set_url_var($PHP_SELF'passed_ent_id',$par_ent_id);
  642.             $s .= '<a href="'.$url.'">'._("Up").'</a>';
  643.         }
  644.         $s .= $topbar_delimiter $next_link;
  645.     }
  646.  
  647.     $s .= '</small></td>' "\n" .
  648.           html_tag'td''''right''''width="33%" nowrap' '<small>';
  649.     $comp_action_uri $comp_uri '&amp;smaction=forward';
  650.     $s .= makeComposeLink($comp_action_uri_("Forward"));
  651.  
  652.     if ($enable_forward_as_attachment{
  653.         $comp_action_uri $comp_uri '&amp;smaction=forward_as_attachment';
  654.         $s .= $topbar_delimiter;
  655.         $s .= makeComposeLink($comp_action_uri_("Forward as Attachment"));
  656.     }
  657.  
  658.     $comp_action_uri $comp_uri '&amp;smaction=reply';
  659.     $s .= $topbar_delimiter;
  660.     $s .= makeComposeLink($comp_action_uri_("Reply"));
  661.  
  662.     $comp_action_uri $comp_uri '&amp;smaction=reply_all';
  663.     $s .= $topbar_delimiter;
  664.     $s .= makeComposeLink($comp_action_uri_("Reply All"));
  665.     $s .= '</small></td></tr></table>';
  666.     $ret do_hook_function('read_body_menu_top'$s);
  667.     if(!is_null($ret)) {
  668.         $s $ret;
  669.     }
  670.     echo $s;
  671.     do_hook('read_body_menu_bottom');
  672. }
  673.  
  674. function formatToolbar($mailbox$passed_id$passed_ent_id$message$color{
  675.     global $base_uri$where$what$download_and_unsafe_link;
  676.  
  677.     $urlMailbox urlencode($mailbox);
  678.     $urlPassed_id urlencode($passed_id);
  679.     $urlPassed_ent_id urlencode($passed_ent_id);
  680.  
  681.     $query_string 'mailbox=' $urlMailbox '&amp;passed_id=' $urlPassed_id '&amp;passed_ent_id=' $urlPassed_ent_id;
  682.  
  683.     if (!empty($where)) {
  684.         $query_string .= '&amp;where=' urlencode($where);
  685.     }
  686.  
  687.     if (!empty($what)) {
  688.         $query_string .= '&amp;what=' urlencode($what);
  689.     }
  690.  
  691.     $url $base_uri.'src/view_header.php?'.$query_string;
  692.  
  693.     $s  "<tr>\n" .
  694.           html_tag'td''''right''''valign="middle" width="20%"' '<b>' _("Options"":&nbsp;&nbsp;</b></td>\n" .
  695.           html_tag'td''''left''''valign="middle" width="80%"' '<small>' .
  696.           '<a href="'.$url.'">'._("View Full Header").'</a>';
  697.  
  698.     /* Output the printer friendly link if we are in subtle mode. */
  699.     $s .= '&nbsp;|&nbsp;' .
  700.           printer_friendly_link($mailbox$passed_id$passed_ent_id$color);
  701.     echo $s;
  702.  
  703.     /* Output the download and/or unsafe images link/-s, if any. */
  704.     if ($download_and_unsafe_link{
  705.         echo $download_and_unsafe_link;
  706.     }
  707.  
  708.     do_hook("read_body_header_right");
  709.     $s "</small></td>\n" .
  710.          "</tr>\n";
  711.     echo $s;
  712.  
  713. }
  714.  
  715. /***************************/
  716. /*   Main of read_body.php */
  717. /***************************/
  718.  
  719. /* get the globals we may need */
  720.  
  721. sqgetGlobalVar('key',       $key,           SQ_COOKIE);
  722. sqgetGlobalVar('username',  $username,      SQ_SESSION);
  723. sqgetGlobalVar('onetimepad',$onetimepad,    SQ_SESSION);
  724. sqgetGlobalVar('delimiter'$delimiter,     SQ_SESSION);
  725. sqgetGlobalVar('base_uri',  $base_uri,      SQ_SESSION);
  726.  
  727. sqgetGlobalVar('msgs',      $msgs,          SQ_SESSION);
  728. sqgetGlobalVar('msort',     $msort,         SQ_SESSION);
  729. sqgetGlobalVar('lastTargetMailbox'$lastTargetMailboxSQ_SESSION);
  730. sqgetGlobalVar('server_sort_array'$server_sort_arraySQ_SESSION);
  731. if (!sqgetGlobalVar('messages'$messagesSQ_SESSION) ) {
  732.     $messages array();
  733. }
  734.  
  735. /** GET VARS */
  736. sqgetGlobalVar('sendreceipt',   $sendreceipt,   SQ_GET);
  737. sqgetGlobalVar('where',         $where,         SQ_GET);
  738. sqgetGlobalVar('what',          $what,          SQ_GET);
  739. if sqgetGlobalVar('show_more'$temp,  SQ_GET) ) {
  740.     $show_more = (int) $temp;
  741. }
  742. if sqgetGlobalVar('show_more_cc'$temp,  SQ_GET) ) {
  743.     $show_more_cc = (int) $temp;
  744. }
  745. if sqgetGlobalVar('show_more_bcc'$temp,  SQ_GET) ) {
  746.     $show_more_bcc = (int) $temp;
  747. }
  748. if sqgetGlobalVar('view_hdr'$temp,  SQ_GET) ) {
  749.     $view_hdr = (int) $temp;
  750. }
  751.  
  752. /** POST VARS */
  753. sqgetGlobalVar('move_id',       $move_id,       SQ_POST);
  754.  
  755. /** GET/POST VARS */
  756. sqgetGlobalVar('passed_ent_id'$passed_ent_id);
  757. sqgetGlobalVar('mailbox',       $mailbox);
  758.  
  759. if sqgetGlobalVar('passed_id'$temp) ) {
  760.     $passed_id = (int) $temp;
  761. }
  762. if sqgetGlobalVar('sort'$temp) ) {
  763.     $sort = (int) $temp;
  764. }
  765. if sqgetGlobalVar('startMessage'$temp) ) {
  766.     $startMessage = (int) $temp;
  767. }
  768.  
  769. /* end of get globals */
  770. global $uid_support$sqimap_capabilities;
  771.  
  772. global $imap_stream_options// in case not defined in config
  773. $imapConnection sqimap_login($username$key$imapServerAddress$imapPort0$imap_stream_options);
  774. $mbx_response   sqimap_mailbox_select($imapConnection$mailboxfalsefalsetrue);
  775.  
  776.  
  777. /**
  778.  * $message contains all information about the message
  779.  * including header and body
  780.  */
  781.  
  782. $uidvalidity $mbx_response['UIDVALIDITY'];
  783.  
  784. if (!isset($messages[$uidvalidity])) {
  785.    $messages[$uidvalidityarray();
  786. }
  787. if (!isset($messages[$uidvalidity][$passed_id]|| !$uid_support{
  788.    $message sqimap_get_message($imapConnection$passed_id$mailbox);
  789.    $FirstTimeSee !$message->is_seen;
  790.    $message->is_seen true;
  791.    $messages[$uidvalidity][$passed_id$message;
  792. else {
  793. //   $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
  794.    $message $messages[$uidvalidity][$passed_id];
  795.    $FirstTimeSee !$message->is_seen;
  796. }
  797.  
  798. if (isset($passed_ent_id&& $passed_ent_id{
  799.     $message $message->getEntity($passed_ent_id);
  800.     if ($message->type0 != 'message'  && $message->type1 != 'rfc822'{
  801.         $message $message->parent;
  802.     }
  803.     $read sqimap_run_command ($imapConnection"FETCH $passed_id BODY[$passed_ent_id.HEADER]"true$response$msg$uid_support);
  804.     $rfc822_header new Rfc822Header();
  805.     $rfc822_header->parseHeader($read);
  806.     $message->rfc822_header $rfc822_header;
  807. else {
  808.     $passed_ent_id 0;
  809. }
  810. $header $message->header;
  811.  
  812. // gmail does not mark messages as read when retrieving the message body
  813. // even though RFC 3501, section 6.4.5 (FETCH Command) says:
  814. // "The \Seen flag is implicitly set; if this causes the flags to change,
  815. // they SHOULD be included as part of the FETCH responses."
  816. //
  817. if ($imap_server_type == 'gmail'{
  818.     sqimap_toggle_flag($imapConnection$passed_id'\\Seen'truetrue);
  819. }
  820.  
  821. do_hook('html_top');
  822.  
  823. /****************************************/
  824. /* Block for handling incoming url vars */
  825. /****************************************/
  826.  
  827. if (isset($sendreceipt)) {
  828.    if !$message->is_mdnsent {
  829.       if (isset($identity) ) {
  830.          $final_recipient getPref($data_dir$username'email_address0''' );
  831.       else {
  832.          $final_recipient getPref($data_dir$username'email_address''' );
  833.       }
  834.  
  835.       $final_recipient trim($final_recipient);
  836.       if ($final_recipient == '' {
  837.          $final_recipient getPref($data_dir$username'email_address''' );
  838.       }
  839.       $supportMDN ServerMDNSupport($mbx_response["PERMANENTFLAGS"]);
  840.       if SendMDN$mailbox$passed_id$final_recipient$message$imapConnection && $supportMDN {
  841.          ToggleMDNflagtrue$imapConnection$mailbox$passed_id$uid_support);
  842.          $message->is_mdnsent true;
  843.          $messages[$uidvalidity][$passed_id]=$message;
  844.       }
  845.    }
  846. }
  847. /***********************************************/
  848. /* End of block for handling incoming url vars */
  849. /***********************************************/
  850.  
  851. $msgs[$passed_id]['FLAG_SEEN'true;
  852.  
  853. $messagebody '';
  854. do_hook('read_body_top');
  855. if ($show_html_default == 1{
  856.     $ent_ar $message->findDisplayEntity(array());
  857. else {
  858.     $ent_ar $message->findDisplayEntity(array()array('text/plain'));
  859. }
  860. $cnt count($ent_ar);
  861. for ($i 0$i $cnt$i++{
  862.    $messagebody .= formatBody($imapConnection$message$color$wrap_at$ent_ar[$i]$passed_id$mailbox);
  863.    if ($i != $cnt-1{
  864.        $messagebody .= '<hr noshade size=1>';
  865.    }
  866. }
  867.  
  868. displayPageHeader($color$mailbox);
  869. formatMenuBar($mailbox$passed_id$passed_ent_id$message$mbx_response);
  870. formatEnvheader($mailbox$passed_id$passed_ent_id$message$color$FirstTimeSee);
  871. echo '<table width="100%" cellpadding="0" cellspacing="0" align="center" border="0">';
  872. echo '  <tr><td>';
  873. echo '    <table width="100%" cellpadding="1" cellspacing="0" align="center" border="0" bgcolor="'.$color[9].'">';
  874. echo '      <tr><td>';
  875. echo '        <table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
  876. echo '          <tr bgcolor="'.$color[4].'"><td>';
  877. // echo '            <table cellpadding="1" cellspacing="5" align="left" border="0">';
  878. echo html_tag'table' ,'' 'left''''cellpadding="1" cellspacing="5" border="0"' );
  879. echo '              <tr>' html_tag'td''<br />'$messagebody."\n"'left')
  880.                         . '</tr>';
  881. echo '            </table>';
  882. echo '          </td></tr>';
  883. echo '        </table></td></tr>';
  884. echo '    </table>';
  885. echo '  </td></tr>';
  886.  
  887. echo '<tr><td height="5" colspan="2" bgcolor="'.
  888.           $color[4].'"></td></tr>'."\n";
  889.  
  890. $attachmentsdisplay formatAttachments($message,$ent_ar,$mailbox$passed_id);
  891. if ($attachmentsdisplay{
  892.    echo '  <tr><td>';
  893.    echo '    <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">';
  894.    echo '     <tr><td>';
  895.    echo '       <table width="100%" cellpadding="0" cellspacing="0" align="center" border="0" bgcolor="'.$color[4].'">';
  896.    echo '        <tr>' html_tag'td''''left'$color[9);
  897.    echo '           <b>' _("Attachments"':</b>';
  898.    $hook_args array($message$mailbox$passed_id$passed_ent_id);
  899.    echo concat_hook_function('attachments_top'$hook_args);
  900.    echo '        </td></tr>';
  901.    echo '        <tr><td>';
  902.    echo '          <table width="100%" cellpadding="2" cellspacing="2" align="center"'.' border="0" bgcolor="'.$color[0].'">';
  903.    echo              $attachmentsdisplay;
  904.    echo '          </table>';
  905.    echo '       </td></tr></table>';
  906.    echo '    </td></tr></table>';
  907.    echo '  </td></tr>';
  908.    echo '<tr><td height="5" colspan="2" bgcolor="'.
  909.           $color[4].'"></td></tr>';
  910. }
  911. echo '</table>';
  912.  
  913. /* show attached images inline -- if pref'fed so */
  914. if (($attachment_common_show_images&&
  915.     is_array($attachment_common_show_images_list)) {
  916.     foreach ($attachment_common_show_images_list as $img{
  917.         $imgurl SM_PATH 'src/download.php' .
  918.                 '?' .
  919.                 'passed_id='     urlencode($img['passed_id'].
  920.                 '&amp;mailbox='       urlencode($mailbox.
  921.                 '&amp;ent_id=' urlencode($img['ent_id'].
  922.                 '&amp;absolute_dl=true';
  923.  
  924.         echo html_tag'table'"\n" .
  925.                     html_tag'tr'"\n" .
  926.                         html_tag'td''<img src="' $imgurl '" />' ."\n"'left'
  927.                         )
  928.                     ,
  929.         'center''''cellspacing="0" border="0" cellpadding="2"');
  930.     }
  931. }
  932.  
  933. //FIXME: one of these hooks should be removed if we can verify disuse (html_bottom?)
  934. do_hook('read_body_bottom');
  935. do_hook('html_bottom');
  936. sqimap_logout($imapConnection);
  937. /* sessions are written at the end of the script. it's better to register
  938.    them at the end so we avoid double session_register calls */
  939. sqsession_register($messages,'messages');
  940.  
  941. ?>
  942. </body></html>

Documentation generated on Sat, 25 Oct 2014 04:21:44 +0200 by phpDocumentor 1.4.3