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 * Include the SquirrelMail initialization file.
18 require('../include/init.php');
20 /* SquirrelMail required files. */
23 require_once(SM_PATH
. 'functions/imap.php');
24 require_once(SM_PATH
. 'functions/imap_asearch.php'); // => move to mailbox_display
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/identity.php');
29 require_once(SM_PATH
. 'functions/arrays.php');
30 require_once(SM_PATH
. 'functions/mailbox_display.php');
31 require_once(SM_PATH
. 'functions/forms.php');
32 require_once(SM_PATH
. 'functions/attachment_common.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 view_as_html_link($mailbox, $passed_id, $passed_ent_id, $message) {
119 global $base_uri, $show_html_default;
122 if ($message->header
->type0
== 'message' && $message->header
->type1
== 'rfc822') {
123 $type0 = $message->rfc822_header
->content_type
->type0
;
124 $type1 = $message->rfc822_header
->content_type
->type1
;
126 $type0 = $message->header
->type0
;
127 $type1 = $message->header
->type1
;
129 if($type0 == 'multipart' &&
130 ($type1 == 'alternative' ||
$type1 == 'mixed' ||
$type1 == 'related')) {
131 if ($message->findDisplayEntity(array(), array('text/html'), true)) {
136 * Normal single part message so check its type.
139 if($type0 == 'text' && $type1 == 'html') {
143 if($has_html == true) {
144 $vars = array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage','where', 'what');
146 $new_link = $base_uri . 'src/read_body.php?passed_id=' . urlencode($passed_id) .
147 '&passed_ent_id=' . urlencode($passed_ent_id) .
148 '&mailbox=' . urlencode($mailbox);
149 foreach($vars as $var) {
150 if(sqgetGlobalVar($var, $temp)) {
151 $new_link .= '&' . $var . '=' . urlencode($temp);
155 if($show_html_default == 1) {
156 $new_link .= '&show_html_default=0';
157 $link = _("View as plain text");
159 $new_link .= '&show_html_default=1';
160 $link = _("View as HTML");
162 return ' | <a href="' . $new_link . '">' . $link . '</a>';
167 function ServerMDNSupport($aFlags) {
168 /* escaping $ doesn't work -> \x36 */
169 return ( in_array('$mdnsent',$aFlags,true) ||
170 in_array('\\*',$aFlags,true) ) ;
173 function SendMDN ( $mailbox, $passed_id, $sender, $message, $imapConnection) {
174 global $username, $attachment_dir, $popuser, $username, $color,
175 $version, $squirrelmail_language, $default_charset,
176 $languages, $useSendmail, $domain, $sent_folder;
178 sqgetGlobalVar('SERVER_NAME', $SERVER_NAME, SQ_SERVER
);
180 $header = $message->rfc822_header
;
182 $rfc822_header = new Rfc822Header();
183 $content_type = new ContentType('multipart/report');
184 $content_type->properties
['report-type']='disposition-notification';
187 if ($default_charset) {
188 $content_type->properties
['charset']=$default_charset;
190 $rfc822_header->content_type
= $content_type;
191 $rfc822_header->to
[] = $header->dnt
;
192 $rfc822_header->subject
= _("Read:") . ' ' . encodeHeader($header->subject
);
194 // Patch #793504 Return Receipt Failing with <@> from Tim Craig (burny_md)
195 // This merely comes from compose.php and only happens when there is no
196 // email_addr specified in user's identity (which is the startup config)
197 if (ereg("^([^@%/]+)[@%/](.+)$", $username, $usernamedata)) {
198 $popuser = $usernamedata[1];
199 $domain = $usernamedata[2];
200 unset($usernamedata);
202 $popuser = $username;
206 $ident = get_identities();
207 if(!isset($identity)) $identity = 0;
208 $full_name = $ident[$identity]['full_name'];
209 $from_mail = $ident[$identity]['email_address'];
210 $from_addr = '"'.$full_name.'" <'.$from_mail.'>';
211 $reply_to = $ident[$identity]['reply_to'];
214 $from_mail = "$popuser@$domain";
215 $from_addr = $from_mail;
217 $rfc822_header->from
= $rfc822_header->parseAddress($from_addr,true);
219 $rfc822_header->reply_to
= $rfc822_header->parseAddress($reply_to,true);
223 $senton = getLongDateString( $header->date
);
224 $to_array = $header->to
;
226 foreach ($to_array as $line) {
227 $to .= ' '.$line->getAddress();
229 $now = getLongDateString( time() );
231 $body = _("Your message") . "\r\n\r\n" .
232 "\t" . _("To") . ': ' . decodeHeader($to,false,false) . "\r\n" .
233 "\t" . _("Subject") . ': ' . decodeHeader($header->subject
,false,false) . "\r\n" .
234 "\t" . _("Sent") . ': ' . $senton . "\r\n" .
236 sprintf( _("Was displayed on %s"), $now );
238 $special_encoding = '';
239 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
240 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
241 $body = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $body);
242 if (strtolower($default_charset) == 'iso-2022-jp') {
243 if (mb_detect_encoding($body) == 'ASCII') {
244 $special_encoding = '8bit';
246 $body = mb_convert_encoding($body, 'JIS');
247 $special_encoding = '7bit';
250 } elseif (sq_is8bit($body)) {
251 $special_encoding = '8bit';
253 $part1 = new Message();
254 $part1->setBody($body);
255 $mime_header = new MessageHeader
;
256 $mime_header->type0
= 'text';
257 $mime_header->type1
= 'plain';
258 if ($special_encoding) {
259 $mime_header->encoding
= $special_encoding;
261 $mime_header->encoding
= 'us-ascii';
263 if ($default_charset) {
264 $mime_header->parameters
['charset'] = $default_charset;
266 $part1->mime_header
= $mime_header;
269 $original_recipient = $to;
270 $original_message_id = $header->message_id
;
272 $report = "Reporting-UA : $SERVER_NAME ; SquirrelMail (version $version) \r\n";
273 if ($original_recipient != '') {
274 $report .= "Original-Recipient : $original_recipient\r\n";
276 $final_recipient = $sender;
277 $report .= "Final-Recipient: rfc822; $final_recipient\r\n" .
278 "Original-Message-ID : $original_message_id\r\n" .
279 "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
281 $part2 = new Message();
282 $part2->setBody($report);
283 $mime_header = new MessageHeader
;
284 $mime_header->type0
= 'message';
285 $mime_header->type1
= 'disposition-notification';
286 $mime_header->encoding
= 'us-ascii';
287 $part2->mime_header
= $mime_header;
289 $composeMessage = new Message();
290 $composeMessage->rfc822_header
= $rfc822_header;
291 $composeMessage->addEntity($part1);
292 $composeMessage->addEntity($part2);
296 require_once(SM_PATH
. 'class/deliver/Deliver_SendMail.class.php');
297 global $sendmail_path;
298 $deliver = new Deliver_SendMail();
299 $stream = $deliver->initStream($composeMessage,$sendmail_path);
301 require_once(SM_PATH
. 'class/deliver/Deliver_SMTP.class.php');
302 $deliver = new Deliver_SMTP();
303 global $smtpServerAddress, $smtpPort, $pop_before_smtp;
304 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ?
true : false;
305 get_smtp_user($user, $pass);
306 $stream = $deliver->initStream($composeMessage,$domain,0,
307 $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
311 $length = $deliver->mail($composeMessage, $stream);
312 $success = $deliver->finalizeStream($stream);
315 $msg = $deliver->dlv_msg
;
316 if (! empty($deliver->dlv_server_msg
)) {
318 _("Server replied:") . ' ' . $deliver->dlv_ret_nr
. ' ' .
319 nl2br(htmlspecialchars($deliver->dlv_server_msg
));
321 plain_error_message($msg, $color);
324 if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
325 $sid = sqimap_append ($imapConnection, $sent_folder, $length);
326 require_once(SM_PATH
. 'class/deliver/Deliver_IMAP.class.php');
327 $imap_deliver = new Deliver_IMAP();
328 $imap_deliver->mail($composeMessage, $imapConnection);
329 sqimap_append_done ($imapConnection, $sent_folder);
330 unset ($imap_deliver);
336 function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
338 $cmd = 'STORE ' . $passed_id . ' ' . $sg . 'FLAGS ($MDNSent)';
339 $read = sqimap_run_command ($imapConnection, $cmd, true, $response,
343 function formatRecipientString($recipients, $item ) {
344 global $show_more_cc, $show_more, $show_more_bcc,
348 if ((is_array($recipients)) && (isset($recipients[0]))) {
354 $url = set_url_var($PHP_SELF, 'show_more',0);
356 $url = set_url_var($PHP_SELF, 'show_more',1);
358 } else if ($item == 'cc') {
361 $url = set_url_var($PHP_SELF, 'show_more_cc',0);
363 $url = set_url_var($PHP_SELF, 'show_more_cc',1);
365 } else if ($item == 'bcc') {
366 if ($show_more_bcc) {
368 $url = set_url_var($PHP_SELF, 'show_more_bcc',0);
370 $url = set_url_var($PHP_SELF, 'show_more_bcc',1);
374 $cnt = count($recipients);
375 foreach($recipients as $r) {
376 $add = decodeHeader($r->getAddress(true));
378 $string .= '<br />' . $add;
382 $string .= ' (<a href="'.$url;
384 $string .= '">'._("less").'</a>)';
386 $string .= '">'._("more").'</a>)';
396 function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
397 $color, $FirstTimeSee) {
398 global $default_use_mdn, $default_use_priority,
399 $show_xmailer_default, $mdn_user_support, $PHP_SELF, $javascript_on,
400 $squirrelmail_language;
402 $mailbox = $aMailbox['NAME'];
404 $header = $message->rfc822_header
;
406 $env[_("Subject")] = str_replace(" "," ",decodeHeader($header->subject
));
408 $from_name = $header->getAddr_s('from');
410 $from_name = $header->getAddr_s('sender');
412 $env[_("From")] = _("Unknown sender");
414 $env[_("From")] = decodeHeader($from_name);
415 $env[_("Date")] = getLongDateString($header->date
);
416 $env[_("To")] = formatRecipientString($header->to
, "to");
417 $env[_("Cc")] = formatRecipientString($header->cc
, "cc");
418 $env[_("Bcc")] = formatRecipientString($header->bcc
, "bcc");
419 if ($default_use_priority) {
420 $env[_("Priority")] = htmlspecialchars(getPriorityStr($header->priority
));
422 if ($show_xmailer_default) {
423 $env[_("Mailer")] = decodeHeader($header->xmailer
);
425 if ($default_use_mdn) {
426 if ($mdn_user_support) {
428 if ($message->is_mdnsent
) {
429 $env[_("Read receipt")] = _("sent");
431 $env[_("Read receipt")] = _("requested");
432 if (!(handleAsSent($mailbox) ||
433 $message->is_deleted ||
435 $mdn_url = $PHP_SELF . '&sendreceipt=1';
436 if ($FirstTimeSee && $javascript_on) {
437 $script = '<script type="text/javascript">' . "\n";
438 $script .= '<!--'. "\n";
439 $script .= 'if(window.confirm("' .
440 _("The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?") .
444 $script .= '// -->'. "\n";
445 $script .= '</script>'. "\n";
448 $env[_("Read receipt")] .= ' <a href="' . $mdn_url . '">[' .
449 _("Send read receipt now") . ']</a>';
456 $s = '<table width="100%" cellpadding="0" cellspacing="2" border="0"';
457 $s .= ' align="center" bgcolor="'.$color[0].'">';
458 foreach ($env as $key => $val) {
461 $s .= html_tag('td', '<b>' . $key . ': </b>', 'right', '', 'valign="top" width="20%"') . "\n";
462 $s .= html_tag('td', $val, 'left', '', 'valign="top" width="80%"') . "\n";
466 echo '<table bgcolor="'.$color[9].'" width="100%" cellpadding="1"'.
467 ' cellspacing="0" border="0" align="center">'."\n";
468 echo '<tr><td height="5" colspan="2" bgcolor="'.
469 $color[4].'"></td></tr><tr><td align="center">'."\n";
471 do_hook('read_body_header');
472 formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
474 echo '</td></tr><tr><td height="5" colspan="2" bgcolor="'.$color[4].'"></td></tr>'."\n";
479 * Format message toolbar
481 * @param string $mailbox Name of current mailbox
482 * @param int $passed_id UID of current message
483 * @param int $passed_ent_id Id of entity within message
484 * @param object $message Current message object
485 * @param object $mbx_response
487 function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
488 global $base_uri, $draft_folder, $where, $what, $color, $sort,
489 $startMessage, $PHP_SELF, $save_as_draft,
490 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
491 $username, $delete_prev_next_display,
492 $compose_new_win, $javascript_on, $compose_width, $compose_height;
494 //FIXME cleanup argument list, use $aMailbox where possible
495 $mailbox = $aMailbox['NAME'];
497 $topbar_delimiter = ' | ';
498 $double_delimiter = ' ';
499 $urlMailbox = urlencode($mailbox);
501 $msgs_url = $base_uri . 'src/';
503 // BEGIN NAV ROW - PREV/NEXT, DEL PREV/NEXT, LINKS TO INDEX, etc.
504 $nav_row = '<tr><td align="left" colspan="2" style="border: 1px solid '.$color[9].';"><small>';
506 // Create Prev & Next links
507 // Handle nested entities first (i.e. Mime Attach parts)
508 if (isset($passed_ent_id) && $passed_ent_id) {
509 // code for navigating through attached message/rfc822 messages
510 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
512 $entity_count = array();
515 foreach($message->parent
->entities
as $ent) {
516 if ($ent->type0
== 'message' && $ent->type1
== 'rfc822') {
518 $entity_count[$c] = $ent->entity_id
;
519 $entities[$ent->entity_id
] = $c;
523 $prev_link = _("Previous");
524 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
525 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
526 $prev_link = '<a href="'
527 . set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id)
528 . '">' . $prev_link . '</a>';
531 $next_link = _("Next");
532 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
533 $next_ent_id = $entity_count[$entities[$passed_ent_id] +
1];
534 $next_link = '<a href="'
535 . set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id)
536 . '">' . $next_link . '</a>';
539 $par_ent_id = $message->parent
->entity_id
;
542 $par_ent_id = substr($par_ent_id,0,-2);
543 if ( $par_ent_id != 0 ) {
544 $up_link = $topbar_delimiter;
545 $url = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
546 $up_link .= '<a href="'.$url.'">'._("Up").'</a>';
550 $nav_row .= $prev_link . $up_link . $topbar_delimiter . $next_link;
551 $nav_row .= $double_delimiter . '[<a href="'.$url.'">'._("View Message").'</a>]';
553 // Prev/Next links for regular messages
554 } else if ( true ) { //!(isset($where) && isset($what)) ) {
555 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
556 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
558 $prev_link = _("Previous");
560 $uri = $base_uri . 'src/read_body.php?passed_id='.$prev.
561 '&mailbox='.$urlMailbox.'&sort='.$sort.
562 "&where=$where&what=$what" .
563 '&startMessage='.$startMessage.'&show_more=0';
564 $prev_link = '<a href="'.$uri.'">'.$prev_link.'</a>';
567 $next_link = _("Next");
569 $uri = $base_uri . 'src/read_body.php?passed_id='.$next.
570 '&mailbox='.$urlMailbox.'&sort='.$sort.
571 "&where=$where&what=$what" .
572 '&startMessage='.$startMessage.'&show_more=0';
573 $next_link = '<a href="'.$uri.'">'.$next_link.'</a>';
576 // Only bother with Delete & Prev and Delete & Next IF
577 // top display is enabled.
578 if ( $delete_prev_next_display == 1 &&
579 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
580 $del_prev_link = _("Delete & Prev");
582 $uri = $base_uri . 'src/read_body.php?passed_id='.$prev.
583 '&mailbox='.$urlMailbox.'&sort='.$sort.
584 '&startMessage='.$startMessage.'&show_more=0'.
585 "&where=$where&what=$what" .
586 '&delete_id='.$passed_id;
587 $del_prev_link = '<a href="'.$uri.'">'.$del_prev_link.'</a>';
590 $del_next_link = _("Delete & Next");
592 $uri = $base_uri . 'src/read_body.php?passed_id='.$next.
593 '&mailbox='.$urlMailbox.'&sort='.$sort.
594 '&startMessage='.$startMessage.'&show_more=0'.
595 "&where=$where&what=$what" .
596 '&delete_id='.$passed_id;
597 $del_next_link = '<a href="'.$uri.'">'.$del_next_link.'</a>';
601 $nav_row .= '['.$prev_link.$topbar_delimiter.$next_link.']';
602 if ( isset($del_prev_link) && isset($del_next_link) )
603 $nav_row .= $double_delimiter.'['.$del_prev_link.$topbar_delimiter.$del_next_link.']';
606 // Start with Search Results or Message List link.
607 $msgs_url .= "$where?where=read_body.php&what=$what&mailbox=" . $urlMailbox.
608 "&startMessage=$startMessage";
609 if ($where == 'search.php') {
610 $msgs_str = _("Search Results");
612 $msgs_str = _("Message List");
614 $nav_row .= $double_delimiter .
615 '[<a href="' . $msgs_url . '">' . $msgs_str . '</a>]';
617 $nav_row .= '</small></td></tr>';
620 // BEGIN MENU ROW - DELETE/REPLY/FORWARD/MOVE/etc.
621 $menu_row = '<tr bgcolor="'.$color[0].'"><td><small>';
622 $comp_uri = $base_uri.'src/compose.php' .
623 '?passed_id=' . $passed_id .
624 '&mailbox=' . $urlMailbox .
625 '&startMessage=' . $startMessage .
626 (isset($passed_ent_id) ?
'&passed_ent_id='.$passed_ent_id : '');
628 // Start form for reply/reply all/forward..
631 $method='method="post" ';
633 if ($compose_new_win == '1') {
634 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
635 $compose_width = '640';
637 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
638 $compose_height = '550';
640 if ( $javascript_on ) {
641 $on_click=' onclick="comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')"';
642 $comp_uri = 'javascript:void(0)';
643 $method='method="get" ';
644 $onsubmit = 'onsubmit="return false" ';
646 $target = 'target="_blank"';
650 $menu_row .= "\n".'<form name="composeForm" action="'.$comp_uri.'" '
651 . $method.$target.$onsubmit.' style="display: inline">'."\n";
653 // If Draft folder - create Resume link
654 if (($mailbox == $draft_folder) && ($save_as_draft)) {
655 $new_button = 'smaction_draft';
656 $comp_alt_string = _("Resume Draft");
657 } else if (handleAsSent($mailbox)) {
658 // If in Sent folder, edit as new
659 $new_button = 'smaction_edit_new';
660 $comp_alt_string = _("Edit Message as New");
662 // Show Alt URI for Draft/Sent
663 if (isset($comp_alt_string))
664 $menu_row .= getButton('submit', $new_button, $comp_alt_string, $on_click) . "\n";
666 $menu_row .= getButton('submit', 'smaction_reply', _("Reply"), $on_click) . "\n";
667 $menu_row .= getButton('submit', 'smaction_reply_all', _("Reply All"), $on_click) ."\n";
668 $menu_row .= getButton('submit', 'smaction_forward', _("Forward"), $on_click);
669 if ($enable_forward_as_attachment)
670 $menu_row .= '<input type="checkbox" name="smaction_attache" />' . _("As Attachment") .' '."\n";
672 $menu_row .= '</form> ';
674 if ( in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
675 // Form for deletion. Form is handled by the originating display in $where. This is right_main.php or search.php
676 $delete_url = $base_uri . "src/$where";
677 $menu_row .= '<form name="deleteMessageForm" action="'.$delete_url.'" method="post" style="display: inline">';
679 if (!(isset($passed_ent_id) && $passed_ent_id)) {
680 $menu_row .= addHidden('mailbox', $aMailbox['NAME']);
681 $menu_row .= addHidden('msg[0]', $passed_id);
682 $menu_row .= addHidden('startMessage', $startMessage);
683 $menu_row .= getButton('submit', 'delete', _("Delete"));
684 $menu_row .= '<input type="checkbox" name="bypass_trash" />' . _("Bypass Trash");
686 $menu_row .= getButton('submit', 'delete', _("Delete"), '', FALSE) . "\n"; // delete button is disabled
689 $menu_row .= '</form>';
693 $menu_row .= '</small></td><td align="right">';
694 if ( !(isset($passed_ent_id) && $passed_ent_id) &&
695 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
697 $menu_row .= '<form name="moveMessageForm" action="'.$base_uri.'src/'.$where.'?'.'" method="post" style="display: inline">'.
700 addHidden('mailbox',$aMailbox['NAME']) .
701 addHidden('msg[0]', $passed_id) . _("Move to:") .
702 '<select name="targetMailbox" style="padding: 0px; margin: 0px">';
704 if (isset($lastTargetMailbox) && !empty($lastTargetMailbox)) {
705 $menu_row .= sqimap_mailbox_option_list($imapConnection, array(strtolower($lastTargetMailbox)));
707 $menu_row .= sqimap_mailbox_option_list($imapConnection);
709 $menu_row .= '</select> ';
711 $menu_row .= getButton('submit', 'moveButton',_("Move")) . "\n" . '</form>';
713 $menu_row .= '</td></tr>';
715 // echo rows, with hooks
716 $ret = do_hook_function('read_body_menu_top', array($nav_row, $menu_row));
717 if (is_array($ret)) {
718 if (isset($ret[0]) && !empty($ret[0])) {
721 if (isset($ret[1]) && !empty($ret[1])) {
725 echo '<table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
726 echo $nav_on_top ?
$nav_row . $menu_row : $menu_row . $nav_row;
727 echo '</table>'."\n";
728 do_hook('read_body_menu_bottom');
731 function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
732 global $base_uri, $where, $what, $download_and_unsafe_link;
734 $urlMailbox = urlencode($mailbox);
735 $urlPassed_id = urlencode($passed_id);
736 $urlPassed_ent_id = urlencode($passed_ent_id);
738 $query_string = 'mailbox=' . $urlMailbox . '&passed_id=' . $urlPassed_id . '&passed_ent_id=' . $urlPassed_ent_id;
740 if (!empty($where)) {
741 $query_string .= '&where=' . urlencode($where);
745 $query_string .= '&what=' . urlencode($what);
748 $url = $base_uri.'src/view_header.php?'.$query_string;
751 html_tag( 'td', '', 'right', '', 'valign="middle" width="20%"' ) . '<b>' . _("Options") . ": </b></td>\n" .
752 html_tag( 'td', '', 'left', '', 'valign="middle" width="80%"' ) . '<small>' .
753 '<a href="'.$url.'">'._("View Full Header").'</a>';
755 /* Output the printer friendly link if we are in subtle mode. */
756 $s .= ' | ' .
757 printer_friendly_link($mailbox, $passed_id, $passed_ent_id);
759 echo view_as_html_link($mailbox, $passed_id, $passed_ent_id, $message);
761 /* Output the download and/or unsafe images link/-s, if any. */
762 if ($download_and_unsafe_link) {
763 echo $download_and_unsafe_link;
766 do_hook("read_body_header_right");
767 $s = "</small></td>\n" .
776 * @deprecated see form functions available in 1.5.1 and 1.4.3.
777 * @param string $type
778 * @param string $name
779 * @param string $value
781 * @param bool $enabled
783 function getButton($type, $name, $value, $js = '', $enabled = TRUE) {
784 $disabled = ( $enabled ?
'' : 'disabled ' );
785 $js = ( $js ?
$js.' ' : '' );
786 return '<input '.$disabled.$js.
790 '" style="padding: 0px; margin: 0px" />';
794 /***************************/
795 /* Main of read_body.php */
796 /***************************/
798 /* get the globals we may need */
800 sqgetGlobalVar('key', $key, SQ_COOKIE
);
801 sqgetGlobalVar('username', $username, SQ_SESSION
);
802 sqgetGlobalVar('onetimepad',$onetimepad, SQ_SESSION
);
803 sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION
);
804 sqgetGlobalVar('base_uri', $base_uri, SQ_SESSION
);
805 sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION
);
806 if (!sqgetGlobalVar('messages', $messages, SQ_SESSION
) ) {
809 sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION
);
810 if (is_array($delayed_errors)) {
811 $oErrorHandler->AssignDelayedErrors($delayed_errors);
812 sqsession_unregister("delayed_errors");
815 sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET
);
816 if (!sqgetGlobalVar('where', $where, SQ_GET
) ) {
817 $where = 'right_main.php';
820 * Used as entry key to the list of uid's cached in the mailbox cache
821 * we use the cached uid's to get the next and prev message.
823 if (!sqgetGlobalVar('what', $what, SQ_GET
) ){
826 if ( sqgetGlobalVar('show_more', $temp, SQ_GET
) ) {
827 $show_more = (int) $temp;
829 if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET
) ) {
830 $show_more_cc = (int) $temp;
832 if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET
) ) {
833 $show_more_bcc = (int) $temp;
835 if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET
) ) {
836 $view_hdr = (int) $temp;
839 if ( sqgetGlobalVar('account', $temp, SQ_GET
) ) {
840 $iAccount = (int) $temp;
846 sqgetGlobalVar('passed_ent_id', $passed_ent_id);
847 sqgetGlobalVar('mailbox', $mailbox);
849 if ( sqgetGlobalVar('passed_id', $temp) ) {
850 $passed_id = (int) $temp;
852 if ( sqgetGlobalVar('sort', $temp) ) {
855 if ( sqgetGlobalVar('startMessage', $temp) ) {
856 $startMessage = (int) $temp;
860 if(sqgetGlobalVar('show_html_default', $temp)) {
861 $show_html_default = (int) $temp;
864 if(sqgetGlobalVar('view_unsafe_images', $temp)) {
865 $view_unsafe_images = (int) $temp;
866 if($view_unsafe_images == 1) {
867 $show_html_default = 1;
870 $view_unsafe_images = 0;
873 * Retrieve mailbox cache
875 sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION
);
877 /* end of get globals */
878 global $sqimap_capabilities, $lastTargetMailbox;
880 $imapConnection = sqimap_login($username, $key, $imapServerAddress, $imapPort, 0);
881 $aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
885 Start code to set the columns to fetch in case of hitting the next/prev link
886 The reason for this is the fact that the cache can be invalidated which means that the headers
887 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
889 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
893 * Replace From => To in case it concerns a draft or sent folder
896 if (($mailbox == $sent_folder ||
$mailbox == $draft_folder) &&
897 !in_array(SQM_COL_TO
,$index_order)) {
898 $aNewOrder = array(); // nice var name ;)
899 foreach($index_order as $iCol) {
900 if ($iCol == SQM_COL_FROM
) {
903 $aColumns[$iCol] = array();
906 foreach ($index_order as $iCol) {
907 $aColumns[$iCol] = array();
912 'columns' => $aColumns, // columns bound settings
914 'highlight_list' => $message_highlight_list, // row highlighting rules
915 'trash_folder' => $trash_folder,
916 'sent_folder' => $sent_folder,
917 'draft_folder' => $draft_folder));
919 calcFetchColumns($aMailbox,$aProps);
922 End code to set the columns to fetch in case of hitting the next/prev link
928 * Check if cache is still valid, $what contains the key
929 * which gives us acces to the array with uid's. At this moment
930 * 0 is used for a normal message list and search uses 1 as key. This can be
931 * changed / extended in the future.
932 * If on a select of a mailbox we detect that the cache should be invalidated due to
933 * the delete of messages or due to new messages we empty the list with uid's and
934 * that's what we detect below.
936 if (!is_array($aMailbox['UIDSET'][$what])) {
937 fetchMessageHeaders($imapConnection, $aMailbox);
940 $iSetIndex = $aMailbox['SETINDEX'];
941 $aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
944 * Update the seen state
945 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
947 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
948 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
952 * Process Delete from delete-move-next
953 * but only if delete_id was set
955 if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET
) ) {
956 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
960 * $message contains all information about the message
961 * including header and body
964 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
965 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
966 $FirstTimeSee = !$message->is_seen
;
968 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
969 $FirstTimeSee = !$message->is_seen
;
970 $message->is_seen
= true;
971 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
973 if (isset($passed_ent_id) && $passed_ent_id) {
974 $message = $message->getEntity($passed_ent_id);
975 if ($message->type0
!= 'message' && $message->type1
!= 'rfc822') {
976 $message = $message->parent
;
978 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
979 $rfc822_header = new Rfc822Header();
980 $rfc822_header->parseHeader($read);
981 $message->rfc822_header
= $rfc822_header;
982 } else if ($message->type0
== 'message' && $message->type1
== 'rfc822' && isset($message->entities
[0])) {
983 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
984 $rfc822_header = new Rfc822Header();
985 $rfc822_header->parseHeader($read);
986 $message->rfc822_header
= $rfc822_header;
990 $header = $message->header
;
993 /****************************************/
994 /* Block for handling incoming url vars */
995 /****************************************/
997 if (isset($sendreceipt)) {
998 if ( !$message->is_mdnsent
) {
999 $final_recipient = '';
1000 if ((isset($identity)) && ($identity != 0)) //Main identity
1001 $final_recipient = trim(getPref($data_dir, $username, 'email_address' . $identity, '' ));
1002 if ($final_recipient == '' )
1003 $final_recipient = trim(getPref($data_dir, $username, 'email_address', '' ));
1004 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
1005 if ( SendMDN( $mailbox, $passed_id, $final_recipient, $message, $imapConnection ) > 0 && $supportMDN ) {
1006 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
1007 $message->is_mdnsent
= true;
1008 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
1012 /***********************************************/
1013 /* End of block for handling incoming url vars */
1014 /***********************************************/
1017 do_hook('read_body_top');
1018 if ($show_html_default == 1) {
1019 $ent_ar = $message->findDisplayEntity(array());
1021 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
1023 $cnt = count($ent_ar);
1024 for ($i = 0; $i < $cnt; $i++
) {
1025 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
1027 $messagebody .= '<hr style="height: 1px;" />';
1032 * Write mailbox with updated seen flag information back to cache.
1034 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
1035 sqsession_register($mailbox_cache,'mailbox_cache');
1036 $_SESSION['mailbox_cache'] = $mailbox_cache;
1037 $oTemplate->display('footer.tpl');
1039 displayPageHeader($color, $mailbox,'','');
1040 formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
1041 formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
1042 echo '<table width="100%" cellpadding="0" cellspacing="0" align="center" border="0">';
1044 echo ' <table width="100%" cellpadding="1" cellspacing="0" align="center" border="0" bgcolor="'.$color[9].'">';
1046 echo ' <table width="100%" cellpadding="3" cellspacing="0" align="center" border="0">';
1047 echo ' <tr bgcolor="'.$color[4].'"><td>';
1048 // echo ' <table cellpadding="1" cellspacing="5" align="left" border="0">';
1049 echo html_tag( 'table' ,'' , 'left', '', 'width="100%" cellpadding="1" cellspacing="5" border="0"' );
1050 echo ' <tr>' . html_tag( 'td', '<br />'. $messagebody."\n", 'left')
1054 echo ' </table></td></tr>';
1058 echo '<tr><td height="5" colspan="2" bgcolor="'.
1059 $color[4].'"></td></tr>'."\n";
1061 $attachmentsdisplay = formatAttachments($message,$ent_ar,$mailbox, $passed_id);
1062 if ($attachmentsdisplay) {
1064 echo ' <table width="100%" cellpadding="1" cellspacing="0" align="center"'.' border="0" bgcolor="'.$color[9].'">';
1066 echo ' <table width="100%" cellpadding="0" cellspacing="0" align="center" border="0" bgcolor="'.$color[4].'">';
1067 echo ' <tr>' . html_tag( 'td', '', 'left', $color[9] );
1068 echo ' <b>' . _("Attachments") . ':</b>';
1071 echo ' <table width="100%" cellpadding="2" cellspacing="2" align="center"'.' border="0" bgcolor="'.$color[0].'"><tr><td>';
1072 echo $attachmentsdisplay;
1073 echo ' </td></tr></table>';
1074 echo ' </td></tr></table>';
1076 echo '<tr><td height="5" colspan="2" bgcolor="'.
1077 $color[4].'"></td></tr>';
1081 /* show attached images inline -- if pref'fed so */
1082 if (($attachment_common_show_images) &&
1083 is_array($attachment_common_show_images_list)) {
1084 foreach ($attachment_common_show_images_list as $img) {
1085 $imgurl = SM_PATH
. 'src/download.php' .
1087 'passed_id=' . urlencode($img['passed_id']) .
1088 '&mailbox=' . urlencode($mailbox) .
1089 '&ent_id=' . urlencode($img['ent_id']) .
1090 '&absolute_dl=true';
1092 echo html_tag( 'table', "\n" .
1093 html_tag( 'tr', "\n" .
1094 html_tag( 'td', '<img src="' . $imgurl . '" />' ."\n", 'left'
1097 'center', '', 'cellspacing="0" border="0" cellpadding="2"');
1101 formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1103 do_hook('read_body_bottom');
1104 sqimap_logout($imapConnection);