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