X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fcompose.php;h=38e101f508c4c66309ccb8e41a63f052f3eba033;hb=ebf9211b46d097c8ff4e8b6f6ab8c3a2c12731fd;hp=a28d0782e918fb8b621f27e56e183fff2dd9c41c;hpb=b455e47bc278c8ab78f16f7325f9a1d5e22dcab7;p=squirrelmail.git diff --git a/src/compose.php b/src/compose.php index a28d0782..38e101f5 100644 --- a/src/compose.php +++ b/src/compose.php @@ -3,7 +3,7 @@ /** * compose.php * - * Copyright (c) 1999-2004 The SquirrelMail Project Team + * Copyright (c) 1999-2005 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * This code sends a mail. @@ -88,7 +88,7 @@ sqgetGlobalVar('do_delete', $do_delete, SQ_POST); sqgetGlobalVar('delete', $delete, SQ_POST); sqgetGlobalVar('restoremessages', $restoremessages, SQ_POST); if ( sqgetGlobalVar('return', $temp, SQ_POST) ) { - $html_addr_search_done = 'Use Addresses'; + $html_addr_search_done = 'Use Addresses'; } /** GET VARS */ @@ -97,12 +97,12 @@ sqgetGlobalVar('attachedmessages', $attachedmessages, SQ_GET); /** get smaction */ if ( !sqgetGlobalVar('smaction',$action) ) { - if ( sqgetGlobalVar('smaction_reply',$tmp) ) $action = 'reply'; - if ( sqgetGlobalVar('smaction_reply_all',$tmp) ) $action = 'reply_all'; - if ( sqgetGlobalVar('smaction_forward',$tmp) ) $action = 'forward'; - if ( sqgetGlobalVar('smaction_attache',$tmp) ) $action = 'forward_as_attachment'; - if ( sqgetGlobalVar('smaction_draft',$tmp) ) $action = 'draft'; - if ( sqgetGlobalVar('smaction_edit_new',$tmp) ) $action = 'edit_as_new'; + if ( sqgetGlobalVar('smaction_reply',$tmp) ) $action = 'reply'; + if ( sqgetGlobalVar('smaction_reply_all',$tmp) ) $action = 'reply_all'; + if ( sqgetGlobalVar('smaction_forward',$tmp) ) $action = 'forward'; + if ( sqgetGlobalVar('smaction_attache',$tmp) ) $action = 'forward_as_attachment'; + if ( sqgetGlobalVar('smaction_draft',$tmp) ) $action = 'draft'; + if ( sqgetGlobalVar('smaction_edit_new',$tmp) ) $action = 'edit_as_new'; } /* Location (For HTTP 1.1 Header("Location: ...") redirects) */ @@ -113,55 +113,66 @@ $idents = get_identities(); /* --------------------- Specific Functions ------------------------------ */ function replyAllString($header) { - global $include_self_reply_all, $idents; - $excl_ar = array(); - /** - * 1) Remove the addresses we'll be sending the message 'to' - */ - $url_replytoall_avoid_addrs = ''; - if (isset($header->replyto)) { - $excl_ar = $header->getAddr_a('replyto'); - } - /** - * 2) Remove our identities from the CC list (they still can be in the - * TO list) only if $include_self_reply_all is turned off - */ - if (!$include_self_reply_all) { - foreach($idents as $id) { - $excl_ar[strtolower(trim($id['email_address']))] = ''; + global $include_self_reply_all, $idents; + $excl_ar = array(); + /** + * 1) Remove the addresses we'll be sending the message 'to' + */ + if (isset($header->replyto)) { + $excl_ar = $header->getAddr_a('replyto'); + } + /** + * 2) Remove our identities from the CC list (they still can be in the + * TO list) only if $include_self_reply_all is turned off + */ + if (!$include_self_reply_all) { + foreach($idents as $id) { + $excl_ar[strtolower(trim($id['email_address']))] = ''; + } + } + + /** + * 3) get the addresses. + */ + $url_replytoall_ar = $header->getAddr_a(array('to','cc'), $excl_ar); + + /** + * 4) generate the string. + */ + $url_replytoallcc = ''; + foreach( $url_replytoall_ar as $email => $personal) { + if ($personal) { + // if personal name contains address separator then surround + // the personal name with double quotes. + if (strpos($personal,',') !== false) { + $personal = '"'.$personal.'"'; + } + $url_replytoallcc .= ", $personal <$email>"; + } else { + $url_replytoallcc .= ', '. $email; } - } - - /** - * 3) get the addresses. - */ - $url_replytoall_ar = $header->getAddr_a(array('to','cc'), $excl_ar); - - /** - * 4) generate the string. - */ - $url_replytoallcc = ''; - foreach( $url_replytoall_ar as $email => $personal) { - if ($personal) { - // if personal name contains address separator then surround - // the personal name with double quotes. - if (strpos($personal,',') !== false) { - $personal = '"'.$personal.'"'; - } - $url_replytoallcc .= ", $personal <$email>"; - } else { - $url_replytoallcc .= ', '. $email; - } - } - $url_replytoallcc = substr($url_replytoallcc,2); - - return $url_replytoallcc; + } + $url_replytoallcc = substr($url_replytoallcc,2); + + return $url_replytoallcc; } +/** + * creates top line in reply citations + * + * Line style depends on user preferences. + * $orig_date argument is available only from 1.4.3 and 1.5.1 version. + * @param object $orig_from From: header object. + * @param integer $orig_date email's timestamp + * @return string reply citation + */ function getReplyCitation($orig_from, $orig_date) { global $reply_citation_style, $reply_citation_start, $reply_citation_end; + + // FIXME: why object is rewritten with string. $orig_from = decodeHeader($orig_from->getAddress(false),false,false,true); // $from = decodeHeader($orig_header->getAddr_s('from',"\n$indent"),false,false); + /* First, return an empty string when no citation style selected. */ if (($reply_citation_style == '') || ($reply_citation_style == 'none')) { return ''; @@ -175,62 +186,85 @@ function getReplyCitation($orig_from, $orig_date) { /* Otherwise, try to select the desired citation style. */ switch ($reply_citation_style) { case 'author_said': - $start = ''; - $end = ' ' . _("said") . ':'; + /** + * To translators: %s is for author's name + */ + $full_reply_citation = sprintf(_("%s said:"),$orig_from); break; case 'quote_who': + // FIXME: do we have to translate xml formating? $start = '<' . _("quote") . ' ' . _("who") . '="'; $end = '">'; + $full_reply_citation = $start . $orig_from . $end; break; case 'date_time_author': - $start = 'On ' . getLongDateString($orig_date) . ', '; - $end = ' ' . _("said") . ':'; + /** + * To translators: + * first %s is for date string, second %s is for author's name. Date uses + * formating from "D, F j, Y g:i a" and "D, F j, Y H:i" translations. + * Example string: + * "On Sat, December 24, 2004 23:59, Santa said:" + * If you have to put author's name in front of date string, check comments about + * argument swapping at http://www.php.net/sprintf + */ + $full_reply_citation = sprintf(_("On %s, %s said:"), getLongDateString($orig_date), $orig_from); break; case 'user-defined': $start = $reply_citation_start . - ($reply_citation_start == '' ? '' : ' '); + ($reply_citation_start == '' ? '' : ' '); $end = $reply_citation_end; + $full_reply_citation = $start . $orig_from . $end; break; default: return ''; } - /* Build and return the citation string. */ - return ($start . $orig_from . $end . "\n"); + /* Add line feed and return the citation string. */ + return ($full_reply_citation . "\n"); } +/** + * Creates header fields in forwarded email body + * + * $default_charset global must be set correctly before you call this function. + * @param object $orig_header + * @return $string + */ function getforwardHeader($orig_header) { - global $editor_size; - - $display = array( _("Subject") => strlen(_("Subject")), - _("From") => strlen(_("From")), - _("Date") => strlen(_("Date")), - _("To") => strlen(_("To")), - _("Cc") => strlen(_("Cc")) ); - $maxsize = max($display); - $indent = str_pad('',$maxsize+2); - foreach($display as $key => $val) { - $display[$key] = $key .': '. str_pad('', $maxsize - $val); - } - $from = decodeHeader($orig_header->getAddr_s('from',"\n$indent"),false,false,true); - $from = str_replace(' ',' ',$from); - $to = decodeHeader($orig_header->getAddr_s('to',"\n$indent"),false,false,true); - $to = str_replace(' ',' ',$to); - $subject = decodeHeader($orig_header->subject,false,false,true); - $subject = str_replace(' ',' ',$subject); - $bodyTop = str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH) . - "\n". $display[_("Subject")] . $subject . "\n" . - $display[_("From")] . $from . "\n" . - $display[_("Date")] . getLongDateString( $orig_header->date ). "\n" . - $display[_("To")] . $to . "\n"; - if ($orig_header->cc != array() && $orig_header->cc !='') { - $cc = decodeHeader($orig_header->getAddr_s('cc',"\n$indent"),false,false,true); - $cc = str_replace(' ',' ',$cc); - $bodyTop .= $display[_("Cc")] .$cc . "\n"; - } - $bodyTop .= str_pad('', $editor_size -2 , '-') . - "\n\n"; - return $bodyTop; + global $editor_size, $default_charset; + + // using own strlen function in order to detect correct string length + $display = array( _("Subject") => sq_strlen(_("Subject"),$default_charset), + _("From") => sq_strlen(_("From"),$default_charset), + _("Date") => sq_strlen(_("Date"),$default_charset), + _("To") => sq_strlen(_("To"),$default_charset), + _("Cc") => sq_strlen(_("Cc"),$default_charset) ); + $maxsize = max($display); + $indent = str_pad('',$maxsize+2); + foreach($display as $key => $val) { + $display[$key] = $key .': '. str_pad('', $maxsize - $val); + } + $from = decodeHeader($orig_header->getAddr_s('from',"\n$indent"),false,false,true); + $from = str_replace(' ',' ',$from); + $to = decodeHeader($orig_header->getAddr_s('to',"\n$indent"),false,false,true); + $to = str_replace(' ',' ',$to); + $subject = decodeHeader($orig_header->subject,false,false,true); + $subject = str_replace(' ',' ',$subject); + + // using own str_pad function in order to create correct string pad + $bodyTop = sq_str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH,$default_charset) . + "\n". $display[_("Subject")] . $subject . "\n" . + $display[_("From")] . $from . "\n" . + $display[_("Date")] . getLongDateString( $orig_header->date ). "\n" . + $display[_("To")] . $to . "\n"; + if ($orig_header->cc != array() && $orig_header->cc !='') { + $cc = decodeHeader($orig_header->getAddr_s('cc',"\n$indent"),false,false,true); + $cc = str_replace(' ',' ',$cc); + $bodyTop .= $display[_("Cc")] .$cc . "\n"; + } + $bodyTop .= str_pad('', $editor_size -2 , '-') . + "\n\n"; + return $bodyTop; } /* ----------------------------------------------------------------------- */ @@ -290,18 +324,18 @@ if (!isset($session) || (isset($newmessage) && $newmessage)) { sqsession_register($composesession,'composesession'); } if (!isset($compose_messages)) { - $compose_messages = array(); + $compose_messages = array(); } if (!isset($compose_messages[$session]) || ($compose_messages[$session] == NULL)) { -/* if (!array_key_exists($session, $compose_messages)) { /* We can only do this in PHP >= 4.1 */ - $composeMessage = new Message(); - $rfc822_header = new Rfc822Header(); - $composeMessage->rfc822_header = $rfc822_header; - $composeMessage->reply_rfc822_header = ''; - $compose_messages[$session] = $composeMessage; - sqsession_register($compose_messages,'compose_messages'); + /* if (!array_key_exists($session, $compose_messages)) { /* We can only do this in PHP >= 4.1 */ + $composeMessage = new Message(); + $rfc822_header = new Rfc822Header(); + $composeMessage->rfc822_header = $rfc822_header; + $composeMessage->reply_rfc822_header = ''; + $compose_messages[$session] = $composeMessage; + sqsession_register($compose_messages,'compose_messages'); } else { - $composeMessage=$compose_messages[$session]; + $composeMessage=$compose_messages[$session]; } if (!isset($mailbox) || $mailbox == '' || ($mailbox == 'None')) { @@ -324,7 +358,7 @@ if ($draft) { /* If this is a resumed draft, then delete the original */ if(isset($delete_draft)) { Header("Location: $location/delete_message.php?mailbox=" . urlencode($draft_folder) . - "&message=$delete_draft&startMessage=1&saved_draft=yes"); + "&message=$delete_draft&startMessage=1&saved_draft=yes"); exit(); } else { @@ -333,8 +367,8 @@ if ($draft) { exit(); } else { - Header("Location: $location/right_main.php?mailbox=$draft_folder". - "&startMessage=1¬e=".urlencode($draft_message)); + Header("Location: $location/right_main.php?mailbox=" . urlencode($draft_folder) . + "&startMessage=1¬e=".urlencode($draft_message)); exit(); } } @@ -343,15 +377,15 @@ if ($draft) { if ($send) { if (isset($_FILES['attachfile']) && - $_FILES['attachfile']['tmp_name'] && - $_FILES['attachfile']['tmp_name'] != 'none') { + $_FILES['attachfile']['tmp_name'] && + $_FILES['attachfile']['tmp_name'] != 'none') { $AttachFailure = saveAttachedFiles($session); } if (checkInput(false) && !isset($AttachFailure)) { - if ($mailbox == "All Folders") { - /* We entered compose via the search results page */ - $mailbox="INBOX"; /* Send 'em to INBOX, that's safe enough */ - } + if ($mailbox == "All Folders") { + /* We entered compose via the search results page */ + $mailbox="INBOX"; /* Send 'em to INBOX, that's safe enough */ + } $urlMailbox = urlencode (trim($mailbox)); if (! isset($passed_id)) { $passed_id = 0; @@ -369,12 +403,24 @@ if ($send) { $body = str_replace("\r", "\n", $body); /** - * If the browser doesn't support "VIRTUAL" as the wrap type. - * then the line length will be longer than $editor_size - * almost all browsers support VIRTUAL, so remove the line by line checking - * If this causes a problem, call sqBodyWrap + * Rewrap $body so that no line is bigger than $editor_size */ - // sqBodyWrap($body, $editor_size); + $body = explode("\n", $body); + $newBody = ''; + foreach ($body as $line) { + if( $line <> '-- ' ) { + $line = rtrim($line); + } + if (strlen($line) <= $editor_size + 1) { + $newBody .= $line . "\n"; + } else { + sqWordWrap($line, $editor_size); + $newBody .= $line . "\n"; + + } + + } + $body = $newBody; $composeMessage=$compose_messages[$session]; @@ -386,7 +432,7 @@ if ($send) { unset($compose_messages[$session]); if ( isset($delete_draft)) { Header("Location: $location/delete_message.php?mailbox=" . urlencode( $draft_folder ). - "&message=$delete_draft&startMessage=1&mail_sent=yes"); + "&message=$delete_draft&startMessage=1&mail_sent=yes"); exit(); } if ($compose_new_win == '1') { @@ -395,7 +441,7 @@ if ($send) { } else { Header("Location: $location/right_main.php?mailbox=$urlMailbox". - "&startMessage=$startMessage&mail_sent=yes"); + "&startMessage=$startMessage&mail_sent=yes"); } } else { if ($compose_new_win == '1') { @@ -405,20 +451,20 @@ if ($send) { displayPageHeader($color, $mailbox); } if (isset($AttachFailure)) { - plain_error_message(_("Could not move/copy file. File not attached"), - $color); + plain_error_message(_("Could not move/copy file. File not attached"), + $color); } checkInput(true); showInputForm($session); /* sqimap_logout($imapConnection); */ } } elseif (isset($html_addr_search_done)) { - if ($compose_new_win == '1') { - compose_Header($color, $mailbox); - } - else { - displayPageHeader($color, $mailbox); - } + if ($compose_new_win == '1') { + compose_Header($color, $mailbox); + } + else { + displayPageHeader($color, $mailbox); + } if (isset($send_to_search) && is_array($send_to_search)) { foreach ($send_to_search as $k => $v) { @@ -445,8 +491,8 @@ if ($send) { showInputForm($session); } elseif (isset($html_addr_search)) { if (isset($_FILES['attachfile']) && - $_FILES['attachfile']['tmp_name'] && - $_FILES['attachfile']['tmp_name'] != 'none') { + $_FILES['attachfile']['tmp_name'] && + $_FILES['attachfile']['tmp_name'] != 'none') { if(saveAttachedFiles($session)) { plain_error_message(_("Could not move/copy file. File not attached"), $color); } @@ -460,12 +506,11 @@ if ($send) { if (saveAttachedFiles($session)) { plain_error_message(_("Could not move/copy file. File not attached"), $color); } - if ($compose_new_win == '1') { - compose_Header($color, $mailbox); - } - else { - displayPageHeader($color, $mailbox); - } + if ($compose_new_win == '1') { + compose_Header($color, $mailbox); + } else { + displayPageHeader($color, $mailbox); + } showInputForm($session); } elseif (isset($sigappend)) { @@ -473,18 +518,17 @@ elseif (isset($sigappend)) { $body .= "\n\n".($prefix_sig==true? "-- \n":'').$signature; if ($compose_new_win == '1') { - compose_Header($color, $mailbox); + compose_Header($color, $mailbox); } else { displayPageHeader($color, $mailbox); } showInputForm($session); } elseif (isset($do_delete)) { - if ($compose_new_win == '1') { - compose_Header($color, $mailbox); - } - else { - displayPageHeader($color, $mailbox); - } + if ($compose_new_win == '1') { + compose_Header($color, $mailbox); + } else { + displayPageHeader($color, $mailbox); + } if (isset($delete) && is_array($delete)) { $composeMessage = $compose_messages[$session]; @@ -509,9 +553,9 @@ elseif (isset($sigappend)) { */ if ($compose_new_win == '1') { - compose_Header($color, $mailbox); + compose_Header($color, $mailbox); } else { - displayPageHeader($color, $mailbox); + displayPageHeader($color, $mailbox); } $newmail = true; @@ -533,16 +577,16 @@ elseif (isset($sigappend)) { /* in case the origin is not read_body.php */ if (isset($send_to)) { - $values['send_to'] = $send_to; + $values['send_to'] = $send_to; } if (isset($send_to_cc)) { - $values['send_to_cc'] = $send_to_cc; + $values['send_to_cc'] = $send_to_cc; } if (isset($send_to_bcc)) { - $values['send_to_bcc'] = $send_to_bcc; + $values['send_to_bcc'] = $send_to_bcc; } if (isset($subject)) { - $values['subject'] = $subject; + $values['subject'] = $subject; } showInputForm($session, $values); } @@ -554,8 +598,8 @@ exit(); function getforwardSubject($subject) { if ((substr(strtolower($subject), 0, 4) != 'fwd:') && - (substr(strtolower($subject), 0, 5) != '[fwd:') && - (substr(strtolower($subject), 0, 6) != '[ fwd:')) { + (substr(strtolower($subject), 0, 5) != '[fwd:') && + (substr(strtolower($subject), 0, 6) != '[ fwd:')) { $subject = '[Fwd: ' . $subject . ']'; } return $subject; @@ -564,9 +608,9 @@ function getforwardSubject($subject) /* This function is used when not sending or adding attachments */ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $session='') { global $editor_size, $default_use_priority, $body, $idents, - $use_signature, $composesession, $data_dir, $username, - $username, $key, $imapServerAddress, $imapPort, $compose_messages, - $composeMessage, $body_quote; + $use_signature, $data_dir, $username, + $username, $key, $imapServerAddress, $imapPort, $compose_messages, + $composeMessage, $body_quote; global $languages, $squirrelmail_language, $default_charset; /* @@ -581,7 +625,7 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se if ($passed_id) { $imapConnection = sqimap_login($username, $key, $imapServerAddress, - $imapPort, 0); + $imapPort, 0); sqimap_mailbox_select($imapConnection, $mailbox); $message = sqimap_get_message($imapConnection, $passed_id, $mailbox); @@ -591,15 +635,15 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se /* redefine the messsage in case of message/rfc822 */ $message = $message->getEntity($passed_ent_id); /* message is an entity which contains the envelope and type0=message - * and type1=rfc822. The actual entities are childs from - * $message->entities[0]. That's where the encoding and is located - */ + * and type1=rfc822. The actual entities are childs from + * $message->entities[0]. That's where the encoding and is located + */ $entities = $message->entities[0]->findDisplayEntity - (array(), $alt_order = array('text/plain')); + (array(), $alt_order = array('text/plain')); if (!count($entities)) { $entities = $message->entities[0]->findDisplayEntity - (array(), $alt_order = array('text/plain','html/plain')); + (array(), $alt_order = array('text/plain','html/plain')); } $orig_header = $message->rfc822_header; /* here is the envelope located */ /* redefine the message for picking up the attachments */ @@ -613,7 +657,6 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se $orig_header = $message->rfc822_header; } - $encoding = $message->header->encoding; $type0 = $message->type0; $type1 = $message->type1; foreach ($entities as $ent) { @@ -623,30 +666,29 @@ function newMail ($mailbox='', $passed_id='', $passed_ent_id='', $action='', $se $unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent); $body_part_entity = $message->getEntity($ent); $bodypart = decodeBody($unencoded_bodypart, - $body_part_entity->header->encoding); + $body_part_entity->header->encoding); if ($type1 == 'html') { $bodypart = str_replace("\n", ' ', $bodypart); - $bodypart = preg_replace(array('/
/i','/
' + . _("Because PHP file uploads are turned off, you can not attach files to this message. Please see your system administrator for details.") + . "
\r\n"; } do_hook('compose_bottom'); - echo '