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