Make use of mailbox cache because flag info is updated in the mailbox cache
[squirrelmail.git] / src / read_body.php
CommitLineData
59177427 1<?php
134e4174 2
35586184 3/**
4 * read_body.php
5 *
35586184 6 * This file is used for reading the msgs array and displaying
7 * the resulting emails in the right frame.
8 *
47ccfad4 9 * @copyright &copy; 1999-2006 The SquirrelMail Project Team
4b4abf93 10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
30967a1e 11 * @version $Id$
8f6f9ba5 12 * @package squirrelmail
a07cd1a4 13 */
35586184 14
30967a1e 15/**
202bcbcc 16 * Include the SquirrelMail initialization file.
30967a1e 17 */
202bcbcc 18require('../include/init.php');
86725763 19
20/* SquirrelMail required files. */
86725763 21require_once(SM_PATH . 'functions/imap.php');
202bcbcc 22require_once(SM_PATH . 'functions/imap_asearch.php'); // => move to mailbox_display
86725763 23require_once(SM_PATH . 'functions/mime.php');
24require_once(SM_PATH . 'functions/date.php');
25require_once(SM_PATH . 'functions/url_parser.php');
6d021521 26require_once(SM_PATH . 'functions/identity.php');
202bcbcc 27require_once(SM_PATH . 'functions/mailbox_display.php');
28require_once(SM_PATH . 'functions/forms.php');
29require_once(SM_PATH . 'functions/attachment_common.php');
38c944cc 30
a07cd1a4 31/**
1fca12b5 32 * Given an IMAP message id number, this will look it up in the cached
1e150c97 33 * and sorted msgs array and return the index of the next message
1fca12b5 34 *
1e150c97 35 * @param int $passed_id The current message UID
1fca12b5 36 * @return the index of the next valid message from the array
37 */
e0e30169 38function findNextMessage($uidset,$passed_id='backwards') {
324ac3c5 39 if (!is_array($uidset)) {
40 return -1;
41 }
e0e30169 42 if ($passed_id=='backwards' || !is_array($uidset)) { // check for backwards compattibilty gpg plugin
43 $passed_id = $uidset;
e0e30169 44 }
91c27aee 45 $result = sqm_array_get_value_by_offset($uidset,$passed_id,1);
46 if ($result === false) {
47 return -1;
48 } else {
49 return $result;
10f0ce72 50 }
a07cd1a4 51}
52
1e150c97 53/**
54 * Given an IMAP message id number, this will look it up in the cached
55 * and sorted msgs array and return the index of the previous message
56 *
57 * @param int $passed_id The current message UID
58 * @return the index of the next valid message from the array
59 */
e0e30169 60
61function findPreviousMessage($uidset, $passed_id) {
324ac3c5 62 if (!is_array($uidset)) {
63 return -1;
e0e30169 64 }
91c27aee 65 $result = sqm_array_get_value_by_offset($uidset,$passed_id,-1);
66 if ($result === false) {
67 return -1;
68 } else {
69 return $result;
a07cd1a4 70 }
a07cd1a4 71}
10f0ce72 72
7d020720 73function html_toggle_href ($mailbox, $passed_id, $passed_ent_id, $message) {
7277191e 74 global $base_uri, $show_html_default;
75
76 $has_html = false;
77 if ($message->header->type0 == 'message' && $message->header->type1 == 'rfc822') {
78 $type0 = $message->rfc822_header->content_type->type0;
79 $type1 = $message->rfc822_header->content_type->type1;
80 } else {
81 $type0 = $message->header->type0;
82 $type1 = $message->header->type1;
83 }
84 if($type0 == 'multipart' &&
7d020720 85 ($type1 == 'alternative' || $type1 == 'mixed' || $type1 == 'related' || $type1=='signed')) {
7277191e 86 if ($message->findDisplayEntity(array(), array('text/html'), true)) {
87 $has_html = true;
88 }
89 }
90 /*
91 * Normal single part message so check its type.
92 */
93 else {
94 if($type0 == 'text' && $type1 == 'html') {
95 $has_html = true;
96 }
97 }
98 if($has_html == true) {
202bcbcc 99 $vars = array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage','where', 'what');
7277191e 100
101 $new_link = $base_uri . 'src/read_body.php?passed_id=' . urlencode($passed_id) .
102 '&amp;passed_ent_id=' . urlencode($passed_ent_id) .
103 '&amp;mailbox=' . urlencode($mailbox);
104 foreach($vars as $var) {
105 if(sqgetGlobalVar($var, $temp)) {
106 $new_link .= '&amp;' . $var . '=' . urlencode($temp);
107 }
108 }
109
110 if($show_html_default == 1) {
111 $new_link .= '&amp;show_html_default=0';
7277191e 112 } else {
113 $new_link .= '&amp;show_html_default=1';
7277191e 114 }
7d020720 115 return $new_link;
7277191e 116 }
117 return '';
118}
119
4669e892 120function ServerMDNSupport($aFlags) {
121 /* escaping $ doesn't work -> \x36 */
c075fcfe 122 return ( in_array('$mdnsent',$aFlags,true) ||
123 in_array('\\*',$aFlags,true) ) ;
57257333 124}
125
fc224f68 126function SendMDN ( $mailbox, $passed_id, $sender, $message, $imapConnection) {
8d8da447 127 global $username, $attachment_dir, $popuser, $username, $color,
ce68b76b 128 $version, $squirrelmail_language, $default_charset,
129 $languages, $useSendmail, $domain, $sent_folder;
57257333 130
e95c04ec 131 sqgetGlobalVar('SERVER_NAME', $SERVER_NAME, SQ_SERVER);
0b97a708 132
38bca81c 133 $header = $message->rfc822_header;
57257333 134
fc224f68 135 $rfc822_header = new Rfc822Header();
d9c1dccc 136 $content_type = new ContentType('multipart/report');
fc224f68 137 $content_type->properties['report-type']='disposition-notification';
d9c1dccc 138
fc224f68 139 set_my_charset();
140 if ($default_charset) {
d9c1dccc 141 $content_type->properties['charset']=$default_charset;
fc224f68 142 }
143 $rfc822_header->content_type = $content_type;
144 $rfc822_header->to[] = $header->dnt;
a20855e4 145 $rfc822_header->subject = _("Read:") . ' ' . encodeHeader($header->subject);
fc224f68 146
27a1d10a 147 // Patch #793504 Return Receipt Failing with <@> from Tim Craig (burny_md)
148 // This merely comes from compose.php and only happens when there is no
149 // email_addr specified in user's identity (which is the startup config)
150 if (ereg("^([^@%/]+)[@%/](.+)$", $username, $usernamedata)) {
151 $popuser = $usernamedata[1];
152 $domain = $usernamedata[2];
153 unset($usernamedata);
154 } else {
155 $popuser = $username;
156 }
fc224f68 157
158 $reply_to = '';
6d021521 159 $ident = get_identities();
160 if(!isset($identity)) $identity = 0;
161 $full_name = $ident[$identity]['full_name'];
162 $from_mail = $ident[$identity]['email_address'];
163 $from_addr = '"'.$full_name.'" <'.$from_mail.'>';
164 $reply_to = $ident[$identity]['reply_to'];
165
27a1d10a 166 if (!$from_mail) {
167 $from_mail = "$popuser@$domain";
168 $from_addr = $from_mail;
fc224f68 169 }
170 $rfc822_header->from = $rfc822_header->parseAddress($from_addr,true);
171 if ($reply_to) {
172 $rfc822_header->reply_to = $rfc822_header->parseAddress($reply_to,true);
173 }
d9c1dccc 174
57257333 175 // part 1 (RFC2298)
57257333 176 $senton = getLongDateString( $header->date );
177 $to_array = $header->to;
178 $to = '';
179 foreach ($to_array as $line) {
af568a82 180 $to .= ' '.$line->getAddress();
57257333 181 }
57257333 182 $now = getLongDateString( time() );
78db1583 183 set_my_charset();
46bb8da8 184 $body = _("Your message") . "\r\n\r\n" .
48027e89 185 "\t" . _("To") . ': ' . decodeHeader($to,false,false) . "\r\n" .
186 "\t" . _("Subject") . ': ' . decodeHeader($header->subject,false,false) . "\r\n" .
187 "\t" . _("Sent") . ': ' . $senton . "\r\n" .
46bb8da8 188 "\r\n" .
189 sprintf( _("Was displayed on %s"), $now );
f69feefe 190
fc224f68 191 $special_encoding = '';
4669e892 192 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
f4bb5d22 193 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
194 $body = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $body);
d9c1dccc 195 if (strtolower($default_charset) == 'iso-2022-jp') {
196 if (mb_detect_encoding($body) == 'ASCII') {
197 $special_encoding = '8bit';
198 } else {
199 $body = mb_convert_encoding($body, 'JIS');
200 $special_encoding = '7bit';
201 }
202 }
21461ca4 203 } elseif (sq_is8bit($body)) {
204 $special_encoding = '8bit';
6fbd125b 205 }
fc224f68 206 $part1 = new Message();
207 $part1->setBody($body);
208 $mime_header = new MessageHeader;
209 $mime_header->type0 = 'text';
210 $mime_header->type1 = 'plain';
211 if ($special_encoding) {
212 $mime_header->encoding = $special_encoding;
d9c1dccc 213 } else {
fc224f68 214 $mime_header->encoding = 'us-ascii';
215 }
216 if ($default_charset) {
217 $mime_header->parameters['charset'] = $default_charset;
218 }
219 $part1->mime_header = $mime_header;
220
57257333 221 // part2 (RFC2298)
d9c1dccc 222 $original_recipient = $to;
57257333 223 $original_message_id = $header->message_id;
224
fc224f68 225 $report = "Reporting-UA : $SERVER_NAME ; SquirrelMail (version $version) \r\n";
57257333 226 if ($original_recipient != '') {
fc224f68 227 $report .= "Original-Recipient : $original_recipient\r\n";
57257333 228 }
229 $final_recipient = $sender;
fc224f68 230 $report .= "Final-Recipient: rfc822; $final_recipient\r\n" .
57257333 231 "Original-Message-ID : $original_message_id\r\n" .
232 "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
233
fc224f68 234 $part2 = new Message();
235 $part2->setBody($report);
236 $mime_header = new MessageHeader;
237 $mime_header->type0 = 'message';
238 $mime_header->type1 = 'disposition-notification';
239 $mime_header->encoding = 'us-ascii';
240 $part2->mime_header = $mime_header;
241
242 $composeMessage = new Message();
243 $composeMessage->rfc822_header = $rfc822_header;
244 $composeMessage->addEntity($part1);
245 $composeMessage->addEntity($part2);
246
247
d9c1dccc 248 if ($useSendmail) {
249 require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
f3dc9c62 250 global $sendmail_path, $sendmail_args;
251 // Check for outdated configuration
252 if (!isset($sendmail_args)) {
253 if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
254 $sendmail_args = '';
255 } else {
256 $sendmail_args = '-i -t';
257 }
258 }
259 $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
d9c1dccc 260 $stream = $deliver->initStream($composeMessage,$sendmail_path);
fc224f68 261 } else {
d9c1dccc 262 require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
263 $deliver = new Deliver_SMTP();
ce68b76b 264 global $smtpServerAddress, $smtpPort, $pop_before_smtp;
d9c1dccc 265 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
9bd3b1e6 266 get_smtp_user($user, $pass);
d9c1dccc 267 $stream = $deliver->initStream($composeMessage,$domain,0,
70ce2218 268 $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
d9c1dccc 269 }
270 $success = false;
fc224f68 271 if ($stream) {
d9c1dccc 272 $length = $deliver->mail($composeMessage, $stream);
273 $success = $deliver->finalizeStream($stream);
fc224f68 274 }
d9c1dccc 275 if (!$success) {
a15f9d93 276 $msg = $deliver->dlv_msg;
277 if (! empty($deliver->dlv_server_msg)) {
278 $msg.= '<br />' .
0cc4fb0d 279 _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
a15f9d93 280 nl2br(htmlspecialchars($deliver->dlv_server_msg));
281 }
fc224f68 282 plain_error_message($msg, $color);
283 } else {
284 unset ($deliver);
d9c1dccc 285 if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
81de00c0 286 $sid = sqimap_append ($imapConnection, $sent_folder, $length);
d9c1dccc 287 require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
288 $imap_deliver = new Deliver_IMAP();
289 $imap_deliver->mail($composeMessage, $imapConnection);
81de00c0 290 sqimap_append_done ($imapConnection, $sent_folder);
d9c1dccc 291 unset ($imap_deliver);
292 }
293 }
294 return $success;
57257333 295}
296
6201339c 297function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
d9c1dccc 298 $sg = $set?'+':'-';
299 $cmd = 'STORE ' . $passed_id . ' ' . $sg . 'FLAGS ($MDNSent)';
4669e892 300 $read = sqimap_run_command ($imapConnection, $cmd, true, $response,
6201339c 301 $readmessage, TRUE);
57257333 302}
303
4d0cd98b 304function formatRecipientString($recipients, $item ) {
d9c1dccc 305 global $show_more_cc, $show_more, $show_more_bcc,
7d020720 306 $PHP_SELF, $oTemplate;
4d0cd98b 307
d9c1dccc 308 $string = '';
38c944cc 309 if ((is_array($recipients)) && (isset($recipients[0]))) {
d9c1dccc 310 $show = false;
38c944cc 311
312 if ($item == 'to') {
d9c1dccc 313 if ($show_more) {
314 $show = true;
315 $url = set_url_var($PHP_SELF, 'show_more',0);
316 } else {
317 $url = set_url_var($PHP_SELF, 'show_more',1);
318 }
319 } else if ($item == 'cc') {
320 if ($show_more_cc) {
321 $show = true;
322 $url = set_url_var($PHP_SELF, 'show_more_cc',0);
323 } else {
324 $url = set_url_var($PHP_SELF, 'show_more_cc',1);
325 }
326 } else if ($item == 'bcc') {
327 if ($show_more_bcc) {
328 $show = true;
329 $url = set_url_var($PHP_SELF, 'show_more_bcc',0);
330 } else {
331 $url = set_url_var($PHP_SELF, 'show_more_bcc',1);
332 }
333 }
67dc67bb 334
7d020720 335 $a = array();
336 foreach ($recipients as $r) {
337 $a[] = array(
338 'Name' => htmlspecialchars($r->getAddress(false)),
339 'Email' => htmlspecialchars($r->getEmail()),
340 'Full' => htmlspecialchars($r->getAddress(true))
341 );
1fca12b5 342 }
67dc67bb 343
7d020720 344 $oTemplate->assign('which_field', $item);
345 $oTemplate->assign('recipients', $a);
346 $oTemplate->assign('more_less_toggle_href', $url);
347 $oTemplate->assign('show_more', $show);
67dc67bb 348
7d020720 349 $string = $oTemplate->fetch('read_recipient_list.tpl');
4d0cd98b 350 }
c615b1da 351 return $string;
352}
353
e0e30169 354function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
af568a82 355 $color, $FirstTimeSee) {
ce68b76b 356 global $default_use_mdn, $default_use_priority,
457e8593 357 $show_xmailer_default, $mdn_user_support, $PHP_SELF,
7d020720 358 $squirrelmail_language, $oTemplate;
38bca81c 359
134e4174 360 $mailbox = $aMailbox['NAME'];
e0e30169 361
d9c1dccc 362 $header = $message->rfc822_header;
363 $env = array();
bdb9ce72 364 $env[_("Subject")] = str_replace("&nbsp;"," ",decodeHeader($header->subject));
7893c8a5 365
d9c1dccc 366 $from_name = $header->getAddr_s('from');
d6b6d221 367 if (!$from_name)
d9c1dccc 368 $from_name = $header->getAddr_s('sender');
d6b6d221 369 if (!$from_name)
370 $env[_("From")] = _("Unknown sender");
371 else
372 $env[_("From")] = decodeHeader($from_name);
d9c1dccc 373 $env[_("Date")] = getLongDateString($header->date);
374 $env[_("To")] = formatRecipientString($header->to, "to");
375 $env[_("Cc")] = formatRecipientString($header->cc, "cc");
376 $env[_("Bcc")] = formatRecipientString($header->bcc, "bcc");
377 if ($default_use_priority) {
7d020720 378 $oTemplate->assign('message_priority', $header->priority);
379 $env[_("Priority")] = $oTemplate->fetch('read_message_priority.tpl');
d9c1dccc 380 }
381 if ($show_xmailer_default) {
7d020720 382 $oTemplate->assign('xmailer', decodeHeader($header->xmailer));
383 $env[_("Mailer")] = $oTemplate->fetch('read_xmailer.tpl');
d9c1dccc 384 }
385 if ($default_use_mdn) {
386 if ($mdn_user_support) {
387 if ($header->dnt) {
7d020720 388 $mdn_url = $PHP_SELF;
389 $mdn_url = set_url_var($PHP_SELF, 'mailbox', urlencode($mailbox));
390 $mdn_url = set_url_var($PHP_SELF, 'passed_id', $passed_id);
391 $mdn_url = set_url_var($PHP_SELF, 'passed_ent_id', $passed_ent_id);
392 $mdn_url = set_url_var($PHP_SELF, 'sendreceipt', 1);
393
394 $oTemplate->assign('read_receipt_sent', $message->is_mdnsent);
395 $oTemplate->assign('first_time_reading', $FirstTimeSee);
396 $oTemplate->assign('send_receipt_href', $mdn_url);
67dc67bb 397
7d020720 398 $env[_("Read Receipt")] = $oTemplate->fetch('read_handle_receipt.tpl');
d9c1dccc 399 }
400 }
401 }
1c3d4412 402
403 $statuses = array();
67dc67bb 404 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
405 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted']) &&
406 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted'] === true) {
407 $statuses[] = _("deleted");
408 }
409 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered']) &&
410 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered'] === true) {
411 $statuses[] = _("answered");
412 }
413 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft']) &&
414 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft'] === true) {
415 $statuses[] = _("draft");
416 }
417 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged']) &&
418 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged'] === true) {
419 $statuses[] = _("flagged");
420 }
421 if ( count($statuses) ) {
422 $env[_("Status")] = implode(', ', $statuses);
423 }
1c3d4412 424 }
67dc67bb 425
7d020720 426 $env[_("Options")] = formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
c615b1da 427
1c3d4412 428
7d020720 429 $oTemplate->assign('headers_to_display', $env);
67dc67bb 430
7d020720 431 $oTemplate->display('read_headers.tpl');
d9c1dccc 432}
c615b1da 433
1e150c97 434/**
4669e892 435 * Format message toolbar
436 *
1e150c97 437 * @param string $mailbox Name of current mailbox
438 * @param int $passed_id UID of current message
439 * @param int $passed_ent_id Id of entity within message
440 * @param object $message Current message object
441 * @param object $mbx_response
442 */
324ac3c5 443function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
7d020720 444 global $base_uri, $draft_folder, $where, $what, $sort,
4669e892 445 $startMessage, $PHP_SELF, $save_as_draft,
1e150c97 446 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
7d020720 447 $delete_prev_next_display, $show_copy_buttons,
457e8593 448 $compose_new_win, $compose_width, $compose_height,
7d020720 449 $oTemplate;
c615b1da 450
e0e30169 451 //FIXME cleanup argument list, use $aMailbox where possible
452 $mailbox = $aMailbox['NAME'];
453
d9c1dccc 454 $urlMailbox = urlencode($mailbox);
c615b1da 455
1e150c97 456 $msgs_url = $base_uri . 'src/';
2ffa3f57 457
1e150c97 458 // Create Prev & Next links
459 // Handle nested entities first (i.e. Mime Attach parts)
7d020720 460 $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
67dc67bb 461 $msg_list_href = $search_href = $view_msg_href = '';
1e150c97 462 if (isset($passed_ent_id) && $passed_ent_id) {
463 // code for navigating through attached message/rfc822 messages
d9c1dccc 464 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
70bdc740 465 $entities = array();
466 $entity_count = array();
467 $c = 0;
f2f03410 468
70bdc740 469 foreach($message->parent->entities as $ent) {
9f42bfc8 470 if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
67dc67bb 471
9f42bfc8 472 $c++;
473 $entity_count[$c] = $ent->entity_id;
474 $entities[$ent->entity_id] = $c;
475 }
70bdc740 476 }
1e150c97 477
91c27aee 478 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
70bdc740 479 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
7d020720 480 $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
70bdc740 481 }
1e150c97 482
91c27aee 483 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
70bdc740 484 $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
7d020720 485 $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
70bdc740 486 }
1e150c97 487
d9c1dccc 488 $par_ent_id = $message->parent->entity_id;
489 if ($par_ent_id) {
490 $par_ent_id = substr($par_ent_id,0,-2);
1e150c97 491 if ( $par_ent_id != 0 ) {
7d020720 492 $up_href = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
1e150c97 493 }
494 }
495
7d020720 496 $view_msg_href = $url;
1e150c97 497
498 // Prev/Next links for regular messages
324ac3c5 499 } else if ( true ) { //!(isset($where) && isset($what)) ) {
324ac3c5 500 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
501 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
1e150c97 502
1e150c97 503 if ($prev >= 0) {
7d020720 504 $prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 505 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 506 "&amp;where=$where&amp;what=$what" .
1e150c97 507 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
d9c1dccc 508 }
1e150c97 509
1e150c97 510 if ($next >= 0) {
7d020720 511 $next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 512 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 513 "&amp;where=$where&amp;what=$what" .
1e150c97 514 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
1e150c97 515 }
516
1e150c97 517 // Only bother with Delete & Prev and Delete & Next IF
6201339c 518 // top display is enabled.
4669e892 519 if ( $delete_prev_next_display == 1 &&
324ac3c5 520 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
1e150c97 521 if ($prev >= 0) {
7d020720 522 $del_prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 523 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
524 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 525 "&amp;where=$where&amp;what=$what" .
1e150c97 526 '&amp;delete_id='.$passed_id;
1e150c97 527 }
528
1e150c97 529 if ($next >= 0) {
7d020720 530 $del_next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 531 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
532 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 533 "&amp;where=$where&amp;what=$what" .
1e150c97 534 '&amp;delete_id='.$passed_id;
1e150c97 535 }
1e150c97 536 }
537 }
538
539 // Start with Search Results or Message List link.
7d020720 540 $list_xtra = "?where=read_body.php&amp;what=$what&amp;mailbox=" . $urlMailbox.
324ac3c5 541 "&amp;startMessage=$startMessage";
7d020720 542 $msg_list_href = $base_uri .'src/right_main.php'. $list_xtra;
543 $search_href = $where=='search.php' ? $base_uri .'src/search.php?'.$list_xtra : '';
1e150c97 544
98a9cc03 545 $comp_uri = $base_uri.'src/compose.php' .
546 '?passed_id=' . $passed_id .
547 '&amp;mailbox=' . $urlMailbox .
548 '&amp;startMessage=' . $startMessage .
549 (isset($passed_ent_id) ? '&amp;passed_ent_id='.$passed_ent_id : '');
4669e892 550
551 // Start form for reply/reply all/forward..
1a531551 552 $target = '';
553 $on_click='';
ee66175d 554 $method='method="post" ';
6190378c 555 $onsubmit='';
1a531551 556 if ($compose_new_win == '1') {
91c27aee 557 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
558 $compose_width = '640';
559 }
560 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
561 $compose_height = '550';
562 }
457e8593 563 if ( checkForJavascript() ) {
91c27aee 564 $on_click=' onclick="comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')"';
1a531551 565 $comp_uri = 'javascript:void(0)';
ee66175d 566 $method='method="get" ';
6190378c 567 $onsubmit = 'onsubmit="return false" ';
1a531551 568 } else {
569 $target = 'target="_blank"';
1a531551 570 }
571 }
572
7d020720 573 $oTemplate->assign('nav_on_top', $nav_on_top);
98a9cc03 574
7d020720 575 $oTemplate->assign('prev_href', $prev_href);
576 $oTemplate->assign('up_href', $up_href);
577 $oTemplate->assign('next_href', $next_href);
578 $oTemplate->assign('del_prev_href', $del_prev_href);
579 $oTemplate->assign('del_next_href', $del_next_href);
580 $oTemplate->assign('view_msg_href', $view_msg_href);
581
582 $oTemplate->assign('message_list_href', $msg_list_href);
583 $oTemplate->assign('search_href', $search_href);
584
585 $oTemplate->assign('form_extra', $method . $target . $onsubmit);
586 $oTemplate->assign('compose_href', $comp_uri);
587 $oTemplate->assign('button_onclick', $on_click);
588 $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==1);
67dc67bb 589
d08a5945 590 //FIXME: I am surprised these aren't already given to the template; probably needs to be given at a higher level, so I have NO IDEA if this is the right place to do this... adding them so template can construct its own API calls... we can build those herein too if preferrable
591 $oTemplate->assign('mailbox', $aMailbox['NAME']);
592 $oTemplate->assign('passed_id', $passed_id);
593 $oTemplate->assign('what', $what);
594
1e150c97 595 // If Draft folder - create Resume link
67dc67bb 596 $resume_draft = $edit_as_new = false;
1e150c97 597 if (($mailbox == $draft_folder) && ($save_as_draft)) {
7d020720 598 $resume_draft = true; 'smaction_draft';
1e150c97 599 } else if (handleAsSent($mailbox)) {
7d020720 600 $edit_as_new = true;
1e150c97 601 }
7d020720 602 $oTemplate->assign('can_resume_draft', $resume_draft);
67dc67bb 603 $oTemplate->assign('can_edit_as_new', $edit_as_new);
604
7d020720 605 $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
606 if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
324ac3c5 607 $delete_url = $base_uri . "src/$where";
7d020720 608 $oTemplate->assign('can_be_deleted', true);
609 $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
610 $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
611 addHidden('msg[0]', $passed_id)."\n" .
612 addHidden('startMessage', $startMessage)."\n" );
4669e892 613 if (!(isset($passed_ent_id) && $passed_ent_id)) {
7d020720 614 $oTemplate->assign('can_be_moved', true);
615 $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
616 addHidden('msg[0]', $passed_id)."\n" );
617 $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
618 $oTemplate->assign('can_be_copied', $show_copy_buttons==1);
1e150c97 619 } else {
7d020720 620 $oTemplate->assign('can_be_moved', false);
621 $oTemplate->assign('move_form_extra', '');
622 $oTemplate->assign('last_move_target', '');
623 $oTemplate->assign('can_be_copied', false);
988e24f6 624 }
7d020720 625 } else {
626 $oTemplate->assign('can_be_deleted', false);
627 $oTemplate->assign('move_delete_form_action', '');
628 $oTemplate->assign('delete_form_extra', '');
629 $oTemplate->assign('can_be_moved', false);
630 $oTemplate->assign('move_form_extra', '');
631 $oTemplate->assign('last_move_target', '');
632 $oTemplate->assign('can_be_copied', false);
633 }
67dc67bb 634
7d020720 635 if ($nav_on_top) {
636 $oTemplate->display('read_menubar_nav.tpl');
637 $oTemplate->display('read_menubar_buttons.tpl');
638 } else {
639 $oTemplate->display('read_menubar_buttons.tpl');
640 $oTemplate->display('read_menubar_nav.tpl');
764971df 641 }
67dc67bb 642
6e515418 643 global $null;
644 do_hook('read_body_menu_bottom', $null);
c615b1da 645}
646
647function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 648 global $base_uri, $where, $what, $show_html_default,
67dc67bb 649 $oTemplate, $download_href,
7d020720 650 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 651
d9c1dccc 652 $urlMailbox = urlencode($mailbox);
78909469 653 $urlPassed_id = urlencode($passed_id);
654 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 655
78909469 656 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 657 if (!empty($where)) {
658 $query_string .= '&amp;where=' . urlencode($where);
659 }
78909469 660 if (!empty($what)) {
661 $query_string .= '&amp;what=' . urlencode($what);
662 }
e95c04ec 663 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 664
d9c1dccc 665
7d020720 666 // Build the printer friend link
667 /* hackydiehack */
668 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
669 $view_unsafe_images = false;
670 } else {
671 $view_unsafe_images = true;
40a34e57 672 }
7d020720 673 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
674 '&mailbox=' . $urlMailbox .
675 '&passed_id=' . $urlPassed_id .
676 '&view_unsafe_images='. (bool) $view_unsafe_images .
67dc67bb 677 '&show_html_default=' . $show_html_default;
7d020720 678 $links = array();
679 $links[] = array (
680 'URL' => $url,
681 'Text' => _("View Full Header")
682 );
683 $links[] = array (
684 'URL' => $pf_params,
685 'Text' => _("View Printable Version")
686 );
687 $links[] = array (
688 'URL' => $download_href,
210b5bb5 689 'Text' => _("Download this as a file")
7d020720 690 );
691 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
692 if (!empty($toggle)) {
693 $links[] = array (
694 'URL' => $toggle,
695 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
696 );
697 }
698 if (!empty($unsafe_image_toggle_href)) {
699 $links[] = array (
700 'URL' => $unsafe_image_toggle_href,
701 'Text' => $unsafe_image_toggle_text
702 );
703 }
704
705 do_hook('read_body_header_right', $links);
706
707 $oTemplate->assign('links', $links);
67dc67bb 708
7d020720 709 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 710}
711
6206f6c4 712/***************************/
2ffa3f57 713/* Main of read_body.php */
6206f6c4 714/***************************/
57257333 715
0b97a708 716/* get the globals we may need */
717
e95c04ec 718sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 719sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 720if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
721 $messages = array();
ce274df9 722}
81de00c0 723sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
724if (is_array($delayed_errors)) {
725 $oErrorHandler->AssignDelayedErrors($delayed_errors);
726 sqsession_unregister("delayed_errors");
727}
e95c04ec 728/** GET VARS */
729sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 730if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
731 $where = 'right_main.php';
732}
d0b119a5 733/*
734 * Used as entry key to the list of uid's cached in the mailbox cache
735 * we use the cached uid's to get the next and prev message.
736 */
324ac3c5 737if (!sqgetGlobalVar('what', $what, SQ_GET) ){
738 $what = 0;
739}
e95c04ec 740if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
741 $show_more = (int) $temp;
1b9f3c04 742}
e95c04ec 743if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
744 $show_more_cc = (int) $temp;
0b97a708 745}
e95c04ec 746if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
747 $show_more_bcc = (int) $temp;
0b97a708 748}
e95c04ec 749if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
750 $view_hdr = (int) $temp;
0b97a708 751}
e95c04ec 752
91c27aee 753if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
754 $iAccount = (int) $temp;
755} else {
756 $iAccount = 0;
757}
758
e95c04ec 759/** GET/POST VARS */
760sqgetGlobalVar('passed_ent_id', $passed_ent_id);
761sqgetGlobalVar('mailbox', $mailbox);
762
763if ( sqgetGlobalVar('passed_id', $temp) ) {
764 $passed_id = (int) $temp;
0b97a708 765}
e95c04ec 766if ( sqgetGlobalVar('sort', $temp) ) {
767 $sort = (int) $temp;
0b97a708 768}
e95c04ec 769if ( sqgetGlobalVar('startMessage', $temp) ) {
770 $startMessage = (int) $temp;
324ac3c5 771} else {
772 $startMessage = 1;
ce274df9 773}
7277191e 774if(sqgetGlobalVar('show_html_default', $temp)) {
775 $show_html_default = (int) $temp;
776}
777
778if(sqgetGlobalVar('view_unsafe_images', $temp)) {
779 $view_unsafe_images = (int) $temp;
780 if($view_unsafe_images == 1) {
781 $show_html_default = 1;
782 }
783} else {
784 $view_unsafe_images = 0;
785}
324ac3c5 786/**
787 * Retrieve mailbox cache
788 */
789sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 790
ce274df9 791/* end of get globals */
6201339c 792global $sqimap_capabilities, $lastTargetMailbox;
38c944cc 793
906f7e9f 794$imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
91c27aee 795$aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
796
c3731db5 797
91c27aee 798/**
c3731db5 799 Start code to set the columns to fetch in case of hitting the next/prev link
800 The reason for this is the fact that the cache can be invalidated which means that the headers
801 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
802
803 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
804*/
805
806/**
807 * Replace From => To in case it concerns a draft or sent folder
808 */
199ff86a 809$aColumns = array();
c3731db5 810if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
811 !in_array(SQM_COL_TO,$index_order)) {
812 $aNewOrder = array(); // nice var name ;)
813 foreach($index_order as $iCol) {
814 if ($iCol == SQM_COL_FROM) {
815 $iCol = SQM_COL_TO;
816 }
199ff86a 817 $aColumns[$iCol] = array();
c3731db5 818 }
c3731db5 819} else {
199ff86a 820 foreach ($index_order as $iCol) {
821 $aColumns[$iCol] = array();
822 }
c3731db5 823}
824
825$aProps = array(
826 'columns' => $aColumns, // columns bound settings
827 'config' => array(
828 'highlight_list' => $message_highlight_list, // row highlighting rules
829 'trash_folder' => $trash_folder,
830 'sent_folder' => $sent_folder,
831 'draft_folder' => $draft_folder));
832
833calcFetchColumns($aMailbox,$aProps);
834
835/**
836 End code to set the columns to fetch in case of hitting the next/prev link
837*/
838
839
840
841/**
842 * Check if cache is still valid, $what contains the key
843 * which gives us acces to the array with uid's. At this moment
844 * 0 is used for a normal message list and search uses 1 as key. This can be
845 * changed / extended in the future.
846 * If on a select of a mailbox we detect that the cache should be invalidated due to
847 * the delete of messages or due to new messages we empty the list with uid's and
848 * that's what we detect below.
849 */
91c27aee 850if (!is_array($aMailbox['UIDSET'][$what])) {
d0b119a5 851 fetchMessageHeaders($imapConnection, $aMailbox);
91c27aee 852}
38c944cc 853
d0b119a5 854$iSetIndex = $aMailbox['SETINDEX'];
855$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
856
324ac3c5 857/**
858 * Update the seen state
859 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
860 */
861if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
862 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
e0e30169 863}
e0e30169 864
1e150c97 865/**
866 * Process Delete from delete-move-next
867 * but only if delete_id was set
868 */
869if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
324ac3c5 870 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
1e150c97 871}
872
38c944cc 873/**
874 * $message contains all information about the message
875 * including header and body
876 */
37d2a6ee 877
324ac3c5 878if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
879 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
880 $FirstTimeSee = !$message->is_seen;
38c944cc 881} else {
324ac3c5 882 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
883 $FirstTimeSee = !$message->is_seen;
884 $message->is_seen = true;
885 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 886}
dd628162 887if (isset($passed_ent_id) && $passed_ent_id) {
324ac3c5 888 $message = $message->getEntity($passed_ent_id);
889 if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
890 $message = $message->parent;
891 }
892 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
893 $rfc822_header = new Rfc822Header();
894 $rfc822_header->parseHeader($read);
895 $message->rfc822_header = $rfc822_header;
91c27aee 896} else if ($message->type0 == 'message' && $message->type1 == 'rfc822' && isset($message->entities[0])) {
897 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
898 $rfc822_header = new Rfc822Header();
899 $rfc822_header->parseHeader($read);
900 $message->rfc822_header = $rfc822_header;
c615b1da 901} else {
324ac3c5 902 $passed_ent_id = 0;
38c944cc 903}
5200c026 904$header = $message->header;
57257333 905
57257333 906
6206f6c4 907/****************************************/
908/* Block for handling incoming url vars */
909/****************************************/
5200c026 910
5200c026 911if (isset($sendreceipt)) {
912 if ( !$message->is_mdnsent ) {
27a1d10a 913 $final_recipient = '';
134e4174 914 if ((isset($identity)) && ($identity != 0)) //Main identity
27a1d10a 915 $final_recipient = trim(getPref($data_dir, $username, 'email_address' . $identity, '' ));
916 if ($final_recipient == '' )
917 $final_recipient = trim(getPref($data_dir, $username, 'email_address', '' ));
324ac3c5 918 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
fc224f68 919 if ( SendMDN( $mailbox, $passed_id, $final_recipient, $message, $imapConnection ) > 0 && $supportMDN ) {
6201339c 920 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
5200c026 921 $message->is_mdnsent = true;
1012f961 922 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 923 }
5200c026 924 }
925}
6206f6c4 926/***********************************************/
927/* End of block for handling incoming url vars */
928/***********************************************/
929
9f42bfc8 930$messagebody = '';
6e515418 931do_hook('read_body_top', $null);
c4ad259b 932if ($show_html_default == 1) {
933 $ent_ar = $message->findDisplayEntity(array());
934} else {
935 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
936}
a128c967 937$cnt = count($ent_ar);
938for ($i = 0; $i < $cnt; $i++) {
6a108031 939 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
a128c967 940 if ($i != $cnt-1) {
7d020720 941 $messagebody .= '<hr />';
a128c967 942 }
38c944cc 943}
e55c441a 944
202bcbcc 945/**
946 * Write mailbox with updated seen flag information back to cache.
947 */
948$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
949sqsession_register($mailbox_cache,'mailbox_cache');
950$_SESSION['mailbox_cache'] = $mailbox_cache;
202bcbcc 951
b89ceca6 952displayPageHeader($color, $mailbox,'','');
324ac3c5 953formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 954formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 955
956$oTemplate->assign('message_body', $messagebody);
957$oTemplate->display('read_message_body.tpl');
958
959formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 960
961/* show attached images inline -- if pref'fed so */
7d020720 962if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
963 $images = array();
a07cd1a4 964 foreach ($attachment_common_show_images_list as $img) {
ce274df9 965 $imgurl = SM_PATH . 'src/download.php' .
57257333 966 '?' .
cd7b8833 967 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 968 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 969 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 970 '&amp;absolute_dl=true';
7d020720 971 $a = array();
972 $a['Name'] = $img['name'];
973 $a['DisplayURL'] = $imgurl;
974 $a['DownloadURL'] = $img['download_href'];
975 $images[] = $a;
10f0ce72 976 }
67dc67bb 977
7d020720 978 $oTemplate->assign('images', $images);
979 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 980}
981
324ac3c5 982formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 983
6e515418 984do_hook('read_body_bottom', $null);
a07cd1a4 985sqimap_logout($imapConnection);
51d66ea2 986$oTemplate->display('footer.tpl');
210b5bb5 987?>