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