From e924f671b09be12c212841316574fc43995fe63a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 3 Jan 2007 08:01:43 +0000 Subject: [PATCH] fixed php5.2 error reported on the german list: replying was not working in fmail: PHP Catchable fatal error: Object of class bocompose could not be converted to string in /srv/www/htdocs/egw-1.2/felamimail/inc/class.bocompose.inc.php on line 297 --- felamimail/inc/class.bocompose.inc.php | 589 +++++++++++++++++++++++++ 1 file changed, 589 insertions(+) create mode 100644 felamimail/inc/class.bocompose.inc.php diff --git a/felamimail/inc/class.bocompose.inc.php b/felamimail/inc/class.bocompose.inc.php new file mode 100644 index 0000000000..faffc7ebfe --- /dev/null +++ b/felamimail/inc/class.bocompose.inc.php @@ -0,0 +1,589 @@ + True, + 'action' => True + ); + + var $attachments; // Array of attachments + var $preferences; // the prefenrences(emailserver, username, ...) + + function bocompose($_composeID = '', $_charSet = 'iso-8859-1') + { + $this->displayCharset = strtolower($_charSet); + $this->bopreferences =& CreateObject('felamimail.bopreferences'); + $this->bofelamimail =& CreateObject('felamimail.bofelamimail',$_charSet); + $this->preferences = $this->bopreferences->getPreferences(); + $this->botranslation =& CreateObject('phpgwapi.translation'); + + if (!empty($_composeID)) + { + $this->composeID = $_composeID; + $this->restoreSessionData(); + } + } + + /** + * adds uploaded files or files in eGW's temp directory as attachments + * + * It also stores the given data in the session + * + * @param array $_formData fields of the compose form (to,cc,bcc,reply_to,subject,body,priority,signature), plus data of the file (name,file,size,type) + */ + function addAttachment($_formData) + { + $this->sessionData['to'] = $_formData['to']; + $this->sessionData['cc'] = $_formData['cc']; + $this->sessionData['bcc'] = $_formData['bcc']; + $this->sessionData['reply_to'] = $_formData['reply_to']; + $this->sessionData['subject'] = $_formData['subject']; + $this->sessionData['body'] = $_formData['body']; + $this->sessionData['priority'] = $_formData['priority']; + $this->sessionData['signature'] = $_formData['signature']; + + #while(list($key,$value) = each($GLOBALS['egw_info']['user'])) + #{ + # print "$key: $value
"; + #} + + // to gard against exploidts the file must be either uploaded or be in the temp_dir + if ($_formData['size'] != 0 && (is_uploaded_file($_formData['file']) || + realpath(dirname($_formData['file'])) == realpath($GLOBALS['egw_info']['server']['temp_dir']))) + { + // ensure existance of eGW temp dir + // note: this is different from apache temp dir, + // and different from any other temp file location set in php.ini + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + @mkdir($GLOBALS['egw_info']['server']['temp_dir'],0700); + } + + // if we were NOT able to create this temp directory, then make an ERROR report + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + $alert_msg .= 'Error:'.'
' + .'Server is unable to access phpgw tmp directory'.'
' + .$GLOBALS['egw_info']['server']['temp_dir'].'
' + .'Please check your configuration'.'
' + .'
'; + } + + // sometimes PHP is very clue-less about MIME types, and gives NO file_type + // rfc default for unknown MIME type is: + $mime_type_default = 'application/octet-stream'; + // so if PHP did not pass any file_type info, then substitute the rfc default value + if (trim($_formData['type']) == '') + { + $_formData['type'] = $mime_type_default; + } + + $tmpFileName = $GLOBALS['egw_info']['server']['temp_dir']. + SEP. + $GLOBALS['egw_info']['user']['account_id']. + $this->composeID. + basename($_formData['file']); + + if (is_uploaded_file($_formData['file'])) + { + move_uploaded_file($_formData['file'],$tmpFileName); // requirement for safe_mode! + } + else + { + rename($_formData['file'],$tmpFileName); + } + $this->sessionData['attachments'][]=array + ( + 'name' => $_formData['name'], + 'type' => $_formData['type'], + 'file' => $tmpFileName, + 'size' => $_formData['size'] + ); + } + + $this->saveSessionData(); + #print"
";print_r($this->sessionData);print"
"; + } + + function addMessageAttachment($_uid, $_partID, $_folder, $_name, $_size) + { + $this->sessionData['attachments'][]=array + ( + 'uid' => $_uid, + 'partID' => $_partID, + 'name' => $_name, + 'type' => 'message/rfc822', + 'size' => $_size, + 'folder' => $_folder + ); + + $this->saveSessionData(); + #print"
";print_r($this->sessionData);print"
"; + } + + function getAttachmentList() + { + } + + // create a hopefully unique id, to keep track of different compose windows + // if you do this, you are creating a new email + function getComposeID() + { + mt_srand((float) microtime() * 1000000); + $this->composeID = mt_rand (100000, 999999); + + $this->setDefaults(); + + return $this->composeID; + } + + function getErrorInfo() + { + if(isset($this->errorInfo)) + { + $errorInfo = $this->errorInfo; + unset($this->errorInfo); + return $errorInfo; + } + return false; + } + + function getForwardData($_uid, $_partID, $_folder) + { + $bofelamimail =& CreateObject('felamimail.bofelamimail',$this->displayCharset); + $bofelamimail->openConnection(); + + // get message headers for specified message + $headers = $bofelamimail->getMessageHeader($_uid, $_partID); + // check for Re: in subject header + $this->sessionData['subject'] = "[FWD] " . $bofelamimail->decode_header($headers->Subject); + if($headers->Size) + $size = $headers->Size; + else + $size = lang('unknown'); + + $this->addMessageAttachment($_uid, $_partID, + $_folder, + $bofelamimail->decode_header($headers->Subject), + $size); + + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + // $_mode can be: + // single: for a reply to one address + // all: for a reply to all + function getReplyData($_mode, $_uid, $_partID) + { + $bofelamimail =& CreateObject('felamimail.bofelamimail',$this->displayCharset); + $bofelamimail->openConnection(); + + // get message headers for specified message + $headers = $bofelamimail->getMessageHeader($_uid, $_partID); + + $this->sessionData['uid'] = $_uid; + + // check for Reply-To: header and use if available + if($headers->reply_toaddress) + { + $this->sessionData['to'] = $bofelamimail->decode_header(trim($headers->reply_toaddress)); + } + else + { + $this->sessionData['to'] = $bofelamimail->decode_header(trim($headers->fromaddress)); + } + + if($_mode == 'all') + { + #_debug_array($this->preferences); + // reply to any address which is cc, but not to my self + $oldCC = $bofelamimail->decode_header(trim($headers->ccaddress)); + $addressParts = imap_rfc822_parse_adrlist($oldCC, ''); + if (count($addressParts)>0) + { + while(list($key,$val) = each($addressParts)) + { + if($val->mailbox.'@'.$val->host == $this->preferences['emailAddress']) + { + continue; + } + if(!empty($this->sessionData['cc'])) $this->sessionData['cc'] .= ","; + if(!empty($val->personal)) + { + $this->sessionData['cc'] .= sprintf('"%s" <%s@%s>', + $val->personal, + $val->mailbox, + $val->host); + } + else + { + $this->sessionData['cc'] .= sprintf("%s@%s", + $val->mailbox, + $val->host); + } + } + } + + + // reply to any address which is to, but not to my self + $oldTo = $bofelamimail->decode_header(trim($headers->toaddress)); + $addressParts = imap_rfc822_parse_adrlist($oldTo, ''); + if (count($addressParts)>0) + { + while(list($key,$val) = each($addressParts)) + { + if($val->mailbox.'@'.$val->host == $this->preferences['emailAddress']) + { + continue; + } + #print $val->mailbox.'@'.$val->host."
"; + if(!empty($this->sessionData['to'])) $this->sessionData['to'] .= ", "; + if(!empty($val->personal)) + { + $this->sessionData['to'] .= sprintf('"%s" <%s@%s>', + $val->personal, + $val->mailbox, + $val->host); + } + else + { + $this->sessionData['to'] .= sprintf("%s@%s", + $val->mailbox, + $val->host); + } + } + } + } + + + // check for Re: in subject header + #if(!strncmp()) + #{ + # print "don't match"; + #} + if(strtolower(substr(trim($bofelamimail->decode_header($headers->Subject)), 0, 3)) == "re:") + { + $this->sessionData['subject'] = $bofelamimail->decode_header($headers->Subject); + } + else + { + $this->sessionData['subject'] = "Re: " . $bofelamimail->decode_header($headers->Subject); + } + + $this->sessionData['body'] = $bofelamimail->decode_header($headers->fromaddress) . " ".lang("wrote").": \n>"; + + // get the body + $bodyParts = $bofelamimail->getMessageBody($_uid, 'only_if_no_text', $_partID); + #_debug_array($bodyParts); + for($i=0; $isessionData['body'])) $this->sessionData['body'] .= "\n\n"; + // add line breaks to $bodyParts + $newBody = $this->botranslation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #print "
".$newBody."

