65e74c7cf7f13aed0492e1fa80aced4f8624a8c7
6 * This file is used for reading the msgs array and displaying
7 * the resulting emails in the right frame.
9 * @copyright © 1999-2006 The SquirrelMail Project Team
10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
12 * @package squirrelmail
16 * Path for SquirrelMail required files.
19 define('SM_PATH','../');
21 /* SquirrelMail required files. */
22 include_once(SM_PATH
. 'include/validate.php');
23 //require_once(SM_PATH . 'functions/global.php');
24 require_once(SM_PATH
. 'functions/imap.php');
25 require_once(SM_PATH
. 'functions/mime.php');
26 require_once(SM_PATH
. 'functions/date.php');
27 require_once(SM_PATH
. 'functions/url_parser.php');
28 require_once(SM_PATH
. 'functions/html.php');
29 //require_once(SM_PATH . 'functions/global.php');
30 require_once(SM_PATH
. 'functions/identity.php');
31 include_once(SM_PATH
. 'functions/arrays.php');
32 include_once(SM_PATH
. 'functions/mailbox_display.php');
35 * Given an IMAP message id number, this will look it up in the cached
36 * and sorted msgs array and return the index of the next message
38 * @param int $passed_id The current message UID
39 * @return the index of the next valid message from the array
41 function findNextMessage($uidset,$passed_id='backwards') {
42 if (!is_array($uidset)) {
45 if ($passed_id=='backwards' ||
!is_array($uidset)) { // check for backwards compattibilty gpg plugin
48 $result = sqm_array_get_value_by_offset($uidset,$passed_id,1);
49 if ($result === false) {
57 * Given an IMAP message id number, this will look it up in the cached
58 * and sorted msgs array and return the index of the previous message
60 * @param int $passed_id The current message UID
61 * @return the index of the next valid message from the array
64 function findPreviousMessage($uidset, $passed_id) {
65 if (!is_array($uidset)) {
68 $result = sqm_array_get_value_by_offset($uidset,$passed_id,-1);
69 if ($result === false) {
77 * Displays a link to a page where the message is displayed more
79 * @param string $mailbox Name of current mailbox
80 * @param int $passed_id
82 function printer_friendly_link($mailbox, $passed_id, $passed_ent_id) {
83 global $javascript_on, $show_html_default;
86 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET
) ) {
87 $view_unsafe_images = false;
89 $view_unsafe_images = true;
91 $params = '?passed_ent_id=' . urlencode($passed_ent_id) .
92 '&mailbox=' . urlencode($mailbox) .
93 '&passed_id=' . urlencode($passed_id) .
94 '&view_unsafe_images='. (bool) $view_unsafe_images .
95 '&show_html_default=' . $show_html_default;
97 $print_text = _("View Printable Version");
100 /* Output the link. */
101 if ($javascript_on) {
102 $result = '<script type="text/javascript">' . "\n" .
104 " function printFormat() {\n" .
105 ' window.open("../src/printer_friendly_main.php' .
106 $params . '","Print","width=800,height=600");' . "\n".
110 "<a href=\"javascript:printFormat();\">$print_text</a>\n";
112 $result = '<a target="_blank" href="../src/printer_friendly_bottom.php' .
113 "$params\">$print_text</a>\n";
118 function ServerMDNSupport($aFlags) {
119 /* escaping $ doesn't work -> \x36 */
120 return ( in_array('$mdnsent',$aFlags,true) ||
121 in_array('\\*',$aFlags,true) ) ;
124 function SendMDN ( $mailbox, $passed_id, $sender, $message, $imapConnection) {
125 global $username, $attachment_dir, $popuser, $username, $color,
126 $version, $squirrelmail_language, $default_charset,
127 $languages, $useSendmail, $domain, $sent_folder;
129 sqgetGlobalVar('SERVER_NAME', $SERVER_NAME, SQ_SERVER
);
131 $header = $message->rfc822_header
;
133 $rfc822_header = new Rfc822Header();
134 $content_type = new ContentType('multipart/report');
135 $content_type->properties
['report-type']='disposition-notification';
138 if ($default_charset) {
139 $content_type->properties
['charset']=$default_charset;
141 $rfc822_header->content_type
= $content_type;
142 $rfc822_header->to
[] = $header->dnt
;
143 $rfc822_header->subject
= _("Read:") . ' ' . encodeHeader($header->subject
);
145 // Patch #793504 Return Receipt Failing with <@> from Tim Craig (burny_md)
146 // This merely comes from compose.php and only happens when there is no
147 // email_addr specified in user's identity (which is the startup config)
148 if (ereg("^([^@%/]+)[@%/](.+)$", $username, $usernamedata)) {
149 $popuser = $usernamedata[1];
150 $domain = $usernamedata[2];
151 unset($usernamedata);
153 $popuser = $username;
157 $ident = get_identities();
158 if(!isset($identity)) $identity = 0;
159 $full_name = $ident[$identity]['full_name'];
160 $from_mail = $ident[$identity]['email_address'];
161 $from_addr = '"'.$full_name.'" <'.$from_mail.'>';
162 $reply_to = $ident[$identity]['reply_to'];
165 $from_mail = "$popuser@$domain";
166 $from_addr = $from_mail;
168 $rfc822_header->from
= $rfc822_header->parseAddress($from_addr,true);
170 $rfc822_header->reply_to
= $rfc822_header->parseAddress($reply_to,true);
174 $senton = getLongDateString( $header->date
);
175 $to_array = $header->to
;
177 foreach ($to_array as $line) {
178 $to .= ' '.$line->getAddress();
180 $now = getLongDateString( time() );
182 $body = _("Your message") . "\r\n\r\n" .
183 "\t" . _("To") . ': ' . decodeHeader($to,false,false) . "\r\n" .
184 "\t" . _("Subject") . ': ' . decodeHeader($header->subject
,false,false) . "\r\n" .
185 "\t" . _("Sent") . ': ' . $senton . "\r\n" .
187 sprintf( _("Was displayed on %s"), $now );
189 $special_encoding = '';
190 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
191 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
192 $body = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $body);
193 if (strtolower($default_charset) == 'iso-2022-jp') {
194 if (mb_detect_encoding($body) == 'ASCII') {
195 $special_encoding = '8bit';
197 $body = mb_convert_encoding($body, 'JIS');
198 $special_encoding = '7bit';
201 } elseif (sq_is8bit($body)) {
202 $special_encoding = '8bit';
204 $part1 = new Message();
205 $part1->setBody($body);
206 $mime_header = new MessageHeader
;
207 $mime_header->type0
= 'text';
208 $mime_header->type1
= 'plain';
209 if ($special_encoding) {
210 $mime_header->encoding
= $special_encoding;
212 $mime_header->encoding
= 'us-ascii';
214 if ($default_charset) {
215 $mime_header->parameters
['charset'] = $default_charset;
217 $part1->mime_header
= $mime_header;
220 $original_recipient = $to;
221 $original_message_id = $header->message_id
;
223 $report = "Reporting-UA : $SERVER_NAME ; SquirrelMail (version $version) \r\n";
224 if ($original_recipient != '') {
225 $report .= "Original-Recipient : $original_recipient\r\n";
227 $final_recipient = $sender;
228 $report .= "Final-Recipient: rfc822; $final_recipient\r\n" .
229 "Original-Message-ID : $original_message_id\r\n" .
230 "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
232 $part2 = new Message();
233 $part2->setBody($report);
234 $mime_header = new MessageHeader
;
235 $mime_header->type0
= 'message';
236 $mime_header->type1
= 'disposition-notification';
237 $mime_header->encoding
= 'us-ascii';
238 $part2->mime_header
= $mime_header;
240 $composeMessage = new Message();
241 $composeMessage->rfc822_header
= $rfc822_header;
242 $composeMessage->addEntity($part1);
243 $composeMessage->addEntity($part2);
247 require_once(SM_PATH
. 'class/deliver/Deliver_SendMail.class.php');
248 global $sendmail_path;
249 $deliver = new Deliver_SendMail();
250 $stream = $deliver->initStream($composeMessage,$sendmail_path);
252 require_once(SM_PATH
. 'class/deliver/Deliver_SMTP.class.php');
253 $deliver = new Deliver_SMTP();
254 global $smtpServerAddress, $smtpPort, $pop_before_smtp;
255 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ?
true : false;
256 get_smtp_user($user, $pass);
257 $stream = $deliver->initStream($composeMessage,$domain,0,
258 $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
262 $length = $deliver->mail($composeMessage, $stream);
263 $success = $deliver->finalizeStream($stream);
266 $msg = $deliver->dlv_msg
;
267 if (! empty($deliver->dlv_server_msg
)) {
269 _("Server replied:") . ' ' . $deliver->dlv_ret_nr
. ' ' .
270 nl2br(htmlspecialchars($deliver->dlv_server_msg
));
272 require_once(SM_PATH
. 'functions/display_messages.php');
273 plain_error_message($msg, $color);
276 if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
277 sqimap_append ($imapConnection, $sent_folder, $length);
278 require_once(SM_PATH
. 'class/deliver/Deliver_IMAP.class.php');
279 $imap_deliver = new Deliver_IMAP();
280 $imap_deliver->mail($composeMessage, $imapConnection);
281 sqimap_append_done ($imapConnection);
282 unset ($imap_deliver);
288 function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
290 $cmd = 'STORE ' . $passed_id . ' ' . $sg . 'FLAGS ($MDNSent)';
291 $read = sqimap_run_command ($imapConnection, $cmd, true, $response,
295 function formatRecipientString($recipients, $item ) {
296 global $show_more_cc, $show_more, $show_more_bcc,
300 if ((is_array($recipients)) && (isset($recipients[0]))) {
306 $url = set_url_var($PHP_SELF, 'show_more',0);
308 $url = set_url_var($PHP_SELF, 'show_more',1);
310 } else if ($item == 'cc') {
313 $url = set_url_var($PHP_SELF, 'show_more_cc',0);
315 $url = set_url_var($PHP_SELF, 'show_more_cc',1);
317 } else if ($item == 'bcc') {
318 if ($show_more_bcc) {
320 $url = set_url_var($PHP_SELF, 'show_more_bcc',0);
322 $url = set_url_var($PHP_SELF, 'show_more_bcc',1);
326 $cnt = count($recipients);
327 foreach($recipients as $r) {
328 $add = decodeHeader($r->getAddress(true));
330 $string .= '<br />' . $add;
334 $string .= ' (<a href="'.$url;
336 $string .= '">'._("less").'</a>)';
338 $string .= '">'._("more").'</a>)';
348 function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
349 $color, $FirstTimeSee) {
350 global $default_use_mdn, $default_use_priority,
351 $show_xmailer_default, $mdn_user_support, $PHP_SELF, $javascript_on,
352 $squirrelmail_language;
354 $mailbox = $aMailbox['NAME'];
356 $header = $message->rfc822_header
;
358 $env[_("Subject")] = str_replace(" "," ",decodeHeader($header->subject
));
360 $from_name = $header->getAddr_s('from');
362 $from_name = $header->getAddr_s('sender');
364 $env[_("From")] = _("Unknown sender");
366 $env[_("From")] = decodeHeader($from_name);
367 $env[_("Date")] = getLongDateString($header->date
);
368 $env[_("To")] = formatRecipientString($header->to
, "to");
369 $env[_("Cc")] = formatRecipientString($header->cc
, "cc");
370 $env[_("Bcc")] = formatRecipientString($header->bcc
, "bcc");
371 if ($default_use_priority) {
372 $env[_("Priority")] = htmlspecialchars(getPriorityStr($header->priority
));
374 if ($show_xmailer_default) {
375 $env[_("Mailer")] = decodeHeader($header->xmailer
);
377 if ($default_use_mdn) {
378 if ($mdn_user_support) {
380 if ($message->is_mdnsent
) {
381 $env[_("Read receipt")] = _("sent");
383 $env[_("Read receipt")] = _("requested");
384 if (!(handleAsSent($mailbox) ||
385 $message->is_deleted ||
387 $mdn_url = $PHP_SELF . '&sendreceipt=1';
388 if ($FirstTimeSee && $javascript_on) {
389 $script = '<script type="text/javascript">' . "\n";
390 $script .= '<!--'. "\n";
391 $script .= 'if(window.confirm("' .
392 _("The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?") .
396 $script .= '// -->'. "\n";
397 $script .= '</script>'. "\n";
400 $env[_("Read receipt")] .= ' <a href="' . $mdn_url . '">[' .
401 _("Send read receipt now") . ']</a>';
408 $s = '<table width="100%" cellpadding="0" cellspacing="2" border="0"';
409 $s .= ' align="center" bgcolor="'.$color[0].'">';
410 foreach ($env as $key => $val) {
413 $s .= html_tag('td', '<b>' . $key . ': </b>', 'right', '', 'valign="top" width="20%"') . "\n";
414 $s .= html_tag('td', $val, 'left', '', 'valign="top" width="80%"') . "\n";
418 echo '<table bgcolor="'.$color[9].'" width="100%" cellpadding="1"'.
419 ' cellspacing="0" border="0" align="center">'."\n";
420 echo '<tr><td height="5" colspan="2" bgcolor="'.
421 $color[4].'"></td></tr><tr><td align="center">'."\n";
423 do_hook('read_body_header');
424 formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
426 echo '</td></tr><tr><td height="5" colspan="2" bgcolor="'.$color[4].'"></td></tr>'."\n";
431 * Format message toolbar
433 * @param string $mailbox Name of current mailbox
434 * @param int $passed_id UID of current message
435 * @param int $passed_ent_id Id of entity within message
436 * @param object $message Current message object
437 * @param object $mbx_response
439 function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
440 global $base_uri, $draft_folder, $where, $what, $color, $sort,
441 $startMessage, $PHP_SELF, $save_as_draft,
442 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
443 $username, $delete_prev_next_display,
444 $compose_new_win, $javascript_on, $compose_width, $compose_height;
446 //FIXME cleanup argument list, use $aMailbox where possible
447 $mailbox = $aMailbox['NAME'];
449 $topbar_delimiter = ' | ';
450 $double_delimiter = ' ';
451 $urlMailbox = urlencode($mailbox);
453 $msgs_url = $base_uri . 'src/';
455 // BEGIN NAV ROW - PREV/NEXT, DEL PREV/NEXT, LINKS TO INDEX, etc.
456 $nav_row = '<tr><td align="left" colspan="2" style="border: 1px solid '.$color[9].';"><small>';
458 // Create Prev & Next links
459 // Handle nested entities first (i.e. Mime Attach parts)
460 if (isset($passed_ent_id) && $passed_ent_id) {
461 // code for navigating through attached message/rfc822 messages
462 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
464 $entity_count = array();
467 foreach($message->parent
->entities
as $ent) {
468 if ($ent->type0
== 'message' && $ent->type1
== 'rfc822') {
470 $entity_count[$c] = $ent->entity_id
;
471 $entities[$ent->entity_id
] = $c;
475 $prev_link = _("Previous");
476 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
477 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
478 $prev_link = '<a href="'
479 . set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id)
480 . '">' . $prev_link . '</a>';
483 $next_link = _("Next");
484 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
485 $next_ent_id = $entity_count[$entities[$passed_ent_id] +
1];
486 $next_link = '<a href="'
487 . set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id)
488 . '">' . $next_link . '</a>';
491 $par_ent_id = $message->parent
->entity_id
;
494 $par_ent_id = substr($par_ent_id,0,-2);
495 if ( $par_ent_id != 0 ) {
496 $up_link = $topbar_delimiter;
497 $url = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
498 $up_link .= '<a href="'.$url.'">'._("Up").'</a>';
502 $nav_row .= $prev_link . $up_link . $topbar_delimiter . $next_link;
503 $nav_row .= $double_delimiter . '[<a href="'.$url.'">'._("View Message").'</a>]';
505 // Prev/Next links for regular messages
506 } else if ( true ) { //!(isset($where) && isset($what)) ) {
507 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
508 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
510 $prev_link = _("Previous");
512 $uri = $base_uri . 'src/read_body.php?passed_id='.$prev.
513 '&mailbox='.$urlMailbox.'&sort='.$sort.
514 "&where=$where&what=$what" .
515 '&startMessage='.$startMessage.'&show_more=0';
516 $prev_link = '<a href="'.$uri.'">'.$prev_link.'</a>';
519 $next_link = _("Next");
521 $uri = $base_uri . 'src/read_body.php?passed_id='.$next.
522 '&mailbox='.$urlMailbox.'&sort='.$sort.
523 "&where=$where&what=$what" .
524 '&startMessage='.$startMessage.'&show_more=0';
525 $next_link = '<a href="'.$uri.'">'.$next_link.'</a>';
528 // Only bother with Delete & Prev and Delete & Next IF
529 // top display is enabled.
530 if ( $delete_prev_next_display == 1 &&
531 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
532 $del_prev_link = _("Delete & Prev");
534 $uri = $base_uri . 'src/read_body.php?passed_id='.$prev.
535 '&mailbox='.$urlMailbox.'&sort='.$sort.
536 '&startMessage='.$startMessage.'&show_more=0'.
537 "&where=$where&what=$what" .
538 '&delete_id='.$passed_id;
539 $del_prev_link = '<a href="'.$uri.'">'.$del_prev_link.'</a>';
542 $del_next_link = _("Delete & Next");
544 $uri = $base_uri . 'src/read_body.php?passed_id='.$next.
545 '&mailbox='.$urlMailbox.'&sort='.$sort.
546 '&startMessage='.$startMessage.'&show_more=0'.
547 "&where=$where&what=$what" .
548 '&delete_id='.$passed_id;
549 $del_next_link = '<a href="'.$uri.'">'.$del_next_link.'</a>';
553 $nav_row .= '['.$prev_link.$topbar_delimiter.$next_link.']';
554 if ( isset($del_prev_link) && isset($del_next_link) )
555 $nav_row .= $double_delimiter.'['.$del_prev_link.$topbar_delimiter.$del_next_link.']';
558 // Start with Search Results or Message List link.
559 $msgs_url .= "$where?where=read_body.php&what=$what&mailbox=" . $urlMailbox.
560 "&startMessage=$startMessage";
561 if ($where == 'search.php') {
562 $msgs_str = _("Search Results");
564 $msgs_str = _("Message List");
566 $nav_row .= $double_delimiter .
567 '[<a href="' . $msgs_url . '">' . $msgs_str . '</a>]';
569 $nav_row .= '</small></td></tr>';
572 // BEGIN MENU ROW - DELETE/REPLY/FORWARD/MOVE/etc.
573 $menu_row = '<tr bgcolor="'.$color[0].'"><td><small>';
574 $comp_uri = $base_uri.'src/compose.php' .
575 '?passed_id=' . $passed_id .
576 '&mailbox=' . $urlMailbox .
577 '&startMessage=' . $startMessage .
578 (isset($passed_ent_id) ?
'&passed_ent_id='.$passed_ent_id : '');
580 // Start form for reply/reply all/forward..
583 $method='method="post" ';
585 if ($compose_new_win == '1') {
586 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
587 $compose_width = '640';
589 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
590 $compose_height = '550';
592 if ( $javascript_on ) {
593 $on_click=' onclick="comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')"';
594 $comp_uri = 'javascript:void(0)';
595 $method='method="get" ';
596 $onsubmit = 'onsubmit="return false" ';
598 $target = 'target="_blank"';
602 $menu_row .= "\n".'<form name="composeForm" action="'.$comp_uri.'" '
603 . $method.$target.$onsubmit.' style="display: inline">'."\n";
605 // If Draft folder - create Resume link
606 if (($mailbox == $draft_folder) && ($save_as_draft)) {
607 $new_button = 'smaction_draft';
608 $comp_alt_string = _("Resume Draft");
609 } else if (handleAsSent($mailbox)) {
610 // If in Sent folder, edit as new
611 $new_button = 'smaction_edit_new';
612 $comp_alt_string = _("Edit Message as New");
614 // Show Alt URI for Draft/Sent
615 if (isset($comp_alt_string))
616 $menu_row .= getButton('submit', $new_button, $comp_alt_string, $on_click) . "\n";
618 $menu_row .= getButton('submit', 'smaction_reply', _("Reply"), $on_click) . "\n";
619 $menu_row .= getButton('submit', 'smaction_reply_all', _("Reply All"), $on_click) ."\n";
620 $menu_row .= getButton('submit', 'smaction_forward', _("Forward"), $on_click);
621 if ($enable_forward_as_attachment)
622 $menu_row .= '<input type="checkbox" name="smaction_attache" />' . _("As Attachment") .' '."\n";
624 $menu_row .= '</form> ';
626 if ( in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
627 // Form for deletion. Form is handled by the originating display in $where. This is right_main.php or search.php
628 $delete_url = $base_uri . "src/$where";
629 $menu_row .= '<form name="deleteMessageForm" action="'.$delete_url.'" method="post" style="display: inline">';
631 if (!(isset($passed_ent_id) && $passed_ent_id)) {
632 $menu_row .= addHidden('mailbox', $aMailbox['NAME']);
633 $menu_row .= addHidden('msg[0]', $passed_id);
634 $menu_row .= addHidden('startMessage', $startMessage);
635 $menu_row .= getButton('submit', 'delete', _("Delete"));
636 $menu_row .= '<input type="checkbox" name="bypass_trash" />' . _("Bypass Trash");
638 $menu_row .= getButton('submit', 'delete', _("Delete"), '', FALSE) . "\n"; // delete button is disabled
641 $menu_row .= '</form>';
645 $menu_row .= '</small></td><td align="right">';
646 if ( !(isset($passed_ent_id) && $passed_ent_id) &&
647 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
649 $menu_row .= '<form name="moveMessageForm" action="'.$base_uri.'src/'.$where.'?'.'" method="post" style="display: inline">'.
652 addHidden('mailbox',$aMailbox['NAME']) .
653 addHidden('msg[0]', $passed_id) . _("Move to:") .
654 '<select name="targetMailbox" style="padding: 0px; margin: 0px">';
656 if (isset($lastTargetMailbox) && !empty($lastTargetMailbox)) {
657 $menu_row .= sqimap_mailbox_option_list($imapConnection, array(strtolower($lastTargetMailbox)));
659 $menu_row .= sqimap_mailbox_option_list($imapConnection);
661 $menu_row .= '</select> ';
663 $menu_row .= getButton('submit', 'moveButton',_("Move")) . "\n" . '</form>';
665 $menu_row .= '</td></tr>';
667 // echo rows, with hooks
668 $ret = do_hook_function('read_body_menu_top', array($nav_row, $menu_row));
669 if (is_array($ret)) {
670 if (isset($ret[0]) && !empty($ret[0])) {
673 if (isset($ret[1]) && !empty($ret[1])) {
677 echo '<table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
678 echo $nav_on_top ?
$nav_row . $menu_row : $menu_row . $nav_row;
679 echo '</table>'."\n";
680 do_hook('read_body_menu_bottom');
683 function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
684 global $base_uri, $where, $what, $download_and_unsafe_link;
686 $urlMailbox = urlencode($mailbox);
687 $urlPassed_id = urlencode($passed_id);
688 $urlPassed_ent_id = urlencode($passed_ent_id);
690 $query_string = 'mailbox=' . $urlMailbox . '&passed_id=' . $urlPassed_id . '&passed_ent_id=' . $urlPassed_ent_id;
692 if (!empty($where)) {
693 $query_string .= '&where=' . urlencode($where);
697 $query_string .= '&what=' . urlencode($what);
700 $url = $base_uri.'src/view_header.php?'.$query_string;
703 html_tag( 'td', '', 'right', '', 'valign="middle" width="20%"' ) . '<b>' . _("Options") . ": </b></td>\n" .
704 html_tag( 'td', '', 'left', '', 'valign="middle" width="80%"' ) . '<small>' .
705 '<a href="'.$url.'">'._("View Full Header").'</a>';
707 /* Output the printer friendly link if we are in subtle mode. */
708 $s .= ' | ' .
709 printer_friendly_link($mailbox, $passed_id, $passed_ent_id);
712 /* Output the download and/or unsafe images link/-s, if any. */
713 if ($download_and_unsafe_link) {
714 echo $download_and_unsafe_link;
717 do_hook("read_body_header_right");
718 $s = "</small></td>\n" .
727 * @deprecated see form functions available in 1.5.1 and 1.4.3.
728 * @param string $type
729 * @param string $name
730 * @param string $value
732 * @param bool $enabled
734 function getButton($type, $name, $value, $js = '', $enabled = TRUE) {
735 $disabled = ( $enabled ?
'' : 'disabled ' );
736 $js = ( $js ?
$js.' ' : '' );
737 return '<input '.$disabled.$js.
741 '" style="padding: 0px; margin: 0px" />';
745 /***************************/
746 /* Main of read_body.php */
747 /***************************/
749 /* get the globals we may need */
751 sqgetGlobalVar('key', $key, SQ_COOKIE
);
752 sqgetGlobalVar('username', $username, SQ_SESSION
);
753 sqgetGlobalVar('onetimepad',$onetimepad, SQ_SESSION
);
754 sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION
);
755 sqgetGlobalVar('base_uri', $base_uri, SQ_SESSION
);
756 sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION
);
757 if (!sqgetGlobalVar('messages', $messages, SQ_SESSION
) ) {
762 sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET
);
763 if (!sqgetGlobalVar('where', $where, SQ_GET
) ) {
764 $where = 'right_main.php';
767 * Used as entry key to the list of uid's cached in the mailbox cache
768 * we use the cached uid's to get the next and prev message.
770 if (!sqgetGlobalVar('what', $what, SQ_GET
) ){
773 if ( sqgetGlobalVar('show_more', $temp, SQ_GET
) ) {
774 $show_more = (int) $temp;
776 if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET
) ) {
777 $show_more_cc = (int) $temp;
779 if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET
) ) {
780 $show_more_bcc = (int) $temp;
782 if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET
) ) {
783 $view_hdr = (int) $temp;
786 if ( sqgetGlobalVar('account', $temp, SQ_GET
) ) {
787 $iAccount = (int) $temp;
793 sqgetGlobalVar('passed_ent_id', $passed_ent_id);
794 sqgetGlobalVar('mailbox', $mailbox);
796 if ( sqgetGlobalVar('passed_id', $temp) ) {
797 $passed_id = (int) $temp;
799 if ( sqgetGlobalVar('sort', $temp) ) {
802 if ( sqgetGlobalVar('startMessage', $temp) ) {
803 $startMessage = (int) $temp;
808 * Retrieve mailbox cache
810 sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION
);
812 /* end of get globals */
813 global $sqimap_capabilities, $lastTargetMailbox;
815 $imapConnection = sqimap_login($username, $key, $imapServerAddress, $imapPort, 0);
816 $aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
820 Start code to set the columns to fetch in case of hitting the next/prev link
821 The reason for this is the fact that the cache can be invalidated which means that the headers
822 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
824 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
828 * Replace From => To in case it concerns a draft or sent folder
830 if (($mailbox == $sent_folder ||
$mailbox == $draft_folder) &&
831 !in_array(SQM_COL_TO
,$index_order)) {
832 $aNewOrder = array(); // nice var name ;)
833 foreach($index_order as $iCol) {
834 if ($iCol == SQM_COL_FROM
) {
837 $aNewOrder[] = $iCol;
839 $aColumns = $aNewOrder;
841 $aColumns = $index_order;
845 'columns' => $aColumns, // columns bound settings
847 'highlight_list' => $message_highlight_list, // row highlighting rules
848 'trash_folder' => $trash_folder,
849 'sent_folder' => $sent_folder,
850 'draft_folder' => $draft_folder));
852 calcFetchColumns($aMailbox,$aProps);
855 End code to set the columns to fetch in case of hitting the next/prev link
861 * Check if cache is still valid, $what contains the key
862 * which gives us acces to the array with uid's. At this moment
863 * 0 is used for a normal message list and search uses 1 as key. This can be
864 * changed / extended in the future.
865 * If on a select of a mailbox we detect that the cache should be invalidated due to
866 * the delete of messages or due to new messages we empty the list with uid's and
867 * that's what we detect below.
869 if (!is_array($aMailbox['UIDSET'][$what])) {
870 fetchMessageHeaders($imapConnection, $aMailbox);
873 $iSetIndex = $aMailbox['SETINDEX'];
874 $aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
877 * Update the seen state
878 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
880 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
881 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
885 * Process Delete from delete-move-next
886 * but only if delete_id was set
888 if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET
) ) {
889 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
893 * $message contains all information about the message
894 * including header and body
897 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
898 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
899 $FirstTimeSee = !$message->is_seen
;
901 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
902 $FirstTimeSee = !$message->is_seen
;
903 $message->is_seen
= true;
904 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
907 if (isset($passed_ent_id) && $passed_ent_id) {
908 $message = $message->getEntity($passed_ent_id);
909 if ($message->type0
!= 'message' && $message->type1
!= 'rfc822') {
910 $message = $message->parent
;
912 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
913 $rfc822_header = new Rfc822Header();
914 $rfc822_header->parseHeader($read);
915 $message->rfc822_header
= $rfc822_header;
916 } else if ($message->type0
== 'message' && $message->type1
== 'rfc822' && isset($message->entities
[0])) {
917 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
918 $rfc822_header = new Rfc822Header();
919 $rfc822_header->parseHeader($read);
920 $message->rfc822_header
= $rfc822_header;
924 $header = $message->header
;
926 $header = $message->header
;
929 /****************************************/
930 /* Block for handling incoming url vars */
931 /****************************************/
933 if (isset($sendreceipt)) {
934 if ( !$message->is_mdnsent
) {
935 $final_recipient = '';
936 if ((isset($identity)) && ($identity != 0)) //Main identity
937 $final_recipient = trim(getPref($data_dir, $username, 'email_address' . $identity, '' ));
938 if ($final_recipient == '' )
939 $final_recipient = trim(getPref($data_dir, $username, 'email_address', '' ));
940 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
941 if ( SendMDN( $mailbox, $passed_id, $final_recipient, $message, $imapConnection ) > 0 && $supportMDN ) {
942 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
943 $message->is_mdnsent
= true;
944 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
948 /***********************************************/
949 /* End of block for handling incoming url vars */
950 /***********************************************/
955 do_hook('read_body_top');
956 if ($show_html_default == 1) {
957 $ent_ar = $message->findDisplayEntity(array());
959 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
961 $cnt = count($ent_ar);
962 for ($i = 0; $i < $cnt; $i++
) {
963 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
965 $messagebody .= '<hr style="height: 1px;" />';
969 displayPageHeader($color, $mailbox,'','');
970 formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
971 formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
972 echo '<table width="100%" cellpadding="0" cellspacing="0" align="center" border="0">';
974 echo ' <table width="100%" cellpadding="1" cellspacing="0" align="center" border="0" bgcolor="'.$color[9].'">';
976 echo ' <table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
977 echo ' <tr bgcolor="'.$color[4].'"><td>';
978 // echo ' <table cellpadding="1" cellspacing="5" align="left" border="0">';
979 echo html_tag( 'table' ,'' , 'left', '', 'width="100%" cellpadding="1" cellspacing="5" border="0"' );
980 echo ' <tr>' . html_tag( 'td', '<br />'. $messagebody."\n", 'left')
984 echo ' </table></td></tr>';
988 echo '<tr><td height="5" colspan="2" bgcolor="'.
989 $color[4].'"></td></tr>'."\n";
991 $attachmentsdisplay = formatAttachments($message,$ent_ar,$mailbox, $passed_id);
992 if ($attachmentsdisplay) {
994 echo ' <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">';
996 echo ' <table width="100%" cellpadding="0" cellspacing="0" align="center" border="0" bgcolor="'.$color[4].'">';
997 echo ' <tr>' . html_tag( 'td', '', 'left', $color[9] );
998 echo ' <b>' . _("Attachments") . ':</b>';
1001 echo ' <table width="100%" cellpadding="2" cellspacing="2" align="center"'.' border="0" bgcolor="'.$color[0].'"><tr><td>';
1002 echo $attachmentsdisplay;
1003 echo ' </td></tr></table>';
1004 echo ' </td></tr></table>';
1006 echo '<tr><td height="5" colspan="2" bgcolor="'.
1007 $color[4].'"></td></tr>';
1011 /* show attached images inline -- if pref'fed so */
1012 if (($attachment_common_show_images) &&
1013 is_array($attachment_common_show_images_list)) {
1014 foreach ($attachment_common_show_images_list as $img) {
1015 $imgurl = SM_PATH
. 'src/download.php' .
1017 'passed_id=' . urlencode($img['passed_id']) .
1018 '&mailbox=' . urlencode($mailbox) .
1019 '&ent_id=' . urlencode($img['ent_id']) .
1020 '&absolute_dl=true';
1022 echo html_tag( 'table', "\n" .
1023 html_tag( 'tr', "\n" .
1024 html_tag( 'td', '<img src="' . $imgurl . '" />' ."\n", 'left'
1027 'center', '', 'cellspacing="0" border="0" cellpadding="2"');
1031 formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1033 do_hook('read_body_bottom');
1034 sqimap_logout($imapConnection);
1037 * Write mailbox with updated seen flag information back to cache.
1039 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
1040 sqsession_register($mailbox_cache,'mailbox_cache');
1041 $oTemplate->display('footer.tpl');