Pass compose form attributes to template separately, otherwise, is same as constructi...
[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() ) {
91c27aee 566 $on_click=' onclick="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
7d020720 640 if ($nav_on_top) {
641 $oTemplate->display('read_menubar_nav.tpl');
642 $oTemplate->display('read_menubar_buttons.tpl');
643 } else {
644 $oTemplate->display('read_menubar_buttons.tpl');
645 $oTemplate->display('read_menubar_nav.tpl');
764971df 646 }
67dc67bb 647
6e515418 648 global $null;
649 do_hook('read_body_menu_bottom', $null);
c615b1da 650}
651
652function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 653 global $base_uri, $where, $what, $show_html_default,
67dc67bb 654 $oTemplate, $download_href,
7d020720 655 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 656
d9c1dccc 657 $urlMailbox = urlencode($mailbox);
78909469 658 $urlPassed_id = urlencode($passed_id);
659 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 660
78909469 661 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 662 if (!empty($where)) {
663 $query_string .= '&amp;where=' . urlencode($where);
664 }
78909469 665 if (!empty($what)) {
666 $query_string .= '&amp;what=' . urlencode($what);
667 }
e95c04ec 668 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 669
d9c1dccc 670
7d020720 671 // Build the printer friend link
672 /* hackydiehack */
673 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
674 $view_unsafe_images = false;
675 } else {
676 $view_unsafe_images = true;
40a34e57 677 }
7d020720 678 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
679 '&mailbox=' . $urlMailbox .
680 '&passed_id=' . $urlPassed_id .
681 '&view_unsafe_images='. (bool) $view_unsafe_images .
67dc67bb 682 '&show_html_default=' . $show_html_default;
7d020720 683 $links = array();
684 $links[] = array (
685 'URL' => $url,
686 'Text' => _("View Full Header")
687 );
688 $links[] = array (
689 'URL' => $pf_params,
690 'Text' => _("View Printable Version")
691 );
692 $links[] = array (
693 'URL' => $download_href,
210b5bb5 694 'Text' => _("Download this as a file")
7d020720 695 );
696 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
697 if (!empty($toggle)) {
698 $links[] = array (
699 'URL' => $toggle,
700 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
701 );
702 }
703 if (!empty($unsafe_image_toggle_href)) {
704 $links[] = array (
705 'URL' => $unsafe_image_toggle_href,
706 'Text' => $unsafe_image_toggle_text
707 );
708 }
709
710 do_hook('read_body_header_right', $links);
711
712 $oTemplate->assign('links', $links);
67dc67bb 713
7d020720 714 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 715}
716
6206f6c4 717/***************************/
2ffa3f57 718/* Main of read_body.php */
6206f6c4 719/***************************/
57257333 720
0b97a708 721/* get the globals we may need */
722
e95c04ec 723sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 724sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 725if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
726 $messages = array();
ce274df9 727}
81de00c0 728sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
729if (is_array($delayed_errors)) {
730 $oErrorHandler->AssignDelayedErrors($delayed_errors);
731 sqsession_unregister("delayed_errors");
732}
e95c04ec 733/** GET VARS */
734sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 735if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
736 $where = 'right_main.php';
737}
d0b119a5 738/*
739 * Used as entry key to the list of uid's cached in the mailbox cache
740 * we use the cached uid's to get the next and prev message.
741 */
324ac3c5 742if (!sqgetGlobalVar('what', $what, SQ_GET) ){
743 $what = 0;
744}
e95c04ec 745if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
746 $show_more = (int) $temp;
1b9f3c04 747}
e95c04ec 748if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
749 $show_more_cc = (int) $temp;
0b97a708 750}
e95c04ec 751if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
752 $show_more_bcc = (int) $temp;
0b97a708 753}
e95c04ec 754if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
755 $view_hdr = (int) $temp;
0b97a708 756}
e95c04ec 757
91c27aee 758if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
759 $iAccount = (int) $temp;
760} else {
761 $iAccount = 0;
762}
763
e95c04ec 764/** GET/POST VARS */
765sqgetGlobalVar('passed_ent_id', $passed_ent_id);
766sqgetGlobalVar('mailbox', $mailbox);
767
768if ( sqgetGlobalVar('passed_id', $temp) ) {
769 $passed_id = (int) $temp;
0b97a708 770}
e95c04ec 771if ( sqgetGlobalVar('sort', $temp) ) {
772 $sort = (int) $temp;
0b97a708 773}
e95c04ec 774if ( sqgetGlobalVar('startMessage', $temp) ) {
775 $startMessage = (int) $temp;
324ac3c5 776} else {
777 $startMessage = 1;
ce274df9 778}
7277191e 779if(sqgetGlobalVar('show_html_default', $temp)) {
780 $show_html_default = (int) $temp;
781}
782
783if(sqgetGlobalVar('view_unsafe_images', $temp)) {
784 $view_unsafe_images = (int) $temp;
785 if($view_unsafe_images == 1) {
786 $show_html_default = 1;
787 }
788} else {
789 $view_unsafe_images = 0;
790}
324ac3c5 791/**
792 * Retrieve mailbox cache
793 */
794sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 795
ce274df9 796/* end of get globals */
6201339c 797global $sqimap_capabilities, $lastTargetMailbox;
38c944cc 798
906f7e9f 799$imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
91c27aee 800$aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
801
c3731db5 802
91c27aee 803/**
c3731db5 804 Start code to set the columns to fetch in case of hitting the next/prev link
805 The reason for this is the fact that the cache can be invalidated which means that the headers
806 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
807
808 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
809*/
810
811/**
812 * Replace From => To in case it concerns a draft or sent folder
813 */
199ff86a 814$aColumns = array();
c3731db5 815if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
816 !in_array(SQM_COL_TO,$index_order)) {
817 $aNewOrder = array(); // nice var name ;)
818 foreach($index_order as $iCol) {
819 if ($iCol == SQM_COL_FROM) {
820 $iCol = SQM_COL_TO;
821 }
199ff86a 822 $aColumns[$iCol] = array();
c3731db5 823 }
c3731db5 824} else {
199ff86a 825 foreach ($index_order as $iCol) {
826 $aColumns[$iCol] = array();
827 }
c3731db5 828}
829
830$aProps = array(
831 'columns' => $aColumns, // columns bound settings
832 'config' => array(
833 'highlight_list' => $message_highlight_list, // row highlighting rules
834 'trash_folder' => $trash_folder,
835 'sent_folder' => $sent_folder,
836 'draft_folder' => $draft_folder));
837
838calcFetchColumns($aMailbox,$aProps);
839
840/**
841 End code to set the columns to fetch in case of hitting the next/prev link
842*/
843
844
845
846/**
847 * Check if cache is still valid, $what contains the key
848 * which gives us acces to the array with uid's. At this moment
849 * 0 is used for a normal message list and search uses 1 as key. This can be
850 * changed / extended in the future.
851 * If on a select of a mailbox we detect that the cache should be invalidated due to
852 * the delete of messages or due to new messages we empty the list with uid's and
853 * that's what we detect below.
854 */
91c27aee 855if (!is_array($aMailbox['UIDSET'][$what])) {
d0b119a5 856 fetchMessageHeaders($imapConnection, $aMailbox);
91c27aee 857}
38c944cc 858
d0b119a5 859$iSetIndex = $aMailbox['SETINDEX'];
860$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
861
324ac3c5 862/**
863 * Update the seen state
864 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
865 */
866if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
867 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
e0e30169 868}
e0e30169 869
1e150c97 870/**
871 * Process Delete from delete-move-next
872 * but only if delete_id was set
873 */
874if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
324ac3c5 875 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
1e150c97 876}
877
878/**
38c944cc 879 * $message contains all information about the message
880 * including header and body
881 */
37d2a6ee 882
324ac3c5 883if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
884 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
885 $FirstTimeSee = !$message->is_seen;
38c944cc 886} else {
324ac3c5 887 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
888 $FirstTimeSee = !$message->is_seen;
889 $message->is_seen = true;
890 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 891}
dd628162 892if (isset($passed_ent_id) && $passed_ent_id) {
324ac3c5 893 $message = $message->getEntity($passed_ent_id);
894 if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
895 $message = $message->parent;
896 }
897 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
898 $rfc822_header = new Rfc822Header();
899 $rfc822_header->parseHeader($read);
900 $message->rfc822_header = $rfc822_header;
91c27aee 901} else if ($message->type0 == 'message' && $message->type1 == 'rfc822' && isset($message->entities[0])) {
902 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
903 $rfc822_header = new Rfc822Header();
904 $rfc822_header->parseHeader($read);
905 $message->rfc822_header = $rfc822_header;
c615b1da 906} else {
324ac3c5 907 $passed_ent_id = 0;
38c944cc 908}
5200c026 909$header = $message->header;
57257333 910
57257333 911
6206f6c4 912/****************************************/
913/* Block for handling incoming url vars */
914/****************************************/
5200c026 915
5200c026 916if (isset($sendreceipt)) {
917 if ( !$message->is_mdnsent ) {
27a1d10a 918 $final_recipient = '';
134e4174 919 if ((isset($identity)) && ($identity != 0)) //Main identity
27a1d10a 920 $final_recipient = trim(getPref($data_dir, $username, 'email_address' . $identity, '' ));
921 if ($final_recipient == '' )
922 $final_recipient = trim(getPref($data_dir, $username, 'email_address', '' ));
324ac3c5 923 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
fc224f68 924 if ( SendMDN( $mailbox, $passed_id, $final_recipient, $message, $imapConnection ) > 0 && $supportMDN ) {
6201339c 925 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
5200c026 926 $message->is_mdnsent = true;
1012f961 927 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 928 }
5200c026 929 }
930}
6206f6c4 931/***********************************************/
932/* End of block for handling incoming url vars */
933/***********************************************/
934
9f42bfc8 935$messagebody = '';
6e515418 936do_hook('read_body_top', $null);
c4ad259b 937if ($show_html_default == 1) {
938 $ent_ar = $message->findDisplayEntity(array());
939} else {
940 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
941}
a128c967 942$cnt = count($ent_ar);
943for ($i = 0; $i < $cnt; $i++) {
6a108031 944 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
a128c967 945 if ($i != $cnt-1) {
7d020720 946 $messagebody .= '<hr />';
a128c967 947 }
38c944cc 948}
e55c441a 949
202bcbcc 950/**
951 * Write mailbox with updated seen flag information back to cache.
952 */
953$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
954sqsession_register($mailbox_cache,'mailbox_cache');
955$_SESSION['mailbox_cache'] = $mailbox_cache;
202bcbcc 956
b89ceca6 957displayPageHeader($color, $mailbox,'','');
324ac3c5 958formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 959formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 960
961$oTemplate->assign('message_body', $messagebody);
962$oTemplate->display('read_message_body.tpl');
963
964formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 965
966/* show attached images inline -- if pref'fed so */
7d020720 967if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
968 $images = array();
a07cd1a4 969 foreach ($attachment_common_show_images_list as $img) {
ce274df9 970 $imgurl = SM_PATH . 'src/download.php' .
57257333 971 '?' .
cd7b8833 972 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 973 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 974 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 975 '&amp;absolute_dl=true';
7d020720 976 $a = array();
977 $a['Name'] = $img['name'];
978 $a['DisplayURL'] = $imgurl;
979 $a['DownloadURL'] = $img['download_href'];
980 $images[] = $a;
10f0ce72 981 }
67dc67bb 982
7d020720 983 $oTemplate->assign('images', $images);
984 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 985}
986
324ac3c5 987formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 988
6e515418 989do_hook('read_body_bottom', $null);
a07cd1a4 990sqimap_logout($imapConnection);
51d66ea2 991$oTemplate->display('footer.tpl');
210b5bb5 992?>