Prepend SM_PATH to $icon_theme_path since it is no longer returned by the template...
[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 }
7d020720 334
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 }
7d020720 343
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);
348
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,
77836429 357 $show_xmailer_default, $mdn_user_support, $PHP_SELF, $javascript_on,
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);
397
398 $env[_("Read Receipt")] = $oTemplate->fetch('read_handle_receipt.tpl');
d9c1dccc 399 }
400 }
401 }
7d020720 402 $env[_("Options")] = formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
c615b1da 403
7d020720 404 $oTemplate->assign('headers_to_display', $env);
405
406 $oTemplate->display('read_headers.tpl');
d9c1dccc 407}
c615b1da 408
1e150c97 409/**
4669e892 410 * Format message toolbar
411 *
1e150c97 412 * @param string $mailbox Name of current mailbox
413 * @param int $passed_id UID of current message
414 * @param int $passed_ent_id Id of entity within message
415 * @param object $message Current message object
416 * @param object $mbx_response
417 */
324ac3c5 418function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
7d020720 419 global $base_uri, $draft_folder, $where, $what, $sort,
4669e892 420 $startMessage, $PHP_SELF, $save_as_draft,
1e150c97 421 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
7d020720 422 $delete_prev_next_display, $show_copy_buttons,
423 $compose_new_win, $javascript_on, $compose_width, $compose_height,
424 $oTemplate;
c615b1da 425
e0e30169 426 //FIXME cleanup argument list, use $aMailbox where possible
427 $mailbox = $aMailbox['NAME'];
428
d9c1dccc 429 $urlMailbox = urlencode($mailbox);
c615b1da 430
1e150c97 431 $msgs_url = $base_uri . 'src/';
2ffa3f57 432
1e150c97 433 // Create Prev & Next links
434 // Handle nested entities first (i.e. Mime Attach parts)
7d020720 435 $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
436 $msg_list_href = $search_href = $view_msg_href = '';
1e150c97 437 if (isset($passed_ent_id) && $passed_ent_id) {
438 // code for navigating through attached message/rfc822 messages
d9c1dccc 439 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
70bdc740 440 $entities = array();
441 $entity_count = array();
442 $c = 0;
f2f03410 443
70bdc740 444 foreach($message->parent->entities as $ent) {
9f42bfc8 445 if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
7d020720 446
9f42bfc8 447 $c++;
448 $entity_count[$c] = $ent->entity_id;
449 $entities[$ent->entity_id] = $c;
450 }
70bdc740 451 }
1e150c97 452
91c27aee 453 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
70bdc740 454 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
7d020720 455 $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
70bdc740 456 }
1e150c97 457
91c27aee 458 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
70bdc740 459 $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
7d020720 460 $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
70bdc740 461 }
1e150c97 462
d9c1dccc 463 $par_ent_id = $message->parent->entity_id;
464 if ($par_ent_id) {
465 $par_ent_id = substr($par_ent_id,0,-2);
1e150c97 466 if ( $par_ent_id != 0 ) {
7d020720 467 $up_href = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
1e150c97 468 }
469 }
470
7d020720 471 $view_msg_href = $url;
1e150c97 472
473 // Prev/Next links for regular messages
324ac3c5 474 } else if ( true ) { //!(isset($where) && isset($what)) ) {
324ac3c5 475 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
476 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
1e150c97 477
1e150c97 478 if ($prev >= 0) {
7d020720 479 $prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 480 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 481 "&amp;where=$where&amp;what=$what" .
1e150c97 482 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
d9c1dccc 483 }
1e150c97 484
1e150c97 485 if ($next >= 0) {
7d020720 486 $next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 487 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 488 "&amp;where=$where&amp;what=$what" .
1e150c97 489 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
1e150c97 490 }
491
1e150c97 492 // Only bother with Delete & Prev and Delete & Next IF
6201339c 493 // top display is enabled.
4669e892 494 if ( $delete_prev_next_display == 1 &&
324ac3c5 495 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
1e150c97 496 if ($prev >= 0) {
7d020720 497 $del_prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 498 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
499 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 500 "&amp;where=$where&amp;what=$what" .
1e150c97 501 '&amp;delete_id='.$passed_id;
1e150c97 502 }
503
1e150c97 504 if ($next >= 0) {
7d020720 505 $del_next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 506 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
507 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 508 "&amp;where=$where&amp;what=$what" .
1e150c97 509 '&amp;delete_id='.$passed_id;
1e150c97 510 }
1e150c97 511 }
512 }
513
514 // Start with Search Results or Message List link.
7d020720 515 $list_xtra = "?where=read_body.php&amp;what=$what&amp;mailbox=" . $urlMailbox.
324ac3c5 516 "&amp;startMessage=$startMessage";
7d020720 517 $msg_list_href = $base_uri .'src/right_main.php'. $list_xtra;
518 $search_href = $where=='search.php' ? $base_uri .'src/search.php?'.$list_xtra : '';
1e150c97 519
98a9cc03 520 $comp_uri = $base_uri.'src/compose.php' .
521 '?passed_id=' . $passed_id .
522 '&amp;mailbox=' . $urlMailbox .
523 '&amp;startMessage=' . $startMessage .
524 (isset($passed_ent_id) ? '&amp;passed_ent_id='.$passed_ent_id : '');
4669e892 525
526 // Start form for reply/reply all/forward..
1a531551 527 $target = '';
528 $on_click='';
ee66175d 529 $method='method="post" ';
6190378c 530 $onsubmit='';
1a531551 531 if ($compose_new_win == '1') {
91c27aee 532 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
533 $compose_width = '640';
534 }
535 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
536 $compose_height = '550';
537 }
1a531551 538 if ( $javascript_on ) {
91c27aee 539 $on_click=' onclick="comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')"';
1a531551 540 $comp_uri = 'javascript:void(0)';
ee66175d 541 $method='method="get" ';
6190378c 542 $onsubmit = 'onsubmit="return false" ';
1a531551 543 } else {
544 $target = 'target="_blank"';
1a531551 545 }
546 }
547
7d020720 548 $oTemplate->assign('nav_on_top', $nav_on_top);
98a9cc03 549
7d020720 550 $oTemplate->assign('prev_href', $prev_href);
551 $oTemplate->assign('up_href', $up_href);
552 $oTemplate->assign('next_href', $next_href);
553 $oTemplate->assign('del_prev_href', $del_prev_href);
554 $oTemplate->assign('del_next_href', $del_next_href);
555 $oTemplate->assign('view_msg_href', $view_msg_href);
556
557 $oTemplate->assign('message_list_href', $msg_list_href);
558 $oTemplate->assign('search_href', $search_href);
559
560 $oTemplate->assign('form_extra', $method . $target . $onsubmit);
561 $oTemplate->assign('compose_href', $comp_uri);
562 $oTemplate->assign('button_onclick', $on_click);
563 $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==1);
564
1e150c97 565 // If Draft folder - create Resume link
7d020720 566 $resume_draft = $edit_as_new = false;
1e150c97 567 if (($mailbox == $draft_folder) && ($save_as_draft)) {
7d020720 568 $resume_draft = true; 'smaction_draft';
1e150c97 569 } else if (handleAsSent($mailbox)) {
7d020720 570 $edit_as_new = true;
1e150c97 571 }
7d020720 572 $oTemplate->assign('can_resume_draft', $resume_draft);
573 $oTemplate->assign('can_edit_as_new', $edit_as_new);
574
575 $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
576 if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
324ac3c5 577 $delete_url = $base_uri . "src/$where";
7d020720 578 $oTemplate->assign('can_be_deleted', true);
579 $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
580 $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
581 addHidden('msg[0]', $passed_id)."\n" .
582 addHidden('startMessage', $startMessage)."\n" );
4669e892 583 if (!(isset($passed_ent_id) && $passed_ent_id)) {
7d020720 584 $oTemplate->assign('can_be_moved', true);
585 $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
586 addHidden('msg[0]', $passed_id)."\n" );
587 $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
588 $oTemplate->assign('can_be_copied', $show_copy_buttons==1);
1e150c97 589 } else {
7d020720 590 $oTemplate->assign('can_be_moved', false);
591 $oTemplate->assign('move_form_extra', '');
592 $oTemplate->assign('last_move_target', '');
593 $oTemplate->assign('can_be_copied', false);
988e24f6 594 }
7d020720 595 } else {
596 $oTemplate->assign('can_be_deleted', false);
597 $oTemplate->assign('move_delete_form_action', '');
598 $oTemplate->assign('delete_form_extra', '');
599 $oTemplate->assign('can_be_moved', false);
600 $oTemplate->assign('move_form_extra', '');
601 $oTemplate->assign('last_move_target', '');
602 $oTemplate->assign('can_be_copied', false);
603 }
604
605 if ($nav_on_top) {
606 $oTemplate->display('read_menubar_nav.tpl');
607 $oTemplate->display('read_menubar_buttons.tpl');
608 } else {
609 $oTemplate->display('read_menubar_buttons.tpl');
610 $oTemplate->display('read_menubar_nav.tpl');
764971df 611 }
7d020720 612
d62c4938 613 do_hook('read_body_menu_bottom');
c615b1da 614}
615
616function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 617 global $base_uri, $where, $what, $show_html_default,
618 $oTemplate, $javascript_on, $download_href,
619 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 620
d9c1dccc 621 $urlMailbox = urlencode($mailbox);
78909469 622 $urlPassed_id = urlencode($passed_id);
623 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 624
78909469 625 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 626 if (!empty($where)) {
627 $query_string .= '&amp;where=' . urlencode($where);
628 }
78909469 629 if (!empty($what)) {
630 $query_string .= '&amp;what=' . urlencode($what);
631 }
e95c04ec 632 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 633
d9c1dccc 634
7d020720 635 // Build the printer friend link
636 /* hackydiehack */
637 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
638 $view_unsafe_images = false;
639 } else {
640 $view_unsafe_images = true;
40a34e57 641 }
7d020720 642 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
643 '&mailbox=' . $urlMailbox .
644 '&passed_id=' . $urlPassed_id .
645 '&view_unsafe_images='. (bool) $view_unsafe_images .
646 '&show_html_default=' . $show_html_default;
647 $links = array();
648 $links[] = array (
649 'URL' => $url,
650 'Text' => _("View Full Header")
651 );
652 $links[] = array (
653 'URL' => $pf_params,
654 'Text' => _("View Printable Version")
655 );
656 $links[] = array (
657 'URL' => $download_href,
658 'Text' => _("Download this is a file")
659 );
660 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
661 if (!empty($toggle)) {
662 $links[] = array (
663 'URL' => $toggle,
664 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
665 );
666 }
667 if (!empty($unsafe_image_toggle_href)) {
668 $links[] = array (
669 'URL' => $unsafe_image_toggle_href,
670 'Text' => $unsafe_image_toggle_text
671 );
672 }
673
674 do_hook('read_body_header_right', $links);
675
676 $oTemplate->assign('links', $links);
677
678 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 679}
680
6206f6c4 681/***************************/
2ffa3f57 682/* Main of read_body.php */
6206f6c4 683/***************************/
57257333 684
0b97a708 685/* get the globals we may need */
686
e95c04ec 687sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 688sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 689if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
690 $messages = array();
ce274df9 691}
81de00c0 692sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
693if (is_array($delayed_errors)) {
694 $oErrorHandler->AssignDelayedErrors($delayed_errors);
695 sqsession_unregister("delayed_errors");
696}
e95c04ec 697/** GET VARS */
698sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 699if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
700 $where = 'right_main.php';
701}
d0b119a5 702/*
703 * Used as entry key to the list of uid's cached in the mailbox cache
704 * we use the cached uid's to get the next and prev message.
705 */
324ac3c5 706if (!sqgetGlobalVar('what', $what, SQ_GET) ){
707 $what = 0;
708}
e95c04ec 709if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
710 $show_more = (int) $temp;
1b9f3c04 711}
e95c04ec 712if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
713 $show_more_cc = (int) $temp;
0b97a708 714}
e95c04ec 715if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
716 $show_more_bcc = (int) $temp;
0b97a708 717}
e95c04ec 718if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
719 $view_hdr = (int) $temp;
0b97a708 720}
e95c04ec 721
91c27aee 722if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
723 $iAccount = (int) $temp;
724} else {
725 $iAccount = 0;
726}
727
e95c04ec 728/** GET/POST VARS */
729sqgetGlobalVar('passed_ent_id', $passed_ent_id);
730sqgetGlobalVar('mailbox', $mailbox);
731
732if ( sqgetGlobalVar('passed_id', $temp) ) {
733 $passed_id = (int) $temp;
0b97a708 734}
e95c04ec 735if ( sqgetGlobalVar('sort', $temp) ) {
736 $sort = (int) $temp;
0b97a708 737}
e95c04ec 738if ( sqgetGlobalVar('startMessage', $temp) ) {
739 $startMessage = (int) $temp;
324ac3c5 740} else {
741 $startMessage = 1;
ce274df9 742}
7277191e 743if(sqgetGlobalVar('show_html_default', $temp)) {
744 $show_html_default = (int) $temp;
745}
746
747if(sqgetGlobalVar('view_unsafe_images', $temp)) {
748 $view_unsafe_images = (int) $temp;
749 if($view_unsafe_images == 1) {
750 $show_html_default = 1;
751 }
752} else {
753 $view_unsafe_images = 0;
754}
324ac3c5 755/**
756 * Retrieve mailbox cache
757 */
758sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 759
ce274df9 760/* end of get globals */
6201339c 761global $sqimap_capabilities, $lastTargetMailbox;
38c944cc 762
906f7e9f 763$imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
91c27aee 764$aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
765
c3731db5 766
91c27aee 767/**
c3731db5 768 Start code to set the columns to fetch in case of hitting the next/prev link
769 The reason for this is the fact that the cache can be invalidated which means that the headers
770 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
771
772 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
773*/
774
775/**
776 * Replace From => To in case it concerns a draft or sent folder
777 */
199ff86a 778$aColumns = array();
c3731db5 779if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
780 !in_array(SQM_COL_TO,$index_order)) {
781 $aNewOrder = array(); // nice var name ;)
782 foreach($index_order as $iCol) {
783 if ($iCol == SQM_COL_FROM) {
784 $iCol = SQM_COL_TO;
785 }
199ff86a 786 $aColumns[$iCol] = array();
c3731db5 787 }
c3731db5 788} else {
199ff86a 789 foreach ($index_order as $iCol) {
790 $aColumns[$iCol] = array();
791 }
c3731db5 792}
793
794$aProps = array(
795 'columns' => $aColumns, // columns bound settings
796 'config' => array(
797 'highlight_list' => $message_highlight_list, // row highlighting rules
798 'trash_folder' => $trash_folder,
799 'sent_folder' => $sent_folder,
800 'draft_folder' => $draft_folder));
801
802calcFetchColumns($aMailbox,$aProps);
803
804/**
805 End code to set the columns to fetch in case of hitting the next/prev link
806*/
807
808
809
810/**
811 * Check if cache is still valid, $what contains the key
812 * which gives us acces to the array with uid's. At this moment
813 * 0 is used for a normal message list and search uses 1 as key. This can be
814 * changed / extended in the future.
815 * If on a select of a mailbox we detect that the cache should be invalidated due to
816 * the delete of messages or due to new messages we empty the list with uid's and
817 * that's what we detect below.
818 */
91c27aee 819if (!is_array($aMailbox['UIDSET'][$what])) {
d0b119a5 820 fetchMessageHeaders($imapConnection, $aMailbox);
91c27aee 821}
38c944cc 822
d0b119a5 823$iSetIndex = $aMailbox['SETINDEX'];
824$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
825
324ac3c5 826/**
827 * Update the seen state
828 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
829 */
830if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
831 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
e0e30169 832}
e0e30169 833
1e150c97 834/**
835 * Process Delete from delete-move-next
836 * but only if delete_id was set
837 */
838if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
324ac3c5 839 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
1e150c97 840}
841
38c944cc 842/**
843 * $message contains all information about the message
844 * including header and body
845 */
37d2a6ee 846
324ac3c5 847if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
848 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
849 $FirstTimeSee = !$message->is_seen;
38c944cc 850} else {
324ac3c5 851 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
852 $FirstTimeSee = !$message->is_seen;
853 $message->is_seen = true;
854 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 855}
dd628162 856if (isset($passed_ent_id) && $passed_ent_id) {
324ac3c5 857 $message = $message->getEntity($passed_ent_id);
858 if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
859 $message = $message->parent;
860 }
861 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
862 $rfc822_header = new Rfc822Header();
863 $rfc822_header->parseHeader($read);
864 $message->rfc822_header = $rfc822_header;
91c27aee 865} else if ($message->type0 == 'message' && $message->type1 == 'rfc822' && isset($message->entities[0])) {
866 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
867 $rfc822_header = new Rfc822Header();
868 $rfc822_header->parseHeader($read);
869 $message->rfc822_header = $rfc822_header;
c615b1da 870} else {
324ac3c5 871 $passed_ent_id = 0;
38c944cc 872}
5200c026 873$header = $message->header;
57257333 874
57257333 875
6206f6c4 876/****************************************/
877/* Block for handling incoming url vars */
878/****************************************/
5200c026 879
5200c026 880if (isset($sendreceipt)) {
881 if ( !$message->is_mdnsent ) {
27a1d10a 882 $final_recipient = '';
134e4174 883 if ((isset($identity)) && ($identity != 0)) //Main identity
27a1d10a 884 $final_recipient = trim(getPref($data_dir, $username, 'email_address' . $identity, '' ));
885 if ($final_recipient == '' )
886 $final_recipient = trim(getPref($data_dir, $username, 'email_address', '' ));
324ac3c5 887 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
fc224f68 888 if ( SendMDN( $mailbox, $passed_id, $final_recipient, $message, $imapConnection ) > 0 && $supportMDN ) {
6201339c 889 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
5200c026 890 $message->is_mdnsent = true;
1012f961 891 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 892 }
5200c026 893 }
894}
6206f6c4 895/***********************************************/
896/* End of block for handling incoming url vars */
897/***********************************************/
898
9f42bfc8 899$messagebody = '';
c4ad259b 900do_hook('read_body_top');
901if ($show_html_default == 1) {
902 $ent_ar = $message->findDisplayEntity(array());
903} else {
904 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
905}
a128c967 906$cnt = count($ent_ar);
907for ($i = 0; $i < $cnt; $i++) {
6a108031 908 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
a128c967 909 if ($i != $cnt-1) {
7d020720 910 $messagebody .= '<hr />';
a128c967 911 }
38c944cc 912}
e55c441a 913
202bcbcc 914/**
915 * Write mailbox with updated seen flag information back to cache.
916 */
917$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
918sqsession_register($mailbox_cache,'mailbox_cache');
919$_SESSION['mailbox_cache'] = $mailbox_cache;
202bcbcc 920
b89ceca6 921displayPageHeader($color, $mailbox,'','');
324ac3c5 922formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 923formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 924
925$oTemplate->assign('message_body', $messagebody);
926$oTemplate->display('read_message_body.tpl');
927
928formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 929
930/* show attached images inline -- if pref'fed so */
7d020720 931if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
932 $images = array();
a07cd1a4 933 foreach ($attachment_common_show_images_list as $img) {
ce274df9 934 $imgurl = SM_PATH . 'src/download.php' .
57257333 935 '?' .
cd7b8833 936 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 937 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 938 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 939 '&amp;absolute_dl=true';
7d020720 940 $a = array();
941 $a['Name'] = $img['name'];
942 $a['DisplayURL'] = $imgurl;
943 $a['DownloadURL'] = $img['download_href'];
944 $images[] = $a;
10f0ce72 945 }
7d020720 946
947 $oTemplate->assign('images', $images);
948 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 949}
950
324ac3c5 951formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 952
c615b1da 953do_hook('read_body_bottom');
a07cd1a4 954sqimap_logout($imapConnection);
51d66ea2 955$oTemplate->display('footer.tpl');
7d020720 956?>