- Fix error with SpamCop reporting plugin not being able to send report as
[squirrelmail.git] / src / compose.php
CommitLineData
59177427 1<?php
35586184 2/**
3 * compose.php
4 *
35586184 5 * This code sends a mail.
6 *
7 * There are 4 modes of operation:
8 * - Start new mail
9 * - Add an attachment
10 * - Send mail
11 * - Save As Draft
12 *
1977ab55 13 * @copyright 1999-2010 The SquirrelMail Project Team
4b4abf93 14 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
30967a1e 15 * @version $Id$
8f6f9ba5 16 * @package squirrelmail
35586184 17 */
f7fb20fe 18
ebd2391c 19/** This is the compose page */
20define('PAGE_NAME', 'compose');
21
30967a1e 22/**
202bcbcc 23 * Include the SquirrelMail initialization file.
30967a1e 24 */
202bcbcc 25require('../include/init.php');
86725763 26
c90271cb 27/* If email_address not set and admin wants us to ask user for it,
28 * redirect to options page. */
29if ( $ask_user_info && getPref($data_dir, $username,'email_address') == "" ) {
30 header("Location: " . get_location() . "/options.php?optpage=personal");
31 exit;
32}
33
86725763 34/* SquirrelMail required files. */
202bcbcc 35require_once(SM_PATH . 'functions/imap_general.php');
36require_once(SM_PATH . 'functions/imap_messages.php');
86725763 37require_once(SM_PATH . 'functions/date.php');
38require_once(SM_PATH . 'functions/mime.php');
628bce99 39require_once(SM_PATH . 'functions/compose.php');
86725763 40require_once(SM_PATH . 'class/deliver/Deliver.class.php');
24192f77 41require_once(SM_PATH . 'functions/addressbook.php');
df96b37a 42require_once(SM_PATH . 'functions/forms.php');
a2b193bc 43require_once(SM_PATH . 'functions/identity.php');
91f2085b 44
0b97a708 45/* --------------------- Get globals ------------------------------------- */
0b97a708 46
953fa718 47/** SESSION VARS */
953fa718 48sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
49
f8eb968d 50sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
953fa718 51sqgetGlobalVar('composesession', $composesession, SQ_SESSION);
52sqgetGlobalVar('compose_messages', $compose_messages, SQ_SESSION);
f8eb968d 53
54// compose_messages only useful in SESSION when a forward-as-attachment
55// has been preconstructed for us and passed in via that mechanism; once
56// we have it, we can clear it from the SESSION
57sqsession_unregister('compose_messages');
762853f4 58
59// Turn on delayed error handling in case we wind up redirecting below
60$oErrorHandler->setDelayedErrors(true);
953fa718 61
62/** SESSION/POST/GET VARS */
61bd57f5 63sqgetGlobalVar('send_button_count', $send_button_count, SQ_POST, 1, SQ_TYPE_INT);
64for ($i = 1; $i <= $send_button_count; $i++)
65 if (sqgetGlobalVar('send' . $i, $send, SQ_POST)) break;
567dc524 66// Send can only be achieved by setting $_POST var. If Send = true then
67// retrieve other form fields from $_POST
68if (isset($send) && $send) {
69 $SQ_GLOBAL = SQ_POST;
70} else {
71 $SQ_GLOBAL = SQ_FORM;
72}
73sqgetGlobalVar('session',$session, $SQ_GLOBAL);
74sqgetGlobalVar('mailbox',$mailbox, $SQ_GLOBAL);
75if(!sqgetGlobalVar('identity',$identity, $SQ_GLOBAL)) {
1e2a6ff6 76 $identity=0;
77}
567dc524 78sqgetGlobalVar('send_to',$send_to, $SQ_GLOBAL);
79sqgetGlobalVar('send_to_cc',$send_to_cc, $SQ_GLOBAL);
80sqgetGlobalVar('send_to_bcc',$send_to_bcc, $SQ_GLOBAL);
81sqgetGlobalVar('subject',$subject, $SQ_GLOBAL);
82sqgetGlobalVar('body',$body, $SQ_GLOBAL);
83sqgetGlobalVar('mailprio',$mailprio, $SQ_GLOBAL);
84sqgetGlobalVar('request_mdn',$request_mdn, $SQ_GLOBAL);
85sqgetGlobalVar('request_dr',$request_dr, $SQ_GLOBAL);
86sqgetGlobalVar('html_addr_search',$html_addr_search, $SQ_GLOBAL);
87sqgetGlobalVar('mail_sent',$mail_sent, $SQ_GLOBAL);
51bbe8fa 88sqgetGlobalVar('passed_id',$passed_id, $SQ_GLOBAL, NULL, SQ_TYPE_BIGINT);
567dc524 89sqgetGlobalVar('passed_ent_id',$passed_ent_id, $SQ_GLOBAL);
e506b6e5 90sqgetGlobalVar('fwduid',$fwduid, $SQ_GLOBAL, '');
12a0ed01 91
567dc524 92sqgetGlobalVar('attach',$attach, SQ_POST);
93sqgetGlobalVar('draft',$draft, SQ_POST);
94sqgetGlobalVar('draft_id',$draft_id, $SQ_GLOBAL);
95sqgetGlobalVar('ent_num',$ent_num, $SQ_GLOBAL);
96sqgetGlobalVar('saved_draft',$saved_draft, SQ_FORM);
7e2ff844 97
98if ( sqgetGlobalVar('delete_draft',$delete_draft) ) {
99 $delete_draft = (int)$delete_draft;
100}
101
a6d3eff6 102if ( sqgetGlobalVar('startMessage',$startMessage) ) {
103 $startMessage = (int)$startMessage;
104} else {
105 $startMessage = 1;
106}
953fa718 107
8780308f 108
953fa718 109/** POST VARS */
167c6996 110sqgetGlobalVar('sigappend', $sigappend, SQ_POST);
111sqgetGlobalVar('from_htmladdr_search', $from_htmladdr_search, SQ_POST);
112sqgetGlobalVar('addr_search_done', $html_addr_search_done, SQ_POST);
113sqgetGlobalVar('addr_search_cancel', $html_addr_search_cancel, SQ_POST);
114sqgetGlobalVar('send_to_search', $send_to_search, SQ_POST);
115sqgetGlobalVar('do_delete', $do_delete, SQ_POST);
116sqgetGlobalVar('delete', $delete, SQ_POST);
f8eb968d 117sqgetGlobalVar('attachments', $attachments, SQ_POST);
953fa718 118if ( sqgetGlobalVar('return', $temp, SQ_POST) ) {
73ad81bf 119 $html_addr_search_done = 'Use Addresses';
953fa718 120}
121
122/** GET VARS */
8780308f 123if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
124 $iAccount = (int) $temp;
125} else {
126 $iAccount = 0;
127}
128
0b97a708 129
98a9cc03 130/** get smaction */
131if ( !sqgetGlobalVar('smaction',$action) )
132{
73ad81bf 133 if ( sqgetGlobalVar('smaction_reply',$tmp) ) $action = 'reply';
134 if ( sqgetGlobalVar('smaction_reply_all',$tmp) ) $action = 'reply_all';
135 if ( sqgetGlobalVar('smaction_forward',$tmp) ) $action = 'forward';
136 if ( sqgetGlobalVar('smaction_attache',$tmp) ) $action = 'forward_as_attachment';
137 if ( sqgetGlobalVar('smaction_draft',$tmp) ) $action = 'draft';
138 if ( sqgetGlobalVar('smaction_edit_new',$tmp) ) $action = 'edit_as_new';
98a9cc03 139}
140
199a9ab8 141sqgetGlobalVar('smtoken', $submitted_token, $SQ_GLOBAL, '');
142
7e2ff844 143/**
144 * Here we decode the data passed in from mailto.php.
145 */
146if ( sqgetGlobalVar('mailtodata', $mailtodata, SQ_GET) ) {
147 $trtable = array('to' => 'send_to',
148 'cc' => 'send_to_cc',
149 'bcc' => 'send_to_bcc',
150 'body' => 'body',
151 'subject' => 'subject');
152 $mtdata = unserialize($mailtodata);
1638beb6 153
7e2ff844 154 foreach ($trtable as $f => $t) {
155 if ( !empty($mtdata[$f]) ) {
156 $$t = $mtdata[$f];
157 }
158 }
159 unset($mailtodata,$mtdata, $trtable);
160}
161
39cf816f 162/* Location (For HTTP 1.1 header("Location: ...") redirects) */
3461167c 163$location = get_location();
1e2a6ff6 164/* Identities (fetch only once) */
165$idents = get_identities();
3461167c 166
09044055 167/* --------------------- Specific Functions ------------------------------ */
0b97a708 168
41b94d65 169function replyAllString($header) {
73ad81bf 170 global $include_self_reply_all, $idents;
171 $excl_ar = array();
172 /**
173 * 1) Remove the addresses we'll be sending the message 'to'
174 */
af084f6e 175 if (isset($header->reply_to)) {
176 $excl_ar = $header->getAddr_a('reply_to');
73ad81bf 177 }
178 /**
179 * 2) Remove our identities from the CC list (they still can be in the
180 * TO list) only if $include_self_reply_all is turned off
181 */
182 if (!$include_self_reply_all) {
183 foreach($idents as $id) {
184 $excl_ar[strtolower(trim($id['email_address']))] = '';
185 }
186 }
187
188 /**
189 * 3) get the addresses.
190 */
191 $url_replytoall_ar = $header->getAddr_a(array('to','cc'), $excl_ar);
192
193 /**
194 * 4) generate the string.
195 */
196 $url_replytoallcc = '';
197 foreach( $url_replytoall_ar as $email => $personal) {
198 if ($personal) {
199 // if personal name contains address separator then surround
200 // the personal name with double quotes.
201 if (strpos($personal,',') !== false) {
202 $personal = '"'.$personal.'"';
203 }
204 $url_replytoallcc .= ", $personal <$email>";
205 } else {
206 $url_replytoallcc .= ', '. $email;
1e2a6ff6 207 }
73ad81bf 208 }
209 $url_replytoallcc = substr($url_replytoallcc,2);
210
211 return $url_replytoallcc;
09044055 212}
213
50706f77 214/**
215 * creates top line in reply citations
216 *
217 * Line style depends on user preferences.
218 * $orig_date argument is available only from 1.4.3 and 1.5.1 version.
219 * @param object $orig_from From: header object.
220 * @param integer $orig_date email's timestamp
221 * @return string reply citation
222 */
b0323712 223function getReplyCitation($orig_from, $orig_date) {
12a0ed01 224 global $reply_citation_style, $reply_citation_start, $reply_citation_end;
50706f77 225
05f7db7a 226 if (!is_object($orig_from)) {
d1205176 227 $sOrig_from = '';
05f7db7a 228 } else {
d1205176 229 $sOrig_from = decodeHeader($orig_from->getAddress(false),false,false,true);
05f7db7a 230 }
91c27aee 231
12a0ed01 232 /* First, return an empty string when no citation style selected. */
233 if (($reply_citation_style == '') || ($reply_citation_style == 'none')) {
234 return '';
235 }
236
237 /* Make sure our final value isn't an empty string. */
d1205176 238 if ($sOrig_from == '') {
12a0ed01 239 return '';
240 }
241
242 /* Otherwise, try to select the desired citation style. */
243 switch ($reply_citation_style) {
50706f77 244 case 'author_said':
b986936a 245 // i18n: %s is for author's name
d1205176 246 $full_reply_citation = sprintf(_("%s wrote:"),$sOrig_from);
50706f77 247 break;
248 case 'quote_who':
a42c236f 249 $start = '<quote who="';
50706f77 250 $end = '">';
d1205176 251 $full_reply_citation = $start . $sOrig_from . $end;
50706f77 252 break;
253 case 'date_time_author':
b986936a 254 // i18n:
255 // The first %s is for date string, the second %s is for author's name.
256 // The date uses formating from "D, F j, Y g:i a" and "D, F j, Y H:i"
257 // translations.
258 // Example string:
259 // "On Sat, December 24, 2004 23:59, Santa wrote:"
260 // If you have to put author's name in front of date string, check comments about
261 // argument swapping at http://php.net/sprintf
d1205176 262 $full_reply_citation = sprintf(_("On %s, %s wrote:"), getLongDateString($orig_date), $sOrig_from);
50706f77 263 break;
264 case 'user-defined':
265 $start = $reply_citation_start .
266 ($reply_citation_start == '' ? '' : ' ');
267 $end = $reply_citation_end;
d1205176 268 $full_reply_citation = $start . $sOrig_from . $end;
50706f77 269 break;
270 default:
271 return '';
272 }
273
274 /* Add line feed and return the citation string. */
275 return ($full_reply_citation . "\n");
12a0ed01 276}
277
50706f77 278/**
279 * Creates header fields in forwarded email body
280 *
91c27aee 281 * $default_charset global must be set correctly before you call this function.
50706f77 282 * @param object $orig_header
91c27aee 283 * @return $string
50706f77 284 */
41b94d65 285function getforwardHeader($orig_header) {
50706f77 286 global $editor_size, $default_charset;
287
288 // using own strlen function in order to detect correct string length
289 $display = array( _("Subject") => sq_strlen(_("Subject"),$default_charset),
290 _("From") => sq_strlen(_("From"),$default_charset),
291 _("Date") => sq_strlen(_("Date"),$default_charset),
292 _("To") => sq_strlen(_("To"),$default_charset),
293 _("Cc") => sq_strlen(_("Cc"),$default_charset) );
73ad81bf 294 $maxsize = max($display);
295 $indent = str_pad('',$maxsize+2);
296 foreach($display as $key => $val) {
297 $display[$key] = $key .': '. str_pad('', $maxsize - $val);
298 }
299 $from = decodeHeader($orig_header->getAddr_s('from',"\n$indent"),false,false,true);
300 $from = str_replace('&nbsp;',' ',$from);
301 $to = decodeHeader($orig_header->getAddr_s('to',"\n$indent"),false,false,true);
302 $to = str_replace('&nbsp;',' ',$to);
303 $subject = decodeHeader($orig_header->subject,false,false,true);
304 $subject = str_replace('&nbsp;',' ',$subject);
50706f77 305
306 // using own str_pad function in order to create correct string pad
307 $bodyTop = sq_str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH,$default_charset) .
73ad81bf 308 "\n". $display[_("Subject")] . $subject . "\n" .
309 $display[_("From")] . $from . "\n" .
3aaa3214 310 $display[_("Date")] . getLongDateString( $orig_header->date, $orig_header->date_unparsed ). "\n" .
73ad81bf 311 $display[_("To")] . $to . "\n";
312 if ($orig_header->cc != array() && $orig_header->cc !='') {
313 $cc = decodeHeader($orig_header->getAddr_s('cc',"\n$indent"),false,false,true);
314 $cc = str_replace('&nbsp;',' ',$cc);
315 $bodyTop .= $display[_("Cc")] .$cc . "\n";
316 }
317 $bodyTop .= str_pad('', $editor_size -2 , '-') .
318 "\n\n";
319 return $bodyTop;
41b94d65 320}
09044055 321/* ----------------------------------------------------------------------- */
322
44560457 323/*
1c044820 324 * If the session is expired during a post this restores the compose session
44560457 325 * vars.
326 */
f8eb968d 327$session_expired = false;
5da08ef7 328if (sqsession_is_registered('session_expired_post')) {
953fa718 329 sqgetGlobalVar('session_expired_post', $session_expired_post, SQ_SESSION);
1c044820 330 /*
40934000 331 * extra check for username so we don't display previous post data from
332 * another user during this session.
333 */
c7ebdfcf 334 if (!empty($session_expired_post['username'])
335 && $session_expired_post['username'] == $username) {
1638beb6 336 // these are the vars that we can set from the expired composed session
f8eb968d 337 $compo_var_list = array ('send_to', 'send_to_cc', 'body',
338 'startMessage', 'passed_body', 'use_signature', 'signature',
339 'subject', 'newmail', 'send_to_bcc', 'passed_id', 'mailbox',
340 'from_htmladdr_search', 'identity', 'draft_id', 'delete_draft',
341 'mailprio', 'edit_as_new', 'attachments', 'composesession',
e506b6e5 342 'request_mdn', 'request_dr', 'fwduid');
c6f28eb1 343
344 foreach ($compo_var_list as $var) {
345 if ( isset($session_expired_post[$var]) && !isset($$var) ) {
774d79cc 346 $$var = $session_expired_post[$var];
61e96f7e 347 }
40934000 348 }
c6f28eb1 349
f8eb968d 350 if (!empty($attachments))
177cb345 351 $attachments = unserialize(urldecode($attachments));
f8eb968d 352
0ec1a14b 353 sqsession_register($composesession,'composesession');
f8eb968d 354
40934000 355 if (isset($send)) {
356 unset($send);
357 }
358 $session_expired = true;
359 }
5da08ef7 360 unset($session_expired_post);
0b97a708 361 sqsession_unregister('session_expired_post');
5da08ef7 362 session_write_close();
40934000 363 if (!isset($mailbox)) {
364 $mailbox = '';
365 }
366 if ($compose_new_win == '1') {
367 compose_Header($color, $mailbox);
368 } else {
91c27aee 369 $sHeaderJs = (isset($sHeaderJs)) ? $sHeaderJs : '';
370 if (strpos($action, 'reply') !== false && $reply_focus) {
ca14ebb7 371 $sOnload = 'checkForm(\''.$replyfocus.'\');';
91c27aee 372 } else {
ca14ebb7 373 $sOnload = 'checkForm();';
91c27aee 374 }
ca14ebb7 375 displayPageHeader($color, $mailbox,$sHeaderJs,$sOnload);
40934000 376 }
377 showInputForm($session, false);
378 exit();
44560457 379}
f8eb968d 380
da95c4b6 381if (!isset($composesession)) {
382 $composesession = 0;
a43e4b90 383 sqsession_register(0,'composesession');
7e2ff844 384} else {
385 $composesession = (int)$composesession;
da95c4b6 386}
387
d7f8e6e6 388if (!isset($session) || (isset($newmessage) && $newmessage)) {
0b97a708 389 sqsession_unregister('composesession');
1c044820 390 $session = "$composesession" +1;
91f2085b 391 $composesession = $session;
a43e4b90 392 sqsession_register($composesession,'composesession');
1c044820 393}
b4e7df34 394if (!empty($compose_messages[$session])) {
395 $composeMessage = $compose_messages[$session];
396} else {
73ad81bf 397 $composeMessage = new Message();
398 $rfc822_header = new Rfc822Header();
399 $composeMessage->rfc822_header = $rfc822_header;
400 $composeMessage->reply_rfc822_header = '';
a43e4b90 401}
a43e4b90 402
f8eb968d 403// re-add attachments that were already in this message
404// FIXME: note that technically this is very bad form -
405// should never directly manipulate an object like this
406if (!empty($attachments)) {
177cb345 407 $attachments = unserialize(urldecode($attachments));
f8eb968d 408 if (!empty($attachments) && is_array($attachments))
409 $composeMessage->entities = $attachments;
410}
411
876fdb60 412if (empty($mailbox)) {
00793a25 413 $mailbox = 'INBOX';
414}
415
4dfb9db7 416if ($draft) {
199a9ab8 417
418 // validate security token
419 //
420 sm_validate_security_token($submitted_token, 3600, TRUE);
421
4dfb9db7 422 /*
423 * Set $default_charset to correspond with the user's selection
424 * of language interface.
425 */
426 set_my_charset();
b7ff469f 427 if (! deliverMessage($composeMessage, true)) {
da95c4b6 428 showInputForm($session);
00793a25 429 exit();
734f4ee6 430 } else {
00793a25 431 $draft_message = _("Draft Email Saved");
432 /* If this is a resumed draft, then delete the original */
433 if(isset($delete_draft)) {
906f7e9f 434 $imap_stream = sqimap_login($username, false, $imapServerAddress, $imapPort, false);
b034bca2 435 sqimap_mailbox_select($imap_stream, $draft_folder);
436 // force bypass_trash=true because message should be saved when deliverMessage() returns true.
91c27aee 437 // in current implementation of sqimap_msgs_list_flag() single message id can
b034bca2 438 // be submitted as string. docs state that it should be array.
439 sqimap_msgs_list_delete($imap_stream, $draft_folder, $delete_draft, true);
440 if ($auto_expunge) {
441 sqimap_mailbox_expunge($imap_stream, $draft_folder, true);
9c3e6cd4 442 }
b034bca2 443 sqimap_logout($imap_stream);
444 }
1638beb6 445
762853f4 446 $oErrorHandler->saveDelayedErrors();
c077ffeb 447 session_write_close();
762853f4 448
b034bca2 449 if ($compose_new_win == '1') {
09047d19 450 if ( !isset($pageheader_sent) || !$pageheader_sent ) {
39cf816f 451 header("Location: $location/compose.php?saved_draft=yes&session=$composesession");
09047d19 452 } else {
c8dc86c9 453//FIXME: DON'T ECHO HTML FROM CORE!
f265009a 454 echo ' <br><br><div style="text-align: center;"><a href="' . $location
09047d19 455 . '/compose.php?saved_sent=yes&amp;session=' . $composesession . '">'
f265009a 456 . _("Return") . '</a></div>';
a6d3eff6 457 }
b034bca2 458 exit();
459 } else {
09047d19 460 if ( !isset($pageheader_sent) || !$pageheader_sent ) {
39cf816f 461 header("Location: $location/right_main.php?mailbox=" . urlencode($draft_folder) .
b034bca2 462 "&startMessage=1&note=".urlencode($draft_message));
09047d19 463 } else {
c8dc86c9 464//FIXME: DON'T ECHO HTML FROM CORE!
f265009a 465 echo ' <br><br><div style="text-align: center;"><a href="' . $location
09047d19 466 . '/right_main.php?mailbox=' . urlencode($draft_folder)
467 . '&amp;startMessage=1&amp;note=' . urlencode($draft_message) .'">'
f265009a 468 . _("Return") . '</a></div>';
a6d3eff6 469 }
b034bca2 470 exit();
00793a25 471 }
472 }
473}
474
4dfb9db7 475if ($send) {
199a9ab8 476
477 // validate security token
478 //
479 sm_validate_security_token($submitted_token, 3600, TRUE);
480
0b97a708 481 if (isset($_FILES['attachfile']) &&
73ad81bf 482 $_FILES['attachfile']['tmp_name'] &&
483 $_FILES['attachfile']['tmp_name'] != 'none') {
da95c4b6 484 $AttachFailure = saveAttachedFiles($session);
00793a25 485 }
d887e067 486
00793a25 487 if (checkInput(false) && !isset($AttachFailure)) {
73ad81bf 488 if ($mailbox == "All Folders") {
489 /* We entered compose via the search results page */
a42c236f 490 $mailbox = 'INBOX'; /* Send 'em to INBOX, that's safe enough */
73ad81bf 491 }
9a19cc66 492 $urlMailbox = urlencode($mailbox);
3f6b1b6f 493 if (! isset($passed_id)) {
494 $passed_id = 0;
00793a25 495 }
d4c5c50c 496 /**
00793a25 497 * Set $default_charset to correspond with the user's selection
7058a2a9 498 * of language interface.
00793a25 499 */
500 set_my_charset();
d4c5c50c 501 /**
00793a25 502 * This is to change all newlines to \n
7058a2a9 503 * We'll change them to \r\n later (in the sendMessage function)
00793a25 504 */
505 $body = str_replace("\r\n", "\n", $body);
506 $body = str_replace("\r", "\n", $body);
507
d4c5c50c 508 /**
18c9998a 509 * Rewrap $body so that no line is bigger than $editor_size
00793a25 510 */
18c9998a 511 $body = explode("\n", $body);
512 $newBody = '';
513 foreach ($body as $line) {
514 if( $line <> '-- ' ) {
73ad81bf 515 $line = rtrim($line);
18c9998a 516 }
774d79cc 517 if (sq_strlen($line, $default_charset) <= $editor_size + 1) {
18c9998a 518 $newBody .= $line . "\n";
519 } else {
774d79cc 520 sqWordWrap($line, $editor_size, $default_charset);
18c9998a 521 $newBody .= $line . "\n";
522
523 }
524
525 }
526 $body = $newBody;
1c044820 527
a91189d6 528 $Result = deliverMessage($composeMessage);
81de00c0 529
64793f9a 530 if ($Result)
531 $mail_sent = 'yes';
532 else
533 $mail_sent = 'no';
534
1638beb6 535 // NOTE: this hook changed in 1.5.2 from sending $Result and
6e515418 536 // $composeMessage as args #2 and #3 to being in an array
537 // under arg #2
802e7490 538 $temp = array(&$Result, &$composeMessage, &$mail_sent);
539 do_hook('compose_send_after', $temp);
00793a25 540 if (! $Result) {
da95c4b6 541 showInputForm($session);
00793a25 542 exit();
543 }
5c4ff7bf 544
b034bca2 545 /* if it is resumed draft, delete draft message */
00793a25 546 if ( isset($delete_draft)) {
906f7e9f 547 $imap_stream = sqimap_login($username, false, $imapServerAddress, $imapPort, false);
b034bca2 548 sqimap_mailbox_select($imap_stream, $draft_folder);
549 // bypass_trash=true because message should be saved when deliverMessage() returns true.
91c27aee 550 // in current implementation of sqimap_msgs_list_flag() single message id can
b034bca2 551 // be submitted as string. docs state that it should be array.
552 sqimap_msgs_list_delete($imap_stream, $draft_folder, $delete_draft, true);
553 if ($auto_expunge) {
554 sqimap_mailbox_expunge($imap_stream, $draft_folder, true);
555 }
556 sqimap_logout($imap_stream);
00793a25 557 }
81de00c0 558 /*
559 * Store the error array in the session because they will be lost on a redirect
560 */
762853f4 561 $oErrorHandler->saveDelayedErrors();
c077ffeb 562 session_write_close();
762853f4 563
9c3e6cd4 564 if ($compose_new_win == '1') {
09047d19 565 if ( !isset($pageheader_sent) || !$pageheader_sent ) {
39cf816f 566 header("Location: $location/compose.php?mail_sent=$mail_sent");
09047d19 567 } else {
c8dc86c9 568//FIXME: DON'T ECHO HTML FROM CORE!
f265009a 569 echo ' <br><br><div style="text-align: center;"><a href="' . $location
64793f9a 570 . '/compose.php?mail_sent=$mail_sent">'
f265009a 571 . _("Return") . '</a></div>';
09047d19 572 }
573 exit();
574 } else {
575 if ( !isset($pageheader_sent) || !$pageheader_sent ) {
39cf816f 576 header("Location: $location/right_main.php?mailbox=$urlMailbox".
64793f9a 577 "&startMessage=$startMessage&mail_sent=$mail_sent");
09047d19 578 } else {
c8dc86c9 579//FIXME: DON'T ECHO HTML FROM CORE!
f265009a 580 echo ' <br><br><div style="text-align: center;"><a href="' . $location
09047d19 581 . "/right_main.php?mailbox=$urlMailbox"
64793f9a 582 . "&amp;startMessage=$startMessage&amp;mail_sent=$mail_sent\">"
f265009a 583 . _("Return") . '</a></div>';
09047d19 584 }
585 exit();
9c3e6cd4 586 }
734f4ee6 587 } else {
9c3e6cd4 588 if ($compose_new_win == '1') {
589 compose_Header($color, $mailbox);
590 }
591 else {
592 displayPageHeader($color, $mailbox);
593 }
00793a25 594 if (isset($AttachFailure)) {
73ad81bf 595 plain_error_message(_("Could not move/copy file. File not attached"),
596 $color);
00793a25 597 }
00793a25 598 checkInput(true);
da95c4b6 599 showInputForm($session);
00793a25 600 /* sqimap_logout($imapConnection); */
601 }
e02775fe 602} elseif (isset($html_addr_search_done)) {
199a9ab8 603
604 // validate security token
605 //
606 sm_validate_security_token($submitted_token, 3600, TRUE);
607
73ad81bf 608 if ($compose_new_win == '1') {
609 compose_Header($color, $mailbox);
610 }
611 else {
612 displayPageHeader($color, $mailbox);
613 }
00793a25 614
615 if (isset($send_to_search) && is_array($send_to_search)) {
616 foreach ($send_to_search as $k => $v) {
617 if (substr($k, 0, 1) == 'T') {
618 if ($send_to) {
619 $send_to .= ', ';
620 }
621 $send_to .= $v;
622 }
623 elseif (substr($k, 0, 1) == 'C') {
624 if ($send_to_cc) {
625 $send_to_cc .= ', ';
626 }
627 $send_to_cc .= $v;
628 }
629 elseif (substr($k, 0, 1) == 'B') {
630 if ($send_to_bcc) {
631 $send_to_bcc .= ', ';
632 }
633 $send_to_bcc .= $v;
634 }
635 }
636 }
da95c4b6 637 showInputForm($session);
167c6996 638} elseif (isset($html_addr_search) && !isset($html_addr_search_cancel)) {
0b97a708 639 if (isset($_FILES['attachfile']) &&
73ad81bf 640 $_FILES['attachfile']['tmp_name'] &&
641 $_FILES['attachfile']['tmp_name'] != 'none') {
0b97a708 642 if(saveAttachedFiles($session)) {
cb34dbd0 643 plain_error_message(_("Could not move/copy file. File not attached"));
00793a25 644 }
645 }
646 /*
647 * I am using an include so as to elminiate an extra unnecessary
648 * click. If you can think of a better way, please implement it.
649 */
650 include_once('./addrbook_search_html.php');
e02775fe 651} elseif (isset($attach)) {
199a9ab8 652
653 // validate security token
654 //
655 sm_validate_security_token($submitted_token, 3600, TRUE);
656
73ad81bf 657 if ($compose_new_win == '1') {
658 compose_Header($color, $mailbox);
659 } else {
660 displayPageHeader($color, $mailbox);
661 }
5a3e52f3 662 if (saveAttachedFiles($session)) {
cb34dbd0 663 plain_error_message(_("Could not move/copy file. File not attached"));
5a3e52f3 664 }
da95c4b6 665 showInputForm($session);
01265fba 666}
667elseif (isset($sigappend)) {
199a9ab8 668
669 // validate security token
670 //
671 sm_validate_security_token($submitted_token, 3600, TRUE);
672
1e2a6ff6 673 $signature = $idents[$identity]['signature'];
674
01265fba 675 $body .= "\n\n".($prefix_sig==true? "-- \n":'').$signature;
676 if ($compose_new_win == '1') {
73ad81bf 677 compose_Header($color, $mailbox);
01265fba 678 } else {
679 displayPageHeader($color, $mailbox);
680 }
da95c4b6 681 showInputForm($session);
e02775fe 682} elseif (isset($do_delete)) {
199a9ab8 683
684 // validate security token
685 //
686 sm_validate_security_token($submitted_token, 3600, TRUE);
687
73ad81bf 688 if ($compose_new_win == '1') {
689 compose_Header($color, $mailbox);
690 } else {
691 displayPageHeader($color, $mailbox);
692 }
00793a25 693
00793a25 694 if (isset($delete) && is_array($delete)) {
695 foreach($delete as $index) {
a58b05b4 696 if (!empty($composeMessage->entities) && isset($composeMessage->entities[$index])) {
c077ffeb 697 $composeMessage->entities[$index]->purgeAttachments();
16449d84 698 // FIXME: one person reported that unset() didn't do anything at all here, so this is a work-around... but it triggers PHP notices if the unset() doesn't work, which should be fixed... but bigger question is if unset() doesn't work here, what about everywhere else? Anyway, uncomment this if you think you need it
699 //$composeMessage->entities[$index] = NULL;
a58b05b4 700 unset ($composeMessage->entities[$index]);
701 }
a91189d6 702 }
703 $new_entities = array();
704 foreach ($composeMessage->entities as $entity) {
705 $new_entities[] = $entity;
00793a25 706 }
a91189d6 707 $composeMessage->entities = $new_entities;
00793a25 708 }
da95c4b6 709 showInputForm($session);
734f4ee6 710} else {
00793a25 711 /*
712 * This handles the default case as well as the error case
1c044820 713 * (they had the same code) --> if (isset($smtpErrors))
00793a25 714 */
44560457 715
716 if ($compose_new_win == '1') {
73ad81bf 717 compose_Header($color, $mailbox);
44560457 718 } else {
73ad81bf 719 displayPageHeader($color, $mailbox);
44560457 720 }
00793a25 721
722 $newmail = true;
723
a61878d0 724 if (!isset($passed_ent_id)) {
725 $passed_ent_id = '';
726 }
727 if (!isset($passed_id)) {
1c044820 728 $passed_id = '';
a61878d0 729 }
730 if (!isset($mailbox)) {
731 $mailbox = '';
1c044820 732 }
a61878d0 733 if (!isset($action)) {
734 $action = '';
735 }
1c044820 736
44560457 737 $values = newMail($mailbox,$passed_id,$passed_ent_id, $action, $session);
b9928adc 738
739 /* in case the origin is not read_body.php */
740 if (isset($send_to)) {
73ad81bf 741 $values['send_to'] = $send_to;
b9928adc 742 }
743 if (isset($send_to_cc)) {
73ad81bf 744 $values['send_to_cc'] = $send_to_cc;
b9928adc 745 }
746 if (isset($send_to_bcc)) {
73ad81bf 747 $values['send_to_bcc'] = $send_to_bcc;
b9928adc 748 }
2a2f2185 749 if (isset($subject)) {
73ad81bf 750 $values['subject'] = $subject;
2a2f2185 751 }
41b94d65 752 showInputForm($session, $values);
00793a25 753}
754
755exit();
756
00793a25 757/**************** Only function definitions go below *************/
758
92c6f757 759function getforwardSubject($subject)
760{
761 if ((substr(strtolower($subject), 0, 4) != 'fwd:') &&
73ad81bf 762 (substr(strtolower($subject), 0, 5) != '[fwd:') &&
763 (substr(strtolower($subject), 0, 6) != '[ fwd:')) {
92c6f757 764 $subject = '[Fwd: ' . $subject . ']';
765 }
766 return $subject;
767}
00793a25 768
48985d59 769/* This function is used when not sending or adding attachments */
44560457 770function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $session='') {
1e2a6ff6 771 global $editor_size, $default_use_priority, $body, $idents,
ce68b76b 772 $use_signature, $data_dir, $username,
b4e7df34 773 $key, $imapServerAddress, $imapPort,
74f66d27 774 $composeMessage, $body_quote, $request_mdn, $request_dr,
856e58ef 775 $mdn_user_support, $languages, $squirrelmail_language,
776 $default_charset;
e7f1a81d 777
d4f20027 778 /*
779 * Set $default_charset to correspond with the user's selection
780 * of language interface. $default_charset global is not correct,
781 * if message is composed in new window.
782 */
783 set_my_charset();
784
91f2085b 785 $send_to = $send_to_cc = $send_to_bcc = $subject = $identity = '';
bdb92db3 786 $mailprio = 3;
44560457 787
41b94d65 788 if ($passed_id) {
906f7e9f 789 $imapConnection = sqimap_login($username, false, $imapServerAddress,
73ad81bf 790 $imapPort, 0);
a61878d0 791
48985d59 792 sqimap_mailbox_select($imapConnection, $mailbox);
41b94d65 793 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
1c044820 794
a61878d0 795 $body = '';
796 if ($passed_ent_id) {
797 /* redefine the messsage in case of message/rfc822 */
798 $message = $message->getEntity($passed_ent_id);
799 /* message is an entity which contains the envelope and type0=message
73ad81bf 800 * and type1=rfc822. The actual entities are childs from
801 * $message->entities[0]. That's where the encoding and is located
802 */
a61878d0 803
804 $entities = $message->entities[0]->findDisplayEntity
73ad81bf 805 (array(), $alt_order = array('text/plain'));
a61878d0 806 if (!count($entities)) {
807 $entities = $message->entities[0]->findDisplayEntity
9c462f8b 808 (array(), $alt_order = array('text/plain','text/html'));
a61878d0 809 }
810 $orig_header = $message->rfc822_header; /* here is the envelope located */
811 /* redefine the message for picking up the attachments */
812 $message = $message->entities[0];
813
814 } else {
815 $entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain'));
816 if (!count($entities)) {
9c462f8b 817 $entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain','text/html'));
a61878d0 818 }
819 $orig_header = $message->rfc822_header;
820 }
1c044820 821
a61878d0 822 $type0 = $message->type0;
823 $type1 = $message->type1;
41b94d65 824 foreach ($entities as $ent) {
b455e47b 825 $msg = $message->getEntity($ent);
826 $type0 = $msg->type0;
827 $type1 = $msg->type1;
a61878d0 828 $unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent);
829 $body_part_entity = $message->getEntity($ent);
1638beb6 830 $bodypart = decodeBody($unencoded_bodypart,
73ad81bf 831 $body_part_entity->header->encoding);
a61878d0 832 if ($type1 == 'html') {
5b755d9f 833 $bodypart = str_replace("\n", ' ', $bodypart);
bb977394 834 $bodypart = preg_replace(array('/<\/?p>/i','/<div><\/div>/i','/<br\s*(\/)*>/i','/<\/?div>/i'), "\n", $bodypart);
5b755d9f 835 $bodypart = str_replace(array('&nbsp;','&gt;','&lt;'),array(' ','>','<'),$bodypart);
a61878d0 836 $bodypart = strip_tags($bodypart);
837 }
e842b215 838 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
73ad81bf 839 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_decode')) {
e842b215 840 if (mb_detect_encoding($bodypart) != 'ASCII') {
f4bb5d22 841 $bodypart = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_decode', $bodypart);
e842b215 842 }
843 }
eceefdfe 844
bfa54da7 845 // charset encoding in compose form stuff
73ad81bf 846 if (isset($body_part_entity->header->parameters['charset'])) {
847 $actual = $body_part_entity->header->parameters['charset'];
848 } else {
849 $actual = 'us-ascii';
850 }
beca818e 851
73ad81bf 852 if ( $actual && is_conversion_safe($actual) && $actual != $default_charset){
853 $bodypart = charset_convert($actual,$bodypart,$default_charset,false);
854 }
bfa54da7 855 // end of charset encoding in compose
eceefdfe 856
a61878d0 857 $body .= $bodypart;
858 }
859 if ($default_use_priority) {
860 $mailprio = substr($orig_header->priority,0,1);
861 if (!$mailprio) {
862 $mailprio = 3;
863 }
864 } else {
865 $mailprio = '';
866 }
bdb92db3 867
a45887d7 868 $from_o = $orig_header->from;
fe868193 869 if (is_array($from_o)) {
870 if (isset($from_o[0])) {
871 $from_o = $from_o[0];
872 }
873 }
bdb92db3 874 if (is_object($from_o)) {
875 $orig_from = $from_o->getAddress();
876 } else {
877 $orig_from = '';
a61878d0 878 }
1e2a6ff6 879
a91189d6 880 $identities = array();
1e2a6ff6 881 if (count($idents) > 1) {
882 foreach($idents as $nr=>$data) {
883 $enc_from_name = '"'.$data['full_name'].'" <'. $data['email_address'].'>';
8d2d85f5 884 if(strtolower($enc_from_name) == strtolower($orig_from)) {
1e2a6ff6 885 $identity = $nr;
bc07287b 886 // don't stop! need to build $identities array for idents match below
887 //break;
a61878d0 888 }
a91189d6 889 $identities[] = $enc_from_name;
890 }
1e2a6ff6 891
a91189d6 892 $identity_match = $orig_header->findAddress($identities);
893 if ($identity_match) {
894 $identity = $identity_match;
a61878d0 895 }
bdb92db3 896 }
a61878d0 897
898 switch ($action) {
73ad81bf 899 case ('draft'):
900 $use_signature = FALSE;
901 $composeMessage->rfc822_header = $orig_header;
902 $send_to = decodeHeader($orig_header->getAddr_s('to'),false,false,true);
903 $send_to_cc = decodeHeader($orig_header->getAddr_s('cc'),false,false,true);
904 $send_to_bcc = decodeHeader($orig_header->getAddr_s('bcc'),false,false,true);
905 $send_from = $orig_header->getAddr_s('from');
906 $send_from_parts = new AddressStructure();
907 $send_from_parts = $orig_header->parseAddress($send_from);
908 $send_from_add = $send_from_parts->mailbox . '@' . $send_from_parts->host;
40e07136 909 $identity = find_identity(array($send_from_add));
73ad81bf 910 $subject = decodeHeader($orig_header->subject,false,false,true);
1638beb6 911
762853f4 912 // Remember the receipt settings
913 $request_mdn = $mdn_user_support && !empty($orig_header->dnt) ? '1' : '0';
914 $request_dr = $mdn_user_support && !empty($orig_header->drnt) ? '1' : '0';
1638beb6 915
73ad81bf 916 /* remember the references and in-reply-to headers in case of an reply */
657fe1bd 917//FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination (drafts folder?); is this possible?
73ad81bf 918 $composeMessage->rfc822_header->more_headers['References'] = $orig_header->references;
919 $composeMessage->rfc822_header->more_headers['In-Reply-To'] = $orig_header->in_reply_to;
920 // rewrap the body to clean up quotations and line lengths
921 sqBodyWrap($body, $editor_size);
922 $composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
923 break;
924 case ('edit_as_new'):
925 $send_to = decodeHeader($orig_header->getAddr_s('to'),false,false,true);
926 $send_to_cc = decodeHeader($orig_header->getAddr_s('cc'),false,false,true);
927 $send_to_bcc = decodeHeader($orig_header->getAddr_s('bcc'),false,false,true);
928 $subject = decodeHeader($orig_header->subject,false,false,true);
929 $mailprio = $orig_header->priority;
930 $orig_from = '';
931 $composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
932 // rewrap the body to clean up quotations and line lengths
933 sqBodyWrap($body, $editor_size);
934 break;
935 case ('forward'):
936 $send_to = '';
937 $subject = getforwardSubject(decodeHeader($orig_header->subject,false,false,true));
938 $body = getforwardHeader($orig_header) . $body;
939 // the logic for calling sqUnWordWrap here would be to allow the browser to wrap the lines
940 // forwarded message text should be as undisturbed as possible, so commenting out this call
941 // sqUnWordWrap($body);
942 $composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
91c27aee 943
73ad81bf 944 //add a blank line after the forward headers
945 $body = "\n" . $body;
946 break;
947 case ('forward_as_attachment'):
948 $subject = getforwardSubject(decodeHeader($orig_header->subject,false,false,true));
949 $composeMessage = getMessage_RFC822_Attachment($message, $composeMessage, $passed_id, $passed_ent_id, $imapConnection);
950 $body = '';
951 break;
952 case ('reply_all'):
953 if(isset($orig_header->mail_followup_to) && $orig_header->mail_followup_to) {
954 $send_to = $orig_header->getAddr_s('mail_followup_to');
b268e66b 955 } else {
73ad81bf 956 $send_to_cc = replyAllString($orig_header);
957 $send_to_cc = decodeHeader($send_to_cc,false,false,true);
b268e66b 958 }
73ad81bf 959 case ('reply'):
960 // skip this if send_to was already set right above here
961 if(!$send_to) {
962 $send_to = $orig_header->reply_to;
963 if (is_array($send_to) && count($send_to)) {
964 $send_to = $orig_header->getAddr_s('reply_to');
965 } else if (is_object($send_to)) { /* unneccesarry, just for failsafe purpose */
966 $send_to = $orig_header->getAddr_s('reply_to');
967 } else {
968 $send_to = $orig_header->getAddr_s('from');
969 }
dd4a44cd 970 }
73ad81bf 971 $send_to = decodeHeader($send_to,false,false,true);
972 $subject = decodeHeader($orig_header->subject,false,false,true);
973 $subject = str_replace('"', "'", $subject);
974 $subject = trim($subject);
975 if (substr(strtolower($subject), 0, 3) != 're:') {
976 $subject = 'Re: ' . $subject;
977 }
978 /* this corrects some wrapping/quoting problems on replies */
979 $rewrap_body = explode("\n", $body);
3aaa3214 980 $from = (is_array($orig_header->from) && !empty($orig_header->from)) ? $orig_header->from[0] : $orig_header->from;
73ad81bf 981 $body = '';
982 $strip_sigs = getPref($data_dir, $username, 'strip_sigs');
983 foreach ($rewrap_body as $line) {
3673a2de 984 if ($strip_sigs && rtrim($line, "\r\n") == '-- ') {
73ad81bf 985 break;
986 }
987 if (preg_match("/^(>+)/", $line, $matches)) {
988 $gt = $matches[1];
989 $body .= $body_quote . str_replace("\n", "\n$body_quote$gt ", rtrim($line)) ."\n";
990 } else {
991 $body .= $body_quote . (!empty($body_quote) ? ' ' : '') . str_replace("\n", "\n$body_quote" . (!empty($body_quote) ? ' ' : ''), rtrim($line)) . "\n";
992 }
a61878d0 993 }
c9d61baf 994
73ad81bf 995 //rewrap the body to clean up quotations and line lengths
996 $body = sqBodyWrap ($body, $editor_size);
c9d61baf 997
73ad81bf 998 $body = getReplyCitation($from , $orig_header->date) . $body;
999 $composeMessage->reply_rfc822_header = $orig_header;
12a0ed01 1000
73ad81bf 1001 break;
1002 default:
1003 break;
41b94d65 1004 }
b4e7df34 1005//FIXME: we used to register $compose_messages in the session here, but not any more - so do we still need the session_write_close() and sqimap_logout() here? We probably need the IMAP logout, but what about the session closure?
5da08ef7 1006 session_write_close();
a61878d0 1007 sqimap_logout($imapConnection);
41b94d65 1008 }
a61878d0 1009 $ret = array( 'send_to' => $send_to,
73ad81bf 1010 'send_to_cc' => $send_to_cc,
1011 'send_to_bcc' => $send_to_bcc,
1012 'subject' => $subject,
1013 'mailprio' => $mailprio,
1014 'body' => $body,
1015 'identity' => $identity );
a61878d0 1016
41b94d65 1017 return ($ret);
48985d59 1018} /* function newMail() */
1019
50706f77 1020/**
1021 * downloads attachments from original message, stores them in attachment directory and adds
1022 * them to composed message.
1023 * @param object $message
1024 * @param object $composeMessage
1025 * @param integer $passed_id
1026 * @param mixed $entities
1027 * @param mixed $imapConnection
91c27aee 1028 * @return object
50706f77 1029 */
a43e4b90 1030function getAttachments($message, &$composeMessage, $passed_id, $entities, $imapConnection) {
1f270d3c 1031 global $squirrelmail_language, $languages, $username, $attachment_dir;
628bce99 1032
1c044820 1033 if (!count($message->entities) ||
73ad81bf 1034 ($message->type0 == 'message' && $message->type1 == 'rfc822')) {
41b94d65 1035 if ( !in_array($message->entity_id, $entities) && $message->entity_id) {
73ad81bf 1036 switch ($message->type0) {
1037 case 'message':
1038 if ($message->type1 == 'rfc822') {
1039 $filename = $message->rfc822_header->subject;
1040 if ($filename == "") {
1041 $filename = "untitled-".$message->entity_id;
1042 }
6f71f6e6 1043 $filename .= '.eml';
73ad81bf 1044 } else {
1045 $filename = $message->getFilename();
181538ac 1046 }
73ad81bf 1047 break;
1048 default:
1049 if (!$message->mime_header) { /* temporary hack */
1050 $message->mime_header = $message->header;
1051 }
1052 $filename = $message->getFilename();
1053 break;
1054 }
1055 $filename = str_replace('&#32;', ' ', decodeHeader($filename));
1056 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
1057 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
f4bb5d22 1058 $filename = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $filename);
73ad81bf 1059 }
1f270d3c 1060
1061 $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
628bce99 1062 $localfilename = sq_get_attach_tempfile();
1063 $message->att_local_name = $localfilename;
73ad81bf 1064
1065 $composeMessage->initAttachment($message->type0.'/'.$message->type1,$filename,
628bce99 1066 $localfilename);
73ad81bf 1067
1068 /* Write Attachment to file */
1f270d3c 1069 $fp = fopen ($hashed_attachment_dir . '/' . $localfilename, 'wb');
91c27aee 1070 mime_print_body_lines ($imapConnection, $passed_id, $message->entity_id, $message->header->encoding, $fp);
73ad81bf 1071 fclose ($fp);
48985d59 1072 }
734f4ee6 1073 } else {
a43e4b90 1074 for ($i=0, $entCount=count($message->entities); $i<$entCount;$i++) {
1075 $composeMessage=getAttachments($message->entities[$i], $composeMessage, $passed_id, $entities, $imapConnection);
48985d59 1076 }
1077 }
a43e4b90 1078 return $composeMessage;
48985d59 1079}
1080
1c044820 1081function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id,
73ad81bf 1082 $passed_ent_id='', $imapConnection) {
756406df 1083 if (!$passed_ent_id) {
1c044820 1084 $body_a = sqimap_run_command($imapConnection,
73ad81bf 1085 'FETCH '.$passed_id.' RFC822',
1086 TRUE, $response, $readmessage,
1087 TRUE);
756406df 1088 } else {
1c044820 1089 $body_a = sqimap_run_command($imapConnection,
73ad81bf 1090 'FETCH '.$passed_id.' BODY['.$passed_ent_id.']',
1091 TRUE, $response, $readmessage, TRUE);
a61878d0 1092 $message = $message->parent;
756406df 1093 }
d0519c03 1094 if ($response == 'OK') {
a61878d0 1095 $subject = encodeHeader($message->rfc822_header->subject);
1096 array_shift($body_a);
1c044820 1097 array_pop($body_a);
a61878d0 1098 $body = implode('', $body_a) . "\r\n";
1c044820 1099
1f270d3c 1100 global $username, $attachment_dir;
1101 $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
628bce99 1102 $localfilename = sq_get_attach_tempfile();
1f270d3c 1103 $fp = fopen($hashed_attachment_dir . '/' . $localfilename, 'wb');
a61878d0 1104 fwrite ($fp, $body);
1105 fclose($fp);
6f71f6e6 1106 $composeMessage->initAttachment('message/rfc822',$subject.'.eml',
628bce99 1107 $localfilename);
a43e4b90 1108 }
1109 return $composeMessage;
a6ec592e 1110}
1111
41b94d65 1112function showInputForm ($session, $values=false) {
856e58ef 1113 global $send_to, $send_to_cc, $send_to_bcc,
f8eb968d 1114 $body, $startMessage, $action, $attachments,
b2b614bb 1115 $use_signature, $signature, $prefix_sig, $session_expired,
8d8da447 1116 $editor_size, $editor_height, $subject, $newmail,
e506b6e5 1117 $use_javascript_addr_book, $passed_id, $mailbox, $fwduid,
73ad81bf 1118 $from_htmladdr_search, $location_of_buttons, $attachment_dir,
ce68b76b 1119 $username, $data_dir, $identity, $idents, $delete_draft,
1120 $mailprio, $compose_new_win, $saved_draft, $mail_sent, $sig_first,
b4e7df34 1121 $composeMessage, $composesession, $default_charset,
762853f4 1122 $compose_onsubmit, $oTemplate, $oErrorHandler;
a43e4b90 1123
87745b9c 1124 if (checkForJavascript()) {
1125 $onfocus = ' onfocus="alreadyFocused=true;"';
1126 $onfocus_array = array('onfocus' => 'alreadyFocused=true;');
1127 }
1128 else {
1129 $onfocus = '';
1130 $onfocus_array = array();
1131 }
1132
41b94d65 1133 if ($values) {
73ad81bf 1134 $send_to = $values['send_to'];
1135 $send_to_cc = $values['send_to_cc'];
1136 $send_to_bcc = $values['send_to_bcc'];
1137 $subject = $values['subject'];
1138 $mailprio = $values['mailprio'];
1139 $body = $values['body'];
1140 $identity = (int) $values['identity'];
676bb189 1141 } else {
73ad81bf 1142 $send_to = decodeHeader($send_to, true, false);
1143 $send_to_cc = decodeHeader($send_to_cc, true, false);
1144 $send_to_bcc = decodeHeader($send_to_bcc, true, false);
41b94d65 1145 }
1c044820 1146
48985d59 1147 if ($use_javascript_addr_book) {
c8dc86c9 1148//FIXME: NO HTML IN CORE!
2c92ea9d 1149 echo "\n". '<script type="text/javascript">'."\n<!--\n" .
73ad81bf 1150 'function open_abook() { ' . "\n" .
1151 ' var nwin = window.open("addrbook_popup.php","abookpopup",' .
1152 '"width=670,height=300,resizable=yes,scrollbars=yes");' . "\n" .
1153 ' if((!nwin.opener) && (document.windows != null))' . "\n" .
1154 ' nwin.opener = document.windows;' . "\n" .
1155 "}\n" .
1156 "// -->\n</script>\n\n";
48985d59 1157 }
1158
c8dc86c9 1159//FIXME: NO HTML IN CORE!
4a1788b3 1160 echo "\n" . '<form name="compose" action="compose.php" method="post" ' .
73ad81bf 1161 'enctype="multipart/form-data"';
a34b07a5 1162
1163 $compose_onsubmit = array();
6e515418 1164 global $null;
1165 do_hook('compose_form', $null);
1c044820 1166
a34b07a5 1167 // Plugins that use compose_form hook can add an array entry
1168 // to the globally scoped $compose_onsubmit; we add them up
5c4ff7bf 1169 // here and format the form tag's full onsubmit handler.
1170 // Each plugin should use "return false" if they need to
a34b07a5 1171 // stop form submission but otherwise should NOT use "return
1172 // true" to give other plugins the chance to do what they need
1173 // to do; SquirrelMail itself will add the final "return true".
1174 // Onsubmit text is enclosed inside of double quotes, so plugins
1175 // need to quote accordingly.
1176 if (checkForJavascript()) {
5c4ff7bf 1177 if (empty($compose_onsubmit))
a34b07a5 1178 $compose_onsubmit = array();
5c4ff7bf 1179 else if (!is_array($compose_onsubmit))
a34b07a5 1180 $compose_onsubmit = array($compose_onsubmit);
1181
82dcbb1e 1182 $onsubmit_text = '';
a34b07a5 1183 foreach ($compose_onsubmit as $text) {
1184 $text = trim($text);
82dcbb1e 1185 if (!empty($text)) {
1186 if (substr($text, -1) != ';' && substr($text, -1) != '}')
1187 $text .= '; ';
1188 $onsubmit_text .= $text;
1189 }
a34b07a5 1190 }
1191
82dcbb1e 1192 if (!empty($onsubmit_text))
c8dc86c9 1193//FIXME: DON'T ECHO HTML FROM CORE!
82dcbb1e 1194 echo ' onsubmit="' . $onsubmit_text . ' return true;"';
a34b07a5 1195 }
5c4ff7bf 1196
a34b07a5 1197
c8dc86c9 1198//FIXME: NO HTML IN CORE!
48985d59 1199 echo ">\n";
1200
199a9ab8 1201//FIXME: DON'T ECHO HTML FROM CORE!
1202 echo addHidden('smtoken', sm_generate_security_token());
1203
c8dc86c9 1204//FIXME: DON'T ECHO HTML FROM CORE!
df96b37a 1205 echo addHidden('startMessage', $startMessage);
4a1788b3 1206
41b94d65 1207 if ($action == 'draft') {
c8dc86c9 1208//FIXME: DON'T ECHO HTML FROM CORE!
df96b37a 1209 echo addHidden('delete_draft', $passed_id);
48985d59 1210 }
1211 if (isset($delete_draft)) {
c8dc86c9 1212//FIXME: DON'T ECHO HTML FROM CORE!
df96b37a 1213 echo addHidden('delete_draft', $delete_draft);
48985d59 1214 }
da95c4b6 1215 if (isset($session)) {
c8dc86c9 1216//FIXME: DON'T ECHO HTML FROM CORE!
df96b37a 1217 echo addHidden('session', $session);
da95c4b6 1218 }
1c044820 1219
08bad2b1 1220 if (isset($passed_id)) {
c8dc86c9 1221//FIXME: DON'T ECHO HTML FROM CORE!
df96b37a 1222 echo addHidden('passed_id', $passed_id);
08bad2b1 1223 }
44560457 1224
e506b6e5 1225 if (isset($fwduid)) {
1226//FIXME: DON'T ECHO HTML FROM CORE!
1227 echo addHidden('fwduid', $fwduid);
1228 }
1229
9c3e6cd4 1230 if ($saved_draft == 'yes') {
774d79cc 1231 $oTemplate->assign('note', _("Your draft has been saved."));
762853f4 1232 $oTemplate->display('note.tpl');
9c3e6cd4 1233 }
1234 if ($mail_sent == 'yes') {
774d79cc 1235 $oTemplate->assign('note', _("Your mail has been sent."));
762853f4 1236 $oTemplate->display('note.tpl');
9c3e6cd4 1237 }
9c3e6cd4 1238 if ($compose_new_win == '1') {
762853f4 1239 $oTemplate->display('compose_newwin_close.tpl');
9c3e6cd4 1240 }
1638beb6 1241
78a35fcd 1242 if ($location_of_buttons == 'top') {
c8dc86c9 1243//FIXME: DON'T ECHO HTML FROM CORE!
78a35fcd 1244 showComposeButtonRow();
1245 }
48985d59 1246
762853f4 1247 $identities = array();
1e2a6ff6 1248 if (count($idents) > 1) {
762853f4 1249 reset($idents);
73ad81bf 1250 foreach($idents as $id => $data) {
762853f4 1251 $identities[$id] = $data['full_name'].' &lt;'.$data['email_address'].'&gt;';
73ad81bf 1252 }
762853f4 1253 }
1638beb6 1254
762853f4 1255 $oTemplate->assign('identities', $identities);
1256 $oTemplate->assign('identity_def', $identity);
1257 $oTemplate->assign('input_onfocus', 'onfocus="'.join(' ', $onfocus_array).'"');
1638beb6 1258
762853f4 1259 $oTemplate->assign('to', htmlspecialchars($send_to));
1260 $oTemplate->assign('cc', htmlspecialchars($send_to_cc));
1261 $oTemplate->assign('bcc', htmlspecialchars($send_to_bcc));
1262 $oTemplate->assign('subject', htmlspecialchars($subject));
1638beb6 1263
8949acd6 1264 // access keys...
1265 //
1266 global $accesskey_compose_to, $accesskey_compose_cc,
5f20677e 1267 $accesskey_compose_identity, $accesskey_compose_bcc,
1268 $accesskey_compose_subject;
1269 $oTemplate->assign('accesskey_compose_identity', $accesskey_compose_identity);
8949acd6 1270 $oTemplate->assign('accesskey_compose_to', $accesskey_compose_to);
1271 $oTemplate->assign('accesskey_compose_cc', $accesskey_compose_cc);
1272 $oTemplate->assign('accesskey_compose_bcc', $accesskey_compose_bcc);
1273 $oTemplate->assign('accesskey_compose_subject', $accesskey_compose_subject);
1274
762853f4 1275 $oTemplate->display('compose_header.tpl');
48985d59 1276
78a35fcd 1277 if ($location_of_buttons == 'between') {
c8dc86c9 1278//FIXME: DON'T ECHO HTML FROM CORE!
78a35fcd 1279 showComposeButtonRow();
1280 }
4dfb9db7 1281
762853f4 1282 $body_str = '';
48985d59 1283 if ($use_signature == true && $newmail == true && !isset($from_htmladdr_search)) {
1e2a6ff6 1284 $signature = $idents[$identity]['signature'];
d3c13a51 1285
3b17e952 1286 if ($sig_first == '1') {
50706f77 1287 /*
1288 * FIXME: test is specific to ja_JP translation implementation.
1289 * This test might apply incorrect conversion to other translations, but
91c27aee 1290 * use of 7bit iso-2022-jp charset in other translations might have other
50706f77 1291 * issues too.
1292 */
ab4700c3 1293 if ($default_charset == 'iso-2022-jp') {
762853f4 1294 $body_str = "\n\n".($prefix_sig==true? "-- \n":'').mb_convert_encoding($signature, 'EUC-JP');
83be314a 1295 } else {
762853f4 1296 $body_str = "\n\n".($prefix_sig==true? "-- \n":'').decodeHeader($signature,false,false);
83be314a 1297 }
762853f4 1298 $body_str .= "\n\n".htmlspecialchars(decodeHeader($body,false,false));
1299 } else {
1300 $body_str = "\n\n".htmlspecialchars(decodeHeader($body,false,false));
50706f77 1301 // FIXME: test is specific to ja_JP translation implementation. See above comments.
ab4700c3 1302 if ($default_charset == 'iso-2022-jp') {
762853f4 1303 $body_str .= "\n\n".($prefix_sig==true? "-- \n":'').mb_convert_encoding($signature, 'EUC-JP');
1304 } else {
1305 $body_str .= "\n\n".($prefix_sig==true? "-- \n":'').decodeHeader($signature,false,false);
73ad81bf 1306 }
3b17e952 1307 }
73ad81bf 1308 } else {
762853f4 1309 $body_str = htmlspecialchars(decodeHeader($body,false,false));
48985d59 1310 }
12a0ed01 1311
762853f4 1312 $oTemplate->assign('editor_width', (int)$editor_size);
1313 $oTemplate->assign('editor_height', (int)$editor_height);
1314 $oTemplate->assign('input_onfocus', 'onfocus="'.join(' ', $onfocus_array).'"');
1315 $oTemplate->assign('body', $body_str);
1316 $oTemplate->assign('show_bottom_send', $location_of_buttons!='bottom');
1638beb6 1317
8949acd6 1318 // access keys...
1319 //
1320 global $accesskey_compose_body, $accesskey_compose_send;
1321 $oTemplate->assign('accesskey_compose_body', $accesskey_compose_body);
1322 $oTemplate->assign('accesskey_compose_send', $accesskey_compose_send);
1323
762853f4 1324 $oTemplate->display ('compose_body.tpl');
1638beb6 1325
48985d59 1326 if ($location_of_buttons == 'bottom') {
c8dc86c9 1327//FIXME: DON'T ECHO HTML FROM CORE!
48985d59 1328 showComposeButtonRow();
48985d59 1329 }
46bb8da8 1330
f8eb968d 1331 // composeMessage can be empty when coming from a restored session
1332 if (is_object($composeMessage) && $composeMessage->entities)
1333 $attach_array = $composeMessage->entities;
1334 if ($session_expired && !empty($attachments) && is_array($attachments))
1335 $attach_array = $attachments;
1336
48985d59 1337 /* This code is for attachments */
73ad81bf 1338 if ((bool) ini_get('file_uploads')) {
1339
1340 /* Calculate the max size for an uploaded file.
1341 * This is advisory for the user because we can't actually prevent
1342 * people to upload too large files. */
1343 $sizes = array();
1344 /* php.ini vars which influence the max for uploads */
1345 $configvars = array('post_max_size', 'memory_limit', 'upload_max_filesize');
1346 foreach($configvars as $var) {
4f21ba00 1347 /* skip 0 or empty values, and -1 which means 'unlimited' */
73ad81bf 1348 if( $size = getByteSize(ini_get($var)) ) {
4f21ba00 1349 if ( $size != '-1' ) {
1350 $sizes[] = $size;
1351 }
73ad81bf 1352 }
0a2c3218 1353 }
0a2c3218 1354
762853f4 1355 $attach = array();
1f270d3c 1356 global $username, $attachment_dir;
1357 $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
f8eb968d 1358 if (!empty($attach_array)) {
1359 foreach ($attach_array as $key => $attachment) {
73ad81bf 1360 $attached_file = $attachment->att_local_name;
1361 if ($attachment->att_local_name || $attachment->body_part) {
1362 $attached_filename = decodeHeader($attachment->mime_header->getParameter('name'));
1363 $type = $attachment->mime_header->type0.'/'.
a91189d6 1364 $attachment->mime_header->type1;
1638beb6 1365
762853f4 1366 $a = array();
1367 $a['Key'] = $key;
1368 $a['FileName'] = $attached_filename;
1369 $a['ContentType'] = $type;
1f270d3c 1370 $a['Size'] = filesize($hashed_attachment_dir . '/' . $attached_file);
762853f4 1371 $attach[$key] = $a;
73ad81bf 1372 }
1373 }
4dfb9db7 1374 }
1638beb6 1375
762853f4 1376 $max = min($sizes);
1377 $oTemplate->assign('max_file_size', empty($max) ? -1 : $max);
1378 $oTemplate->assign('attachments', $attach);
1638beb6 1379
8949acd6 1380 // access keys...
1381 //
1382 global $accesskey_compose_attach_browse, $accesskey_compose_attach,
1383 $accesskey_compose_delete_attach;
1384 $oTemplate->assign('accesskey_compose_attach_browse', $accesskey_compose_attach_browse);
1385 $oTemplate->assign('accesskey_compose_attach', $accesskey_compose_attach);
1386 $oTemplate->assign('accesskey_compose_delete_attach', $accesskey_compose_delete_attach);
1387
762853f4 1388 $oTemplate->display('compose_attachments.tpl');
73ad81bf 1389 } // End of file_uploads if-block
41b94d65 1390 /* End of attachment code */
762853f4 1391
253ad942 1392 $oTemplate->assign('username', $username);
1393 $oTemplate->assign('smaction', $action);
1394 $oTemplate->assign('mailbox', $mailbox);
953fa718 1395 sqgetGlobalVar('QUERY_STRING', $queryString, SQ_SERVER);
253ad942 1396 $oTemplate->assign('querystring', $queryString);
1397 $oTemplate->assign('composesession', $composesession);
1398 $oTemplate->assign('send_button_count', unique_widget_name('send', TRUE));
1399 if (!empty($attach_array))
1400 $oTemplate->assign('attachments', urlencode(serialize($attach_array)));
1401
1402 $aUserNotices = array();
1403
1404 // File uploads are off, so we didn't show that part of the form.
1405 // To avoid bogus bug reports, tell the user why.
a64f47e7 1406 if (!(bool) ini_get('file_uploads')) {
253ad942 1407 $aUserNotices[] = _("Because PHP file uploads are turned off, you can not attach files to this message. Please see your system administrator for details.");
a64f47e7 1408 }
1409
253ad942 1410 $oTemplate->assign('user_notices', $aUserNotices);
1411
1412 $oTemplate->display('compose_form_close.tpl');
1413
762853f4 1414 if ($compose_new_win=='1') {
1415 $oTemplate->display('compose_newwin_close.tpl');
1416 }
1638beb6 1417
762853f4 1418 $oErrorHandler->setDelayedErrors(false);
5c4ff7bf 1419 $oTemplate->display('footer.tpl');
48985d59 1420}
1421
1422
70c4fd84 1423function showComposeButtonRow() {
78a35fcd 1424 global $use_javascript_addr_book, $save_as_draft,
73ad81bf 1425 $default_use_priority, $mailprio, $default_use_mdn,
1426 $request_mdn, $request_dr,
1427 $data_dir, $username;
70c4fd84 1428
762853f4 1429 global $oTemplate, $buffer_hook;
1638beb6 1430
1431 if ($default_use_priority) {
762853f4 1432 $priorities = array('1'=>_("High"), '3'=>_("Normal"), '5'=>_("Low"));
1433 $priority = isset($mailprio) ? $mailprio : 3;
1434 } else {
1435 $priorities = array();
1436 $priority = NULL;
ae25968c 1437 }
1638beb6 1438
ae25968c 1439 $mdn_user_support=getPref($data_dir, $username, 'mdn_user_support',$default_use_mdn);
48985d59 1440
8949acd6 1441 $address_book_button_attribs = array();
1442 global $accesskey_compose_addresses;
1443 if ($accesskey_compose_addresses != 'NONE')
1444 $address_book_button_attribs['accesskey'] = $accesskey_compose_addresses;
c40a269e 1445 if ($use_javascript_addr_book && checkForJavascript()) {
8949acd6 1446 $addr_book = addButton(_("Addresses"),
1447 null,
1448 array_merge($address_book_button_attribs, array('onclick' => 'javascript:open_abook();')));
734f4ee6 1449 } else {
8949acd6 1450 $addr_book = addSubmit(_("Addresses"), 'html_addr_search', $address_book_button_attribs);
78a35fcd 1451 }
48985d59 1452
762853f4 1453 $oTemplate->assign('allow_priority', $default_use_priority==1);
1454 $oTemplate->assign('priority_list', $priorities);
1455 $oTemplate->assign('current_priority', $priority);
1638beb6 1456
762853f4 1457 $oTemplate->assign('notifications_enabled', $mdn_user_support==1);
1458 $oTemplate->assign('read_receipt', $request_mdn=='1');
1459 $oTemplate->assign('delivery_receipt', $request_dr=='1');
1638beb6 1460
762853f4 1461 $oTemplate->assign('drafts_enabled', $save_as_draft);
1462 $oTemplate->assign('address_book_button', $addr_book);
441f2d33 1463
8949acd6 1464 // access keys...
1465 //
1466 global $accesskey_compose_priority, $accesskey_compose_on_read,
1467 $accesskey_compose_on_delivery, $accesskey_compose_signature,
1468 $accesskey_compose_save_draft, $accesskey_compose_send;
1469 $oTemplate->assign('accesskey_compose_priority', $accesskey_compose_priority);
1470 $oTemplate->assign('accesskey_compose_on_read', $accesskey_compose_on_read);
1471 $oTemplate->assign('accesskey_compose_on_delivery', $accesskey_compose_on_delivery);
1472 $oTemplate->assign('accesskey_compose_signature', $accesskey_compose_signature);
1473 $oTemplate->assign('accesskey_compose_save_draft', $accesskey_compose_save_draft);
1474 $oTemplate->assign('accesskey_compose_send', $accesskey_compose_send);
1475
762853f4 1476 $oTemplate->display('compose_buttons.tpl');
78a35fcd 1477}
b278172f 1478
70c4fd84 1479function checkInput ($show) {
78a35fcd 1480 /*
1481 * I implemented the $show variable because the error messages
1482 * were getting sent before the page header. So, I check once
1483 * using $show=false, and then when i'm ready to display the error
1484 * message, show=true
1485 */
1356041d 1486 global $send_to, $send_to_cc, $send_to_bcc;
78a35fcd 1487
1356041d 1488 $send_to = trim($send_to);
1489 $send_to_cc = trim($send_to_cc);
1490 $send_to_bcc = trim($send_to_bcc);
1491 if (empty($send_to) && empty($send_to_cc) && empty($send_to_bcc)) {
78a35fcd 1492 if ($show) {
cb34dbd0 1493 plain_error_message(_("You have not filled in the \"To:\" field."));
78a35fcd 1494 }
1495 return false;
1496 }
1497 return true;
1498} /* function checkInput() */
df15de21 1499
3806fa52 1500
00793a25 1501/* True if FAILURE */
da95c4b6 1502function saveAttachedFiles($session) {
b4e7df34 1503 global $composeMessage, $username, $attachment_dir;
bfa54da7 1504
45cdd1b5 1505 /* get out of here if no file was attached at all */
1506 if (! is_uploaded_file($_FILES['attachfile']['tmp_name']) ) {
1507 return true;
1508 }
1509
1f270d3c 1510 $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
628bce99 1511 $localfilename = sq_get_attach_tempfile();
1f270d3c 1512 $fullpath = $hashed_attachment_dir . '/' . $localfilename;
4c9d2242 1513
a42c236f 1514 // m_u_f works better with restricted PHP installs (safe_mode, open_basedir),
1515 // if that doesn't work, try a simple rename.
8442ecb9 1516 if (!sq_call_function_suppress_errors('move_uploaded_file', array($_FILES['attachfile']['tmp_name'], $fullpath))) {
1517 if (!sq_call_function_suppress_errors('rename', array($_FILES['attachfile']['tmp_name'], $fullpath))) {
73ad81bf 1518 return true;
1519 }
a61878d0 1520 }
0b97a708 1521 $type = strtolower($_FILES['attachfile']['type']);
1522 $name = $_FILES['attachfile']['name'];
b4e7df34 1523 $composeMessage->initAttachment($type, $name, $localfilename);
4c9d2242 1524}
1525
5fe7d683 1526/**
1527 * Parse strings such as "8M" and "2k" into their corresponding size in bytes
1528 *
1529 * NOTE: This function only recognizes the suffixes "K", "M" and "G"
1530 * and will probably break very easily if the given size is in
1531 * some completely different format.
1532 *
1533 * @param string $ini_size The input string to be converted
1534 *
1535 * @return mixed Boolean FALSE if something went wrong (the value passed in
1536 * was empty?, the suffix was not recognized?), otherwise, the
1537 * converted size in bytes (just the number (as an integer),
1538 * no unit identifier included)
1539 *
1540 */
0a2c3218 1541function getByteSize($ini_size) {
1542
4d30dc83 1543 if(!$ini_size) {
1544 return FALSE;
1545 }
da95c4b6 1546
0a2c3218 1547 $ini_size = trim($ini_size);
1548
5b9716de 1549 // if there's some kind of letter at the end of the string we need to multiply.
1550 if(!is_numeric(substr($ini_size, -1))) {
1551
1552 switch(strtoupper(substr($ini_size, -1))) {
1553 case 'G':
73ad81bf 1554 $bytesize = 1073741824;
1555 break;
5b9716de 1556 case 'M':
73ad81bf 1557 $bytesize = 1048576;
1558 break;
5b9716de 1559 case 'K':
73ad81bf 1560 $bytesize = 1024;
1561 break;
5fe7d683 1562 default:
1563 return FALSE;
5b9716de 1564 }
1565
4d30dc83 1566 return ($bytesize * (int)substr($ini_size, 0, -1));
0a2c3218 1567 }
1c044820 1568
4d30dc83 1569 return $ini_size;
0a2c3218 1570}
a43e4b90 1571
4c9d2242 1572
50706f77 1573/**
1574 * temporary function to make use of the deliver class.
a42c236f 1575 * In the future the responsible backend should be automaticly loaded
50706f77 1576 * and conf.pl should show a list of available backends.
1577 * The message also should be constructed by the message class.
b67d61ee 1578 *
10adeb76 1579 * @param object $composeMessage The message being sent. Please note
1580 * that it is passed by reference and
1581 * will be returned modified, with additional
1582 * headers, such as Message-ID, Date, In-Reply-To,
1583 * References, and so forth.
1584 *
b67d61ee 1585 * @return boolean FALSE if delivery failed, or some non-FALSE value
1586 * upon success.
1587 *
73ad81bf 1588 */
10adeb76 1589function deliverMessage(&$composeMessage, $draft=false) {
a43e4b90 1590 global $send_to, $send_to_cc, $send_to_bcc, $mailprio, $subject, $body,
10adeb76 1591 $username, $identity, $idents, $data_dir,
856e58ef 1592 $request_mdn, $request_dr, $default_charset, $useSendmail,
1593 $domain, $action, $default_move_to_sent, $move_to_sent,
1594 $imapServerAddress, $imapPort, $sent_folder, $key;
a43e4b90 1595
1596 $rfc822_header = $composeMessage->rfc822_header;
24192f77 1597
1598 $abook = addressbook_init(false, true);
310dfeb6 1599 $rfc822_header->to = $rfc822_header->parseAddress($send_to,true, array(), '', $domain, array(&$abook,'lookup'));
1600 $rfc822_header->cc = $rfc822_header->parseAddress($send_to_cc,true,array(), '',$domain, array(&$abook,'lookup'));
1601 $rfc822_header->bcc = $rfc822_header->parseAddress($send_to_bcc,true, array(), '',$domain, array(&$abook,'lookup'));
a43e4b90 1602 $rfc822_header->priority = $mailprio;
1603 $rfc822_header->subject = $subject;
310dfeb6 1604
a43e4b90 1605 $special_encoding='';
1606 if (strtolower($default_charset) == 'iso-2022-jp') {
1607 if (mb_detect_encoding($body) == 'ASCII') {
a91189d6 1608 $special_encoding = '8bit';
a43e4b90 1609 } else {
1610 $body = mb_convert_encoding($body, 'JIS');
1611 $special_encoding = '7bit';
1612 }
1613 }
1614 $composeMessage->setBody($body);
1615
a43e4b90 1616 $reply_to = '';
1e2a6ff6 1617 $reply_to = $idents[$identity]['reply_to'];
40e07136 1618
1619 $from_addr = build_from_header($identity);
1620 $rfc822_header->from = $rfc822_header->parseAddress($from_addr,true);
a43e4b90 1621 if ($reply_to) {
73ad81bf 1622 $rfc822_header->reply_to = $rfc822_header->parseAddress($reply_to,true);
a43e4b90 1623 }
1624 /* Receipt: On Read */
1625 if (isset($request_mdn) && $request_mdn) {
40e07136 1626 $rfc822_header->dnt = $rfc822_header->parseAddress($from_addr,true);
762853f4 1627 } elseif (isset($rfc822_header->dnt)) {
1628 unset($rfc822_header->dnt);
a43e4b90 1629 }
1638beb6 1630
a43e4b90 1631 /* Receipt: On Delivery */
657fe1bd 1632 if (!empty($request_dr)) {
1633//FIXME: it would be better to fiddle with headers inside of the message object or possibly when delivering the message to its destination; is this possible?
cc51047f 1634 $rfc822_header->more_headers['Return-Receipt-To'] = $from_addr;
762853f4 1635 } elseif (isset($rfc822_header->more_headers['Return-Receipt-To'])) {
1636 unset($rfc822_header->more_headers['Return-Receipt-To']);
a43e4b90 1637 }
762853f4 1638
a43e4b90 1639 /* multipart messages */
1640 if (count($composeMessage->entities)) {
1641 $message_body = new Message();
a91189d6 1642 $message_body->body_part = $composeMessage->body_part;
1643 $composeMessage->body_part = '';
1644 $mime_header = new MessageHeader;
1645 $mime_header->type0 = 'text';
1646 $mime_header->type1 = 'plain';
1647 if ($special_encoding) {
1648 $mime_header->encoding = $special_encoding;
1c044820 1649 } else {
12a0ed01 1650 $mime_header->encoding = '8bit';
a91189d6 1651 }
1652 if ($default_charset) {
1653 $mime_header->parameters['charset'] = $default_charset;
1654 }
1c044820 1655 $message_body->mime_header = $mime_header;
a43e4b90 1656 array_unshift($composeMessage->entities, $message_body);
a91189d6 1657 $content_type = new ContentType('multipart/mixed');
a43e4b90 1658 } else {
1e2026df 1659 $content_type = new ContentType('text/plain');
1660 if ($special_encoding) {
1661 $rfc822_header->encoding = $special_encoding;
1c044820 1662 } else {
1e2026df 1663 $rfc822_header->encoding = '8bit';
1c044820 1664 }
426e0b72 1665 if ($default_charset) {
1666 $content_type->properties['charset']=$default_charset;
73ad81bf 1667 }
181538ac 1668 }
1c044820 1669
a43e4b90 1670 $rfc822_header->content_type = $content_type;
1671 $composeMessage->rfc822_header = $rfc822_header;
0fdb0aa1 1672 if ($action == 'reply' || $action == 'reply_all') {
1673 global $passed_id, $passed_ent_id;
1674 $reply_id = $passed_id;
1675 $reply_ent_id = $passed_ent_id;
1676 } else {
1677 $reply_id = '';
1678 $reply_ent_id = '';
1679 }
1638beb6 1680
1c044820 1681 /* Here you can modify the message structure just before we hand
6e515418 1682 it over to deliver; plugin authors note that $composeMessage
1683 is sent and modified by reference since 1.5.2 */
1684 do_hook('compose_send', $composeMessage);
a43e4b90 1685
b48d3c53 1686 if (!$useSendmail && !$draft) {
a91189d6 1687 require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
1688 $deliver = new Deliver_SMTP();
783e926e 1689 global $smtpServerAddress, $smtpPort, $pop_before_smtp, $pop_before_smtp_host;
a91189d6 1690
a91189d6 1691 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
783e926e 1692 if (empty($pop_before_smtp_host)) $pop_before_smtp_host = $smtpServerAddress;
9bd3b1e6 1693 get_smtp_user($user, $pass);
a91189d6 1694 $stream = $deliver->initStream($composeMessage,$domain,0,
783e926e 1695 $smtpServerAddress, $smtpPort, $user, $pass, $authPop, $pop_before_smtp_host);
b48d3c53 1696 } elseif (!$draft) {
73ad81bf 1697 require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
fd7ab795 1698 global $sendmail_path, $sendmail_args;
f3dc9c62 1699 // Check for outdated configuration
1700 if (!isset($sendmail_args)) {
1701 if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
1702 $sendmail_args = '';
1703 } else {
1704 $sendmail_args = '-i -t';
1705 }
1706 }
fd7ab795 1707 $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
73ad81bf 1708 $stream = $deliver->initStream($composeMessage,$sendmail_path);
b48d3c53 1709 } elseif ($draft) {
73ad81bf 1710 global $draft_folder;
906f7e9f 1711 $imap_stream = sqimap_login($username, false, $imapServerAddress,
73ad81bf 1712 $imapPort, 0);
1713 if (sqimap_mailbox_exists ($imap_stream, $draft_folder)) {
1714 require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
1715 $imap_deliver = new Deliver_IMAP();
a90d951c 1716 $success = $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id, $imap_stream, $draft_folder);
73ad81bf 1717 sqimap_logout($imap_stream);
1718 unset ($imap_deliver);
c077ffeb 1719 $composeMessage->purgeAttachments();
b67d61ee 1720 return $success;
4dfb9db7 1721 } else {
fd7ab795 1722 $msg = '<br />'.sprintf(_("Error: Draft folder %s does not exist."), htmlspecialchars($draft_folder));
cb34dbd0 1723 plain_error_message($msg);
73ad81bf 1724 return false;
a91189d6 1725 }
a43e4b90 1726 }
0c59bbe1 1727 $success = false;
a43e4b90 1728 if ($stream) {
10adeb76 1729 $deliver->mail($composeMessage, $stream, $reply_id, $reply_ent_id);
0c59bbe1 1730 $success = $deliver->finalizeStream($stream);
a43e4b90 1731 }
0c59bbe1 1732 if (!$success) {
fd7ab795 1733 // $deliver->dlv_server_msg is not always server's reply
6c3d00b5 1734 $msg = _("Message not sent.") . "<br />\n" .
1735 $deliver->dlv_msg;
a15f9d93 1736 if (!empty($deliver->dlv_server_msg)) {
1737 // add 'server replied' part only when it is not empty.
1738 // Delivery error can be generated by delivery class itself
1739 $msg.='<br />' .
1740 _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
1741 nl2br(htmlspecialchars($deliver->dlv_server_msg));
1742 }
cb34dbd0 1743 plain_error_message($msg);
a43e4b90 1744 } else {
1745 unset ($deliver);
906f7e9f 1746 $imap_stream = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
e4a1f097 1747
8780308f 1748
414303b8 1749 // mark as replied or forwarded if applicable
1750 //
e506b6e5 1751 global $what, $iAccount, $startMessage, $passed_id, $fwduid, $mailbox;
8780308f 1752
bc29bf70 1753 if ($action=='reply' || $action=='reply_all' || $action=='forward' || $action=='forward_as_attachment') {
202bcbcc 1754 require(SM_PATH . 'functions/mailbox_display.php');
8780308f 1755 $aMailbox = sqm_api_mailbox_select($imap_stream, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
bc29bf70 1756 switch($action) {
1757 case 'reply':
1758 case 'reply_all':
1759 // check if we are allowed to set the \\Answered flag
1760 if (in_array('\\answered',$aMailbox['PERMANENTFLAGS'], true)) {
1761 $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, array($passed_id), '\\Answered', true, false);
1762 if (isset($aUpdatedMsgs[$passed_id]['FLAGS'])) {
1763 /**
1764 * Only update the cached headers if the header is
1765 * cached.
1766 */
1767 if (isset($aMailbox['MSG_HEADERS'][$passed_id])) {
1768 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'] = $aMsg['FLAGS'];
1769 }
1770 }
1771 }
1772 break;
1773 case 'forward':
1774 case 'forward_as_attachment':
1775 // check if we are allowed to set the $Forwarded flag (RFC 4550 paragraph 2.8)
1638beb6 1776 if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
bc29bf70 1777 in_array('\\*',$aMailbox['PERMANENTFLAGS'])) {
1778
e506b6e5 1779 // when forwarding as an attachment from the message
1780 // list, passed_id is not used, need to get UID(s)
1781 // from the query string
1782 //
1783 if (empty($passed_id) && !empty($fwduid))
1784 $ids = explode('_', $fwduid);
1785 else
1786 $ids = array($passed_id);
1787
1788 $aUpdatedMsgs = sqimap_toggle_flag($imap_stream, $ids, '$Forwarded', true, false);
1789
1790 foreach ($ids as $id) {
1791 if (isset($aUpdatedMsgs[$id]['FLAGS'])) {
1792 if (isset($aMailbox['MSG_HEADERS'][$id])) {
1793 $aMailbox['MSG_HEADERS'][$id]['FLAGS'] = $aMsg['FLAGS'];
1794 }
bc29bf70 1795 }
bda07b93 1796 }
8780308f 1797 }
bc29bf70 1798 break;
8780308f 1799 }
bc29bf70 1800
4d1cb59a 1801 /**
1802 * Write mailbox with updated seen flag information back to cache.
1803 */
bc29bf70 1804 if(isset($aUpdatedMsgs[$passed_id])) {
1805 $mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
1806 sqsession_register($mailbox_cache,'mailbox_cache');
1807 }
1808
a91189d6 1809 }
414303b8 1810
1811
1812 // move to sent folder
1813 //
1814 $move_to_sent = getPref($data_dir,$username,'move_to_sent');
1815 if (isset($default_move_to_sent) && ($default_move_to_sent != 0)) {
1816 $svr_allow_sent = true;
1817 } else {
1818 $svr_allow_sent = false;
1819 }
1820
1821 if (isset($sent_folder) && (($sent_folder != '') || ($sent_folder != 'none'))
1822 && sqimap_mailbox_exists( $imap_stream, $sent_folder)) {
1823 $fld_sent = true;
1824 } else {
1825 $fld_sent = false;
1826 }
1827
1828 if ((isset($move_to_sent) && ($move_to_sent != 0)) || (!isset($move_to_sent))) {
1829 $lcl_allow_sent = true;
1830 } else {
1831 $lcl_allow_sent = false;
1832 }
1833
1834 if (($fld_sent && $svr_allow_sent && !$lcl_allow_sent) || ($fld_sent && $lcl_allow_sent)) {
1835 if ($action == 'reply' || $action == 'reply_all') {
1836 $save_reply_with_orig=getPref($data_dir,$username,'save_reply_with_orig');
1837 if ($save_reply_with_orig) {
1838 $sent_folder = $mailbox;
1839 }
1840 }
414303b8 1841 require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
1842 $imap_deliver = new Deliver_IMAP();
33f0da43 1843 $imap_deliver->mail($composeMessage, $imap_stream, $reply_id, $reply_ent_id, $imap_stream, $sent_folder);
414303b8 1844 unset ($imap_deliver);
1845 }
1846
1847
1848 // final cleanup
1849 //
1850 $composeMessage->purgeAttachments();
1851 sqimap_logout($imap_stream);
1852
a43e4b90 1853 }
0c59bbe1 1854 return $success;
a43e4b90 1855}