"; + $newBody = explode("\n",$newBody); + #_debug_array($newBody); + // create it new, with good line breaks + reset($newBody); + while(list($key,$value) = @each($newBody)) + { + $value .= "\n"; + $bodyAppend = $this->bofelamimail->wordwrap($value,75,"\n"); + $bodyAppend = str_replace("\n", "\n>", $bodyAppend); + $this->sessionData['body'] .= $bodyAppend; + } + } + + + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + function getSessionData() + { + return $this->sessionData; + } + + // get the user name, will will use for the FROM field + function getUserName() + { + $retData = sprintf("%s <%s>",$this->preferences['realname'],$this->preferences['emailAddress']); + return $retData; + } + + function removeAttachment($_formData) + { + $this->sessionData['to'] = $_formData['to']; + $this->sessionData['cc'] = $_formData['cc']; + $this->sessionData['bcc'] = $_formData['bcc']; + $this->sessionData['reply_to'] = $_formData['reply_to']; + $this->sessionData['subject'] = $_formData['subject']; + $this->sessionData['body'] = $_formData['body']; + $this->sessionData['priority'] = $_formData['priority']; + $this->sessionData['signature'] = $_formData['signature']; + + while(list($key,$value) = each($_formData['removeAttachments'])) + { + #print "$key: $value
"; + unlink($this->sessionData['attachments'][$key]['file']); + unset($this->sessionData['attachments'][$key]); + } + reset($this->sessionData['attachments']); + + // if it's empty, clear it totaly + if (count($this->sessionData['attachments']) == 0) + { + $this->sessionData['attachments'] = ''; + } + + $this->saveSessionData(); + } + + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('compose_session_data_'.$this->composeID); + #print "bocompose after restore
";print_r($this->sessionData);print"
"; + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('compose_session_data_'.$this->composeID,'',$this->sessionData); + } + + function send($_formData) + { + $bofelamimail =& CreateObject('felamimail.bofelamimail',$this->displayCharset); + $mail =& CreateObject('phpgwapi.phpmailer'); + + $this->sessionData['to'] = trim($_formData['to']); + $this->sessionData['cc'] = trim($_formData['cc']); + $this->sessionData['bcc'] = trim($_formData['bcc']); + $this->sessionData['reply_to'] = trim($_formData['reply_to']); + $this->sessionData['subject'] = trim($_formData['subject']); + $this->sessionData['body'] = $_formData['body']; + $this->sessionData['priority'] = $_formData['priority']; + $this->sessionData['signature'] = $_formData['signature']; + + + $userLang = $GLOBALS['egw_info']['user']['preferences']['common']['lang']; + $langFile = EGW_SERVER_ROOT."/phpgwapi/setup/phpmailer.lang-$userLang.php"; + if(file_exists($langFile)) + { + $mail->SetLanguage($userLang, EGW_SERVER_ROOT."/phpgwapi/setup/"); + } + else + { + $mail->SetLanguage("en", EGW_SERVER_ROOT."/phpgwapi/setup/"); + } + $mail->PluginDir = EGW_SERVER_ROOT."/phpgwapi/inc/"; + + #print $this->sessionData['uid']."
"; + #print $this->sessionData['folder']."
"; + + #_debug_array($_formData); + #exit; + + #include(EGW_APP_ROOT . "/config/config.php"); + + $mail->IsSMTP(); + $mail->From = $this->preferences['emailAddress'][0]['address']; + $mail->FromName = $bofelamimail->encodeHeader($this->preferences['emailAddress'][0]['name'],'q'); + $mail->Host = $this->preferences['smtpServerAddress']; + $mail->Port = $this->preferences['smtpPort']; + $mail->Priority = $this->sessionData['priority']; + $mail->Encoding = 'quoted-printable'; + $mail->CharSet = $this->displayCharset; + $mail->AddCustomHeader("X-Mailer: FeLaMiMail version 0.9.5"); + if(isset($this->preferences['organizationName'])) + $mail->AddCustomHeader("Organization: ".$bofelamimail->encodeHeader($this->preferences['organizationName'],'q')); + + if (!empty($this->sessionData['to'])) + { + $address_array = imap_rfc822_parse_adrlist($this->sessionData['to'],''); + if(count($address_array)>0) + { + for($i=0;$imailbox."@".$address_array[$i]->host; + $emailName = $bofelamimail->encodeHeader($address_array[$i]->personal,'q'); + $mail->AddAddress($emailAddress,$emailName); + } + } + } + + if (!empty($this->sessionData['cc'])) + { + $address_array = imap_rfc822_parse_adrlist($this->sessionData['cc'],''); + if(count($address_array)>0) + { + for($i=0;$imailbox."@".$address_array[$i]->host; + $emailName = $bofelamimail->encodeHeader($address_array[$i]->personal,'q'); + $mail->AddCC($emailAddress,$emailName); + } + } + } + + if (!empty($this->sessionData['bcc'])) + { + $address_array = imap_rfc822_parse_adrlist($this->sessionData['bcc'],''); + if(count($address_array)>0) + { + for($i=0;$imailbox."@".$address_array[$i]->host; + $emailName = $bofelamimail->encodeHeader($address_array[$i]->personal,'q'); + $mail->AddBCC($emailAddress,$emailName); + } + } + } + + if (!empty($this->sessionData['reply_to'])) + { + $address_array = imap_rfc822_parse_adrlist($this->sessionData['reply_to'],''); + if(count($address_array)>0) + { + $emailAddress = $address_array[0]->mailbox."@".$address_array[0]->host; + $emailName = $bofelamimail->encodeHeader($address_array[0]->personal,'q'); + $mail->AddReplyTo($emailAddress,$emailName); + } + } + + $mail->WordWrap = 76; + $mail->Subject = $bofelamimail->encodeHeader($this->sessionData['subject'],'q'); + $mail->IsHTML(false); + $mail->Body = $this->sessionData['body']; + if (!empty($this->sessionData['signature'])) + { + $mail->Body .= "\r\n-- \r\n"; + $mail->Body .= $this->sessionData['signature']; + } + + // add the attachments + if (is_array($this->sessionData['attachments'])) + { + while(list($key,$value) = each($this->sessionData['attachments'])) + { + switch($value['type']) + { + case 'message/rfc822': + $bofelamimail->openConnection($value['folder']); + + $rawBody = $bofelamimail->getMessageRawBody($value['uid'],$value['partID']); + + $bofelamimail->closeConnection(); + + $mail->AddStringAttachment($rawBody,$value['name'],'7bit','message/rfc822'); + + break; + + default: + $mail->AddAttachment + ( + $value['file'], + $value['name'], + 'base64', + $value['type'] + ); + } + } + } + #$mail->AltBody = $this->sessionData['body']; + + // SMTP Auth?? + if($this->preferences['smtpAuth'] == 'yes') + { + $mail->SMTPAuth = true; + $mail->Username = $this->preferences['username']; + $mail->Password = $this->preferences['key']; + } + + // set a higher timeout for big messages + @set_time_limit(120); + #$mail->SMTPDebug = 10; + if(!$mail->Send()) + { + $this->errorInfo = $mail->ErrorInfo; + return false; + } + + if (isset($this->preferences['sentFolder'])) + { + // mark message as answered + $bofelamimail =& CreateObject('felamimail.bofelamimail'); + $bofelamimail->openConnection($this->preferences['sentFolder']); + $bofelamimail->appendMessage($this->preferences['sentFolder'], + $mail->sentHeader, + $mail->sentBody, + '\\Seen'); + $bofelamimail->closeConnection(); + } + + if(isset($this->sessionData['uid'])) + { + // mark message as answered + $bofelamimail =& CreateObject('felamimail.bofelamimail',$this->sessionData['folder']); + $bofelamimail->openConnection(); + $bofelamimail->flagMessages("answered",array('0' => $this->sessionData['uid'])); + $bofelamimail->closeConnection(); + } + + if(is_array($this->sessionData['attachments'])) + { + reset($this->sessionData['attachments']); + while(list($key,$value) = @each($this->sessionData['attachments'])) + { + #print "$key: ".$value['file']."
"; + if (!empty($value['file'])) // happens when forwarding mails + { + unlink($value['file']); + } + } + } + + $this->sessionData = ''; + $this->saveSessionData(); + + return true; + } + + function setDefaults() + { + $this->sessionData['signature'] = $GLOBALS['egw']->preferences->parse_notify($this->preferences['signature']); + + $this->saveSessionData(); + } + + function stripSlashes($_string) + { + if (get_magic_quotes_gpc()) + { + return stripslashes($_string); + } + else + { + return $_string; + } + } + + +}