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;
}
}
$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;
if (!is_object($orig_from)) {
$sOrig_from = '';
} else {
$sOrig_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 '';
}
/* Make sure our final value isn't an empty string. */
if ($sOrig_from == '') {
return '';
}
/* Otherwise, try to select the desired citation style. */
switch ($reply_citation_style) {
case 'author_said':
/**
* To translators: %s is for author's name
*/
$full_reply_citation = sprintf(_("%s wrote:"),$sOrig_from);
break;
case 'quote_who':
// FIXME: do we have to translate xml formating?
$start = '<' . _("quote") . ' ' . _("who") . '="';
$end = '">';
$full_reply_citation = $start . $sOrig_from . $end;
break;
case 'date_time_author':
/**
* 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 wrote:"
* 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 wrote:"), getLongDateString($orig_date), $sOrig_from);
break;
case 'user-defined':
$start = $reply_citation_start .
($reply_citation_start == '' ? '' : ' ');
$end = $reply_citation_end;
$full_reply_citation = $start . $sOrig_from . $end;
break;
default:
return '';
}
/* 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, $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;
}
/* ----------------------------------------------------------------------- */
/*
* If the session is expired during a post this restores the compose session
* vars.
*/
if (sqsession_is_registered('session_expired_post')) {
sqgetGlobalVar('session_expired_post', $session_expired_post, SQ_SESSION);
/*
* extra check for username so we don't display previous post data from
* another user during this session.
*/
if ($session_expired_post['username'] != $username) {
unset($session_expired_post);
sqsession_unregister('session_expired_post');
session_write_close();
} else {
foreach ($session_expired_post as $postvar => $val) {
if (isset($val)) {
$$postvar = $val;
} else {
$$postvar = '';
}
}
$compose_messages = unserialize(urldecode($restoremessages));
sqsession_register($compose_messages,'compose_messages');
sqsession_register($composesession,'composesession');
if (isset($send)) {
unset($send);
}
$session_expired = true;
}
unset($session_expired_post);
sqsession_unregister('session_expired_post');
session_write_close();
if (!isset($mailbox)) {
$mailbox = '';
}
if ($compose_new_win == '1') {
compose_Header($color, $mailbox);
} else {
$sHeaderJs = (isset($sHeaderJs)) ? $sHeaderJs : '';
if (strpos($action, 'reply') !== false && $reply_focus) {
$sBodyTagJs = 'onload="checkForm(\''.$replyfocus.'\');"';
} else {
$sBodyTagJs = 'onload="checkForm();"';
}
displayPageHeader($color, $mailbox,$sHeaderJs,$sBodyTagJs);
}
showInputForm($session, false);
exit();
}
if (!isset($composesession)) {
$composesession = 0;
sqsession_register(0,'composesession');
}
if (!isset($session) || (isset($newmessage) && $newmessage)) {
sqsession_unregister('composesession');
$session = "$composesession" +1;
$composesession = $session;
sqsession_register($composesession,'composesession');
}
if (!isset($compose_messages)) {
$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');
} else {
$composeMessage=$compose_messages[$session];
}
if (!isset($mailbox) || $mailbox == '' || ($mailbox == 'None')) {
$mailbox = 'INBOX';
}
if ($draft) {
/*
* Set $default_charset to correspond with the user's selection
* of language interface.
*/
set_my_charset();
$composeMessage=$compose_messages[$session];
if (! deliverMessage($composeMessage, true)) {
showInputForm($session);
exit();
} else {
unset($compose_messages[$session]);
$draft_message = _("Draft Email Saved");
/* If this is a resumed draft, then delete the original */
if(isset($delete_draft)) {
$imap_stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, false);
sqimap_mailbox_select($imap_stream, $draft_folder);
// force bypass_trash=true because message should be saved when deliverMessage() returns true.
// in current implementation of sqimap_msgs_list_flag() single message id can
// be submitted as string. docs state that it should be array.
sqimap_msgs_list_delete($imap_stream, $draft_folder, $delete_draft, true);
if ($auto_expunge) {
sqimap_mailbox_expunge($imap_stream, $draft_folder, true);
}
sqimap_logout($imap_stream);
}
if ($compose_new_win == '1') {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
Header("Location: $location/compose.php?saved_draft=yes&session=$composesession");
} else {
echo '
'
. _("Return") . '';
}
exit();
} else {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
Header("Location: $location/right_main.php?mailbox=" . urlencode($draft_folder) .
"&startMessage=1¬e=".urlencode($draft_message));
} else {
echo '
'
. _("Return") . '';
}
exit();
}
}
}
if ($send) {
if (isset($_FILES['attachfile']) &&
$_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 */
}
$urlMailbox = urlencode (trim($mailbox));
if (! isset($passed_id)) {
$passed_id = 0;
}
/**
* Set $default_charset to correspond with the user's selection
* of language interface.
*/
set_my_charset();
/**
* This is to change all newlines to \n
* We'll change them to \r\n later (in the sendMessage function)
*/
$body = str_replace("\r\n", "\n", $body);
$body = str_replace("\r", "\n", $body);
/**
* Rewrap $body so that no line is bigger than $editor_size
*/
$body = explode("\n", $body);
$newBody = '';
foreach ($body as $line) {
if( $line <> '-- ' ) {
$line = rtrim($line);
}
if (sq_strlen($line,$default_charset) <= $editor_size + 1) {
$newBody .= $line . "\n";
} else {
sqWordWrap($line, $editor_size,$default_charset);
$newBody .= $line . "\n";
}
}
$body = $newBody;
$composeMessage=$compose_messages[$session];
$Result = deliverMessage($composeMessage);
if (! $Result) {
showInputForm($session);
exit();
}
unset($compose_messages[$session]);
/* if it is resumed draft, delete draft message */
if ( isset($delete_draft)) {
$imap_stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, false);
sqimap_mailbox_select($imap_stream, $draft_folder);
// bypass_trash=true because message should be saved when deliverMessage() returns true.
// in current implementation of sqimap_msgs_list_flag() single message id can
// be submitted as string. docs state that it should be array.
sqimap_msgs_list_delete($imap_stream, $draft_folder, $delete_draft, true);
if ($auto_expunge) {
sqimap_mailbox_expunge($imap_stream, $draft_folder, true);
}
sqimap_logout($imap_stream);
}
if ($compose_new_win == '1') {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
Header("Location: $location/compose.php?mail_sent=yes");
} else {
echo '
'
. _("Return") . '';
}
exit();
} else {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
Header("Location: $location/right_main.php?mailbox=$urlMailbox".
"&startMessage=$startMessage&mail_sent=yes");
} else {
echo '
"
. _("Return") . '';
}
exit();
}
} else {
if ($compose_new_win == '1') {
compose_Header($color, $mailbox);
}
else {
displayPageHeader($color, $mailbox);
}
if (isset($AttachFailure)) {
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 (isset($send_to_search) && is_array($send_to_search)) {
foreach ($send_to_search as $k => $v) {
if (substr($k, 0, 1) == 'T') {
if ($send_to) {
$send_to .= ', ';
}
$send_to .= $v;
}
elseif (substr($k, 0, 1) == 'C') {
if ($send_to_cc) {
$send_to_cc .= ', ';
}
$send_to_cc .= $v;
}
elseif (substr($k, 0, 1) == 'B') {
if ($send_to_bcc) {
$send_to_bcc .= ', ';
}
$send_to_bcc .= $v;
}
}
}
showInputForm($session);
} elseif (isset($html_addr_search)) {
if (isset($_FILES['attachfile']) &&
$_FILES['attachfile']['tmp_name'] &&
$_FILES['attachfile']['tmp_name'] != 'none') {
if(saveAttachedFiles($session)) {
plain_error_message(_("Could not move/copy file. File not attached"), $color);
}
}
/*
* I am using an include so as to elminiate an extra unnecessary
* click. If you can think of a better way, please implement it.
*/
include_once('./addrbook_search_html.php');
} elseif (isset($attach)) {
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);
}
showInputForm($session);
}
elseif (isset($sigappend)) {
$signature = $idents[$identity]['signature'];
$body .= "\n\n".($prefix_sig==true? "-- \n":'').$signature;
if ($compose_new_win == '1') {
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 (isset($delete) && is_array($delete)) {
$composeMessage = $compose_messages[$session];
foreach($delete as $index) {
$attached_file = $composeMessage->entities[$index]->att_local_name;
unlink ($attached_file);
unset ($composeMessage->entities[$index]);
}
$new_entities = array();
foreach ($composeMessage->entities as $entity) {
$new_entities[] = $entity;
}
$composeMessage->entities = $new_entities;
$compose_messages[$session] = $composeMessage;
sqsession_register($compose_messages, 'compose_messages');
}
showInputForm($session);
} else {
/*
* This handles the default case as well as the error case
* (they had the same code) --> if (isset($smtpErrors))
*/
if ($compose_new_win == '1') {
compose_Header($color, $mailbox);
} else {
displayPageHeader($color, $mailbox);
}
$newmail = true;
if (!isset($passed_ent_id)) {
$passed_ent_id = '';
}
if (!isset($passed_id)) {
$passed_id = '';
}
if (!isset($mailbox)) {
$mailbox = '';
}
if (!isset($action)) {
$action = '';
}
$values = newMail($mailbox,$passed_id,$passed_ent_id, $action, $session);
/* in case the origin is not read_body.php */
if (isset($send_to)) {
$values['send_to'] = $send_to;
}
if (isset($send_to_cc)) {
$values['send_to_cc'] = $send_to_cc;
}
if (isset($send_to_bcc)) {
$values['send_to_bcc'] = $send_to_bcc;
}
if (isset($subject)) {
$values['subject'] = $subject;
}
showInputForm($session, $values);
}
exit();
/**************** Only function definitions go below *************/
function getforwardSubject($subject)
{
if ((substr(strtolower($subject), 0, 4) != 'fwd:') &&
(substr(strtolower($subject), 0, 5) != '[fwd:') &&
(substr(strtolower($subject), 0, 6) != '[ fwd:')) {
$subject = '[Fwd: ' . $subject . ']';
}
return $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, $data_dir, $username,
$username, $key, $imapServerAddress, $imapPort, $compose_messages,
$composeMessage, $body_quote;
global $languages, $squirrelmail_language, $default_charset;
/*
* Set $default_charset to correspond with the user's selection
* of language interface. $default_charset global is not correct,
* if message is composed in new window.
*/
set_my_charset();
$send_to = $send_to_cc = $send_to_bcc = $subject = $identity = '';
$mailprio = 3;
if ($passed_id) {
$imapConnection = sqimap_login($username, $key, $imapServerAddress,
$imapPort, 0);
sqimap_mailbox_select($imapConnection, $mailbox);
$message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
$body = '';
if ($passed_ent_id) {
/* 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
*/
$entities = $message->entities[0]->findDisplayEntity
(array(), $alt_order = array('text/plain'));
if (!count($entities)) {
$entities = $message->entities[0]->findDisplayEntity
(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 */
$message = $message->entities[0];
} else {
$entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain'));
if (!count($entities)) {
$entities = $message->findDisplayEntity (array(), $alt_order = array('text/plain','html/plain'));
}
$orig_header = $message->rfc822_header;
}
$type0 = $message->type0;
$type1 = $message->type1;
foreach ($entities as $ent) {
$msg = $message->getEntity($ent);
$type0 = $msg->type0;
$type1 = $msg->type1;
$unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent);
$body_part_entity = $message->getEntity($ent);
$bodypart = decodeBody($unencoded_bodypart,
$body_part_entity->header->encoding);
if ($type1 == 'html') {
$bodypart = str_replace("\n", ' ', $bodypart);
$bodypart = preg_replace(array('/<\/?p>/i','/<\/div>/i','/
/i','/<\/?div>/i'), "\n", $bodypart);
$bodypart = str_replace(array(' ','>','<'),array(' ','>','<'),$bodypart);
$bodypart = strip_tags($bodypart);
}
if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_decode')) {
if (mb_detect_encoding($bodypart) != 'ASCII') {
$bodypart = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_decode', $bodypart);
}
}
// charset encoding in compose form stuff
if (isset($body_part_entity->header->parameters['charset'])) {
$actual = $body_part_entity->header->parameters['charset'];
} else {
$actual = 'us-ascii';
}
if ( $actual && is_conversion_safe($actual) && $actual != $default_charset){
$bodypart = charset_convert($actual,$bodypart,$default_charset,false);
}
// end of charset encoding in compose
$body .= $bodypart;
}
if ($default_use_priority) {
$mailprio = substr($orig_header->priority,0,1);
if (!$mailprio) {
$mailprio = 3;
}
} else {
$mailprio = '';
}
//ClearAttachments($session);
$identity = '';
$from_o = $orig_header->from;
if (is_array($from_o)) {
if (isset($from_o[0])) {
$from_o = $from_o[0];
}
}
if (is_object($from_o)) {
$orig_from = $from_o->getAddress();
} else {
$orig_from = '';
}
$identities = array();
if (count($idents) > 1) {
foreach($idents as $nr=>$data) {
$enc_from_name = '"'.$data['full_name'].'" <'. $data['email_address'].'>';
if($enc_from_name == $orig_from) {
$identity = $nr;
break;
}
$identities[] = $enc_from_name;
}
$identity_match = $orig_header->findAddress($identities);
if ($identity_match) {
$identity = $identity_match;
}
}
switch ($action) {
case ('draft'):
$use_signature = FALSE;
$composeMessage->rfc822_header = $orig_header;
$send_to = decodeHeader($orig_header->getAddr_s('to'),false,false,true);
$send_to_cc = decodeHeader($orig_header->getAddr_s('cc'),false,false,true);
$send_to_bcc = decodeHeader($orig_header->getAddr_s('bcc'),false,false,true);
$send_from = $orig_header->getAddr_s('from');
$send_from_parts = new AddressStructure();
$send_from_parts = $orig_header->parseAddress($send_from);
$send_from_add = $send_from_parts->mailbox . '@' . $send_from_parts->host;
$identities = get_identities();
if (count($identities) > 0) {
foreach($identities as $iddata) {
if ($send_from_add == $iddata['email_address']) {
$identity = $iddata['index'];
break;
}
}
}
$subject = decodeHeader($orig_header->subject,false,false,true);
/* remember the references and in-reply-to headers in case of an reply */
$composeMessage->rfc822_header->more_headers['References'] = $orig_header->references;
$composeMessage->rfc822_header->more_headers['In-Reply-To'] = $orig_header->in_reply_to;
// rewrap the body to clean up quotations and line lengths
sqBodyWrap($body, $editor_size);
$composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
break;
case ('edit_as_new'):
$send_to = decodeHeader($orig_header->getAddr_s('to'),false,false,true);
$send_to_cc = decodeHeader($orig_header->getAddr_s('cc'),false,false,true);
$send_to_bcc = decodeHeader($orig_header->getAddr_s('bcc'),false,false,true);
$subject = decodeHeader($orig_header->subject,false,false,true);
$mailprio = $orig_header->priority;
$orig_from = '';
$composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
// rewrap the body to clean up quotations and line lengths
sqBodyWrap($body, $editor_size);
break;
case ('forward'):
$send_to = '';
$subject = getforwardSubject(decodeHeader($orig_header->subject,false,false,true));
$body = getforwardHeader($orig_header) . $body;
// the logic for calling sqUnWordWrap here would be to allow the browser to wrap the lines
// forwarded message text should be as undisturbed as possible, so commenting out this call
// sqUnWordWrap($body);
$composeMessage = getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
//add a blank line after the forward headers
$body = "\n" . $body;
break;
case ('forward_as_attachment'):
$subject = getforwardSubject(decodeHeader($orig_header->subject,false,false,true));
$composeMessage = getMessage_RFC822_Attachment($message, $composeMessage, $passed_id, $passed_ent_id, $imapConnection);
$body = '';
break;
case ('reply_all'):
if(isset($orig_header->mail_followup_to) && $orig_header->mail_followup_to) {
$send_to = $orig_header->getAddr_s('mail_followup_to');
} else {
$send_to_cc = replyAllString($orig_header);
$send_to_cc = decodeHeader($send_to_cc,false,false,true);
}
case ('reply'):
// skip this if send_to was already set right above here
if(!$send_to) {
$send_to = $orig_header->reply_to;
if (is_array($send_to) && count($send_to)) {
$send_to = $orig_header->getAddr_s('reply_to');
} else if (is_object($send_to)) { /* unneccesarry, just for failsafe purpose */
$send_to = $orig_header->getAddr_s('reply_to');
} else {
$send_to = $orig_header->getAddr_s('from');
}
}
$send_to = decodeHeader($send_to,false,false,true);
$subject = decodeHeader($orig_header->subject,false,false,true);
$subject = str_replace('"', "'", $subject);
$subject = trim($subject);
if (substr(strtolower($subject), 0, 3) != 're:') {
$subject = 'Re: ' . $subject;
}
/* this corrects some wrapping/quoting problems on replies */
$rewrap_body = explode("\n", $body);
$from = (is_array($orig_header->from)) ? $orig_header->from[0] : $orig_header->from;
$body = '';
$strip_sigs = getPref($data_dir, $username, 'strip_sigs');
foreach ($rewrap_body as $line) {
if ($strip_sigs && substr($line,0,3) == '-- ') {
break;
}
if (preg_match("/^(>+)/", $line, $matches)) {
$gt = $matches[1];
$body .= $body_quote . str_replace("\n", "\n$body_quote$gt ", rtrim($line)) ."\n";
} else {
$body .= $body_quote . (!empty($body_quote) ? ' ' : '') . str_replace("\n", "\n$body_quote" . (!empty($body_quote) ? ' ' : ''), rtrim($line)) . "\n";
}
}
//rewrap the body to clean up quotations and line lengths
$body = sqBodyWrap ($body, $editor_size);
$body = getReplyCitation($from , $orig_header->date) . $body;
$composeMessage->reply_rfc822_header = $orig_header;
break;
default:
break;
}
$compose_messages[$session] = $composeMessage;
sqsession_register($compose_messages, 'compose_messages');
session_write_close();
sqimap_logout($imapConnection);
}
$ret = array( 'send_to' => $send_to,
'send_to_cc' => $send_to_cc,
'send_to_bcc' => $send_to_bcc,
'subject' => $subject,
'mailprio' => $mailprio,
'body' => $body,
'identity' => $identity );
return ($ret);
} /* function newMail() */
/**
* downloads attachments from original message, stores them in attachment directory and adds
* them to composed message.
* @param object $message
* @param object $composeMessage
* @param integer $passed_id
* @param mixed $entities
* @param mixed $imapConnection
* @return object
*/
function getAttachments($message, &$composeMessage, $passed_id, $entities, $imapConnection) {
global $attachment_dir, $username, $data_dir, $squirrelmail_language, $languages;
$hashed_attachment_dir = getHashedDir($username, $attachment_dir);
if (!count($message->entities) ||
($message->type0 == 'message' && $message->type1 == 'rfc822')) {
if ( !in_array($message->entity_id, $entities) && $message->entity_id) {
switch ($message->type0) {
case 'message':
if ($message->type1 == 'rfc822') {
$filename = $message->rfc822_header->subject;
if ($filename == "") {
$filename = "untitled-".$message->entity_id;
}
$filename .= '.msg';
} else {
$filename = $message->getFilename();
}
break;
default:
if (!$message->mime_header) { /* temporary hack */
$message->mime_header = $message->header;
}
$filename = $message->getFilename();
break;
}
$filename = str_replace(' ', ' ', decodeHeader($filename));
if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
$filename = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $filename);
}
$localfilename = GenerateRandomString(32, '', 7);
$full_localfilename = "$hashed_attachment_dir/$localfilename";
while (file_exists($full_localfilename)) {
$localfilename = GenerateRandomString(32, '', 7);
$full_localfilename = "$hashed_attachment_dir/$localfilename";
}
$message->att_local_name = $full_localfilename;
$composeMessage->initAttachment($message->type0.'/'.$message->type1,$filename,
$full_localfilename);
/* Write Attachment to file */
$fp = fopen ("$hashed_attachment_dir/$localfilename", 'wb');
mime_print_body_lines ($imapConnection, $passed_id, $message->entity_id, $message->header->encoding, $fp);
fclose ($fp);
}
} else {
for ($i=0, $entCount=count($message->entities); $i<$entCount;$i++) {
$composeMessage=getAttachments($message->entities[$i], $composeMessage, $passed_id, $entities, $imapConnection);
}
}
return $composeMessage;
}
function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id,
$passed_ent_id='', $imapConnection) {
global $attachment_dir, $username, $data_dir;
$hashed_attachment_dir = getHashedDir($username, $attachment_dir);
if (!$passed_ent_id) {
$body_a = sqimap_run_command($imapConnection,
'FETCH '.$passed_id.' RFC822',
TRUE, $response, $readmessage,
TRUE);
} else {
$body_a = sqimap_run_command($imapConnection,
'FETCH '.$passed_id.' BODY['.$passed_ent_id.']',
TRUE, $response, $readmessage, TRUE);
$message = $message->parent;
}
if ($response == 'OK') {
$subject = encodeHeader($message->rfc822_header->subject);
array_shift($body_a);
array_pop($body_a);
$body = implode('', $body_a) . "\r\n";
$localfilename = GenerateRandomString(32, 'FILE', 7);
$full_localfilename = "$hashed_attachment_dir/$localfilename";
$fp = fopen($full_localfilename, 'w');
fwrite ($fp, $body);
fclose($fp);
$composeMessage->initAttachment('message/rfc822',$subject.'.msg',
$full_localfilename);
}
return $composeMessage;
}
function showInputForm ($session, $values=false) {
global $send_to, $send_to_cc, $body, $startMessage, $action,
$color, $use_signature, $signature, $prefix_sig,
$editor_size, $editor_height, $subject, $newmail,
$use_javascript_addr_book, $send_to_bcc, $passed_id, $mailbox,
$from_htmladdr_search, $location_of_buttons, $attachment_dir,
$username, $data_dir, $identity, $idents, $delete_draft,
$mailprio, $compose_new_win, $saved_draft, $mail_sent, $sig_first,
$username, $compose_messages, $composesession, $default_charset;
if (checkForJavascript()) {
$onfocus = ' onfocus="alreadyFocused=true;"';
$onfocus_array = array('onfocus' => 'alreadyFocused=true;');
}
else {
$onfocus = '';
$onfocus_array = array();
}
$composeMessage = $compose_messages[$session];
if ($values) {
$send_to = $values['send_to'];
$send_to_cc = $values['send_to_cc'];
$send_to_bcc = $values['send_to_bcc'];
$subject = $values['subject'];
$mailprio = $values['mailprio'];
$body = $values['body'];
$identity = (int) $values['identity'];
} else {
$send_to = decodeHeader($send_to, true, false);
$send_to_cc = decodeHeader($send_to_cc, true, false);
$send_to_bcc = decodeHeader($send_to_bcc, true, false);
}
if ($use_javascript_addr_book) {
echo "\n". '\n\n";
}
echo "\n" . '