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