diff --git a/felamimail/inc/class.bofelamimail.inc.php b/felamimail/inc/class.bofelamimail.inc.php
new file mode 100644
index 0000000000..a6bc81494a
--- /dev/null
+++ b/felamimail/inc/class.bofelamimail.inc.php
@@ -0,0 +1,1765 @@
+ True,
+ 'reopen' => True
+ );
+
+ var $mbox; // the mailbox identifier any function should use
+
+ // define some constants
+ // message types
+ var $type = array("text", "multipart", "message", "application", "audio", "image", "video", "other");
+
+ // message encodings
+ var $encoding = array("7bit", "8bit", "binary", "base64", "quoted-printable", "other");
+
+ // set to true, if php is compiled with multi byte string support
+ var $mbAvailable = FALSE;
+
+ // what type of mimeTypes do we want from the body(text/html, text/plain)
+ var $htmlOptions;
+
+ var $sessionData;
+
+ function bofelamimail($_displayCharset='iso-8859-1')
+ {
+ $this->restoreSessionData();
+
+ // FIXME: this->foldername seems to be unused
+ //$this->foldername = $this->sessionData['mailbox'];
+ $this->accountid = $GLOBALS['egw_info']['user']['account_id'];
+
+ $this->bopreferences =& CreateObject('felamimail.bopreferences');
+ $this->sofelamimail =& CreateObject('felamimail.sofelamimail');
+ $this->botranslation =& CreateObject('phpgwapi.translation');
+
+ $this->mailPreferences = $this->bopreferences->getPreferences();
+ $this->imapBaseDir = '';
+
+ $this->displayCharset = $_displayCharset;
+
+ // set some defaults
+ //if(count($this->sessionData) == 0) // regis (for me PHP4.1.3it's not working)
+ if(empty($this->sessionData))
+ {
+ // this should be under user preferences
+ // sessionData empty
+ // no filter active
+ $this->sessionData['activeFilter'] = "-1";
+ // default mailbox INBOX
+ $this->sessionData['mailbox'] = "INBOX";
+ // default start message
+ $this->sessionData['startMessage'] = 1;
+ // default mailbox for preferences pages
+ $this->sessionData['preferences']['mailbox'] = "INBOX";
+ // default sorting
+ $this->sessionData['sort'] = $this->mailPreferences['sortOrder'];
+ $this->saveSessionData();
+ }
+
+ if (function_exists('mb_convert_encoding')) $this->mbAvailable = TRUE;
+
+ $this->htmlOptions = $this->mailPreferences['htmlOptions'];
+
+ $this->profileID = $this->mailPreferences['profileID'];
+
+ }
+
+ function addACL($_folderName, $_accountName, $_acl)
+ {
+ imap_setacl($this->mbox, $_folderName, $_accountName, $_acl);
+
+ return TRUE;
+ }
+
+ /**
+ * hook to add account
+ *
+ * this function is a wrapper function for emailadmin
+ *
+ * @param _hookValues contains the hook values as array
+ * @returns nothing
+ */
+ function addAccount($_hookValues)
+ {
+ ExecMethod('emailadmin.bo.addAccount',$_hookValues);
+ }
+
+ function adminMenu()
+ {
+ if ($GLOBALS['egw_info']['server']['account_repository'] == "ldap")
+ {
+ $data = Array
+ (
+ 'description' => 'email settings',
+ 'url' => '/index.php',
+ 'extradata' => 'menuaction=emailadmin.uiuserdata.editUserData'
+ );
+
+ //Do not modify below this line
+ global $menuData;
+
+ $menuData[] = $data;
+ }
+ }
+
+ function appendMessage($_folderName, $_header, $_body, $_flags)
+ {
+ #print "
$_header.$_body
";
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+ $header = str_replace("\n","\r\n",$_header);
+ $body = str_replace("\n","\r\n",$_body);
+ $result = @imap_append($this->mbox, $mailboxString, "$header"."$body", $_flags);
+ #print imap_last_error();
+ return $result;
+ }
+
+ function closeConnection()
+ {
+ if(is_resource($this->mbox))
+ {
+ imap_close($this->mbox);
+ }
+ }
+
+ function compressFolder($_folderName = false)
+ {
+ $prefs = $this->bopreferences->getPreferences();
+
+
+ $folderName = ($_folderName ? $_folderName : $this->sessionData['mailbox']);
+ $deleteOptions = $prefs['deleteOptions'];
+ $trashFolder = $prefs['trash_folder'];
+
+ if($folderName == $trashFolder && $deleteOptions == "move_to_trash")
+ {
+ // delete all messages in the trash folder
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$folderName,3,$this->profileID);
+ $status = imap_status ($this->mbox, $mailboxString, SA_ALL);
+ $numberOfMessages = $status->messages;
+ $msgList = "1:$numberOfMessages";
+ imap_delete($this->mbox, $msgList);
+ imap_expunge($this->mbox);
+
+ $caching =& CreateObject('felamimail.bocaching',
+ $this->mailPreferences['imapServerAddress'],
+ $this->mailPreferences['username'],
+ $folderName);
+ $caching->clearCache($folderName);
+ }
+ elseif($deleteOptions == "mark_as_deleted")
+ {
+ // delete all messages in the current folder which have the deleted flag set
+ imap_expunge($this->mbox);
+ $this->updateCache($folderName);
+ }
+ }
+
+ function decodeFolderName($_folderName)
+ {
+ if($this->mbAvailable)
+ {
+ return mb_convert_encoding( $_folderName, $this->displayCharset, "UTF7-IMAP");
+ }
+
+ // if not
+ return @imap_utf7_decode($_folderName);
+ }
+
+ function decodeMimePart($_mimeMessage, $_encoding) {
+ #// MS-Outlookbug workaround (don't break links)
+ #$mimeMessage = preg_replace("!((http(s?)://)|((www|ftp)\.))(([^\n\t\r]+)([=](\r)?\n))+!i",
+ # "$1$7",
+ # $_mimeMessage);
+
+ // decode the file ...
+ switch ($_encoding)
+ {
+ case ENCBASE64:
+ // use imap_base64 to decode
+ return imap_base64($_mimeMessage);
+ break;
+ case ENCQUOTEDPRINTABLE:
+ // use imap_qprint to decode
+ return quoted_printable_decode($_mimeMessage);
+ break;
+ case ENCOTHER:
+ // not sure if this needs decoding at all
+ #break;
+ default:
+ // it is either not encoded or we don't know about it
+ return $_mimeMessage;
+ break;
+ }
+ }
+
+ function decode_header($string)
+ {
+ #print "decode header: $string
";
+ $newString = '';
+ $elements=imap_mime_header_decode($string);
+ for($i=0;$icharset}
";
+ #echo "Text: {$elements[$i]->text}
";
+ if ($elements[$i]->charset == 'default')
+ $elements[$i]->charset = 'iso-8859-1';
+ $tempString = $this->botranslation->convert($elements[$i]->text,$elements[$i]->charset);
+ $newString .= $tempString;
+ }
+ return $newString;
+ }
+
+ function deleteAccount($_hookValues)
+ {
+ ExecMethod('emailadmin.bo.deleteAccount',$_hookValues);
+ }
+
+ function deleteMessages($_messageUID)
+ {
+ $caching =& CreateObject('felamimail.bocaching',
+ $this->mailPreferences['imapServerAddress'],
+ $this->mailPreferences['username'],
+ $this->sessionData['mailbox']);
+
+ reset($_messageUID);
+ while(list($key, $value) = each($_messageUID))
+ {
+ if(!empty($msglist)) $msglist .= ",";
+ $msglist .= $value;
+ }
+
+ $prefs = $this->bopreferences->getPreferences();
+
+ $deleteOptions = $prefs['deleteOptions'];
+ $trashFolder = $prefs['trash_folder'];
+
+ if($this->sessionData['mailbox'] == $trashFolder && $deleteOptions == "move_to_trash")
+ {
+ $deleteOptions = "remove_immediately";
+ }
+
+ $this->reopen($this->sessionData['mailbox']);
+
+ switch($deleteOptions)
+ {
+ case "move_to_trash":
+ if(!empty($trashFolder))
+ {
+ if (imap_mail_move ($this->mbox, $msglist, $this->encodeFolderName($trashFolder), CP_UID))
+ {
+ imap_expunge($this->mbox);
+ reset($_messageUID);
+ while(list($key, $value) = each($_messageUID))
+ {
+ $caching->removeFromCache($value);
+ }
+ }
+ else
+ {
+ //print imap_last_error()."
";
+ error_log(imap_last_error());
+ }
+ }
+ break;
+
+ case "mark_as_deleted":
+ imap_delete($this->mbox, $msglist, FT_UID);
+ break;
+
+ case "remove_immediately":
+ imap_delete($this->mbox, $msglist, FT_UID);
+ imap_expunge ($this->mbox);
+ reset($_messageUID);
+ while(list($key, $value) = each($_messageUID))
+ {
+ $caching->removeFromCache($value);
+ }
+ break;
+ }
+ }
+
+ function encodeFolderName($_folderName)
+ {
+ if($this->mbAvailable)
+ {
+ return mb_convert_encoding( $_folderName, "UTF7-IMAP", $this->displayCharset );
+ }
+
+ // if not
+ return imap_utf7_encode($_folderName);
+ }
+
+ function encodeHeader($_string, $_encoding='q')
+ {
+ switch($_encoding)
+ {
+ case "q":
+ if(!preg_match("/[\x80-\xFF]/",$_string))
+ {
+ // nothing to quote, only 7 bit ascii
+ return $_string;
+ }
+
+ $string = imap_8bit($_string);
+ $stringParts = explode("=\r\n",$string);
+ while(list($key,$value) = each($stringParts))
+ {
+ if(!empty($retString)) $retString .= " ";
+ $value = str_replace(" ","_",$value);
+ // imap_8bit does not convert "?"
+ // it does not need, but it should
+ $value = str_replace("?","=3F",$value);
+ $retString .= "=?".strtoupper($this->displayCharset)."?Q?".$value."?=";
+ }
+ #exit;
+ return $retString;
+ break;
+ default:
+ return $_string;
+ }
+ }
+
+ function flagMessages($_flag, $_messageUID)
+ {
+ reset($_messageUID);
+ while(list($key, $value) = each($_messageUID))
+ {
+ if(!empty($msglist)) $msglist .= ",";
+ $msglist .= $value;
+ }
+
+ switch($_flag)
+ {
+ case "flagged":
+ $result = imap_setflag_full ($this->mbox, $msglist, "\\Flagged", ST_UID);
+ break;
+ case "read":
+ $result = imap_setflag_full ($this->mbox, $msglist, "\\Seen", ST_UID);
+ break;
+ case "answered":
+ $result = imap_setflag_full ($this->mbox, $msglist, "\\Answered", ST_UID);
+ break;
+ case "unflagged":
+ $result = imap_clearflag_full ($this->mbox, $msglist, "\\Flagged", ST_UID);
+ break;
+ case "unread":
+ $result = imap_clearflag_full ($this->mbox, $msglist, "\\Seen", ST_UID);
+ $result = imap_clearflag_full ($this->mbox, $msglist, "\\Answered", ST_UID);
+ break;
+ }
+
+
+ #print "Result: $result
";
+ }
+
+ // this function is based on a on "Building A PHP-Based Mail Client"
+ // http://www.devshed.com
+ // fetch a specific attachment from a message
+ function getAttachment($_uid, $_partID)
+ {
+ // parse message structure
+ $structure = imap_fetchstructure($this->mbox, $_uid, FT_UID);
+ $sections = array();
+ $this->parseMessage($sections, $structure, $_partID);
+
+ #_debug_array($sections);
+
+ $type = $sections[$_partID]["mimeType"];
+ $encoding = $sections[$_partID]["encoding"];
+ $filename = $sections[$_partID]["name"];
+
+ $attachment = imap_fetchbody($this->mbox, $_uid, $_partID, FT_UID);
+
+ switch ($encoding)
+ {
+ case ENCBASE64:
+ // use imap_base64 to decode
+ $attachment = imap_base64($attachment);
+ break;
+ case ENCQUOTEDPRINTABLE:
+ // use imap_qprint to decode
+ $attachment = imap_qprint($attachment);
+ break;
+ case ENCOTHER:
+ // not sure if this needs decoding at all
+ break;
+ default:
+ // it is either not encoded or we don't know about it
+ }
+
+ return array(
+ 'type' => $type,
+ 'encoding' => $encoding,
+ 'filename' => $filename,
+ 'attachment' => $attachment
+ );
+ }
+
+ function getEMailProfile()
+ {
+ $config =& CreateObject('phpgwapi.config','felamimail');
+ $config->read_repository();
+ $felamimailConfig = $config->config_data;
+
+ #_debug_array($felamimailConfig);
+
+ if(!isset($felamimailConfig['profileID']))
+ {
+ return -1;
+ }
+ else
+ {
+ return intval($felamimailConfig['profileID']);
+ }
+ }
+
+ function getFolderStatus($_folderName)
+ {
+ $retValue = array();
+
+ // now we have the keys as values
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+ if($folderInfo = imap_getsubscribed($this->mbox,$mailboxString,$mailboxString))
+ {
+ $retValue['subscribed'] = true;
+ }
+ elseif($folderInfo = imap_getmailboxes($this->mbox,$mailboxString,$mailboxString))
+ {
+ $retValue['subscribed'] = false;
+ }
+ else
+ {
+ // folder does not exist
+ return false;
+ }
+
+ $retValue['delimiter'] = (isset($folderInfo[0]->delimiter)?$folderInfo[0]->delimiter:'.');
+ $shortNameParts = explode($retValue['delimiter'], $_folderName);
+ $retValue['shortName'] = array_pop($shortNameParts);
+
+ $folderStatus = imap_status($this->mbox,$mailboxString,SA_ALL);
+ if($folderStatus)
+ {
+ // merge a array and object to a array
+ $retValue = array_merge($retValue,(array)$folderStatus);
+ }
+
+ return $retValue;
+ }
+
+ /**
+ * get IMAP folder objects
+ *
+ * returns an array of IMAP folder objects. Put INBOX folder in first
+ * position. Preserves the folder seperator for later use. The returned
+ * array is indexed using the foldername.
+ *
+ * @param _subscribedOnly boolean get subscribed or all folders
+ * @param _getCounters boolean get get messages counters
+ *
+ * @returns array with folder objects. eg.: INBOX => {inbox object}
+ */
+ function getFolderObjects($_subscribedOnly=false, $_getCounters=false)
+ {
+ $folders = array();
+ if (!is_resource($this->mbox))
+ {
+ return $folders;
+ }
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$this->imapBaseDir,3,$this->profileID);
+ $inboxMailboxString = ExecMethod('emailadmin.bo.getMailboxString','INBOX',3,$this->profileID);
+
+ // we always fetch the subscribed first, to be able to detect subscribed state
+ $list = (array)imap_getsubscribed($this->mbox,$mailboxString,"*");
+ foreach($list as $folderInfo)
+ {
+ $subscribedFolders[$folderInfo->name] = true;
+ }
+
+ // make sure that we always return the INBOX
+ if(!$subscribedFolders[$inboxMailboxString])
+ {
+ $inboxList = imap_getmailboxes($this->mbox,$mailboxString,"INBOX");
+ foreach($inboxList as $folderInfo)
+ {
+ if($folderInfo->name == $inboxMailboxString)
+ {
+ $list[] = $folderInfo;
+ break;
+ }
+ }
+ }
+
+ if($_subscribedOnly == false)
+ {
+ $list = imap_getmailboxes($this->mbox,$mailboxString,"*");
+ }
+
+ if(is_array($list))
+ {
+ reset($list);
+ $inboxFolders = array();
+ $otherFolders = array();
+ while (list($key, $val) = each($list))
+ {
+ if($subscribedFolders[$val->name])
+ $val->subscribed = TRUE;
+ else
+ $val->subscribed = FALSE;
+
+ if(empty($val->delimiter))
+ $val->delimiter = '.';
+
+ $folderNameIMAP = $this->decodeFolderName(preg_replace("/{.*}/",'',$val->name));
+ if($_getCounters == true)
+ {
+ $val->counter = imap_status($this->mbox,$val->name,SA_ALL);
+ }
+ $inboxPos = strpos($folderNameIMAP,'INBOX');
+ if ($inboxPos !== false AND $inboxPos == 0)
+ {
+ $inboxFolders["$folderNameIMAP"] = $val;
+ }
+ else
+ {
+ $otherFolders["$folderNameIMAP"] = $val;
+ }
+ }
+ ksort($inboxFolders,SORT_STRING);
+ ksort($otherFolders,SORT_STRING);
+ $folders = $inboxFolders + $otherFolders;
+
+ return $folders;
+ }
+ else
+ {
+ if($_subscribedOnly == 'true' &&
+ is_array($inboxName = imap_list($this->mbox,$mailboxString,'INBOX')))
+ {
+ $inboxData = imap_getmailboxes($this->mbox,$mailboxString,'INBOX');
+ $folders['INBOX'] = $inboxData[0];
+
+ return $folders;
+ }
+ }
+ }
+
+ function getMimePartCharset($_mimePartObject) {
+ $charSet = 'ISO-8859-1';
+
+ if(is_array($_mimePartObject->parameters)) {
+ foreach($_mimePartObject->parameters as $parameters) {
+ if(strtoupper($parameters->attribute) == 'CHARSET') {
+ $charSet = $parameters->value;
+ }
+ }
+ }
+
+ return $charSet;
+ }
+
+ function getMultipartAlternative($_uid, $_parentPartID, $_structure, $_htmlMode) {
+ // a multipart/alternative has exactly 2 parts (text and html)
+ $i=1;
+ $partText;
+ $partHTML;
+ $parentPartID = ($_parentPartID != '') ? $_parentPartID.'.' : $_parentPartID;
+
+ foreach($_structure->parts as $mimePart) {
+ if($mimePart->type == TYPETEXT && $mimePart->subtype == 'PLAIN' && $mimePart->bytes > 0) {
+ $partText = array(
+ 'partID' => $parentPartID.$i ,
+ 'charset' => $this->getMimePartCharset($mimePart) ,
+ 'encoding' => $mimePart->encoding ,
+ );
+ } elseif ($mimePart->type == TYPETEXT && $mimePart->subtype == 'HTML' && $mimePart->bytes > 0) {
+ $partHTML = array(
+ 'partID' => $parentPartID.$i ,
+ 'charset' => $this->getMimePartCharset($mimePart) ,
+ 'encoding' => $mimePart->encoding ,
+ );
+ }
+ $i++;
+ }
+
+ switch($_htmlMode) {
+ case 'always_display':
+ if(is_array($partHTML)) {
+ $partContent = $this->decodeMimePart(
+ imap_fetchbody($this->mbox, $_uid, $partHTML['partID'], FT_UID) ,
+ $partHTML['encoding']
+ );
+ $bodyPart[] = array(
+ 'body' => $partContent ,
+ 'mimeType' => 'text/html' ,
+ 'charSet' => $partHTML['charset']
+ );
+ }
+ break;
+ case 'only_if_no_text':
+ if(is_array($partHTML) && !is_array($partText)) {
+ $partContent = $this->decodeMimePart(
+ imap_fetchbody($this->mbox, $_uid, $partHTML['partID'], FT_UID) ,
+ $partHTML['encoding']
+ );
+ $bodyPart[] = array(
+ 'body' => $partContent ,
+ 'mimeType' => 'text/html' ,
+ 'charSet' => $partHTML['charset']
+ );
+ } elseif (is_array($partText)) {
+ $partContent = $this->decodeMimePart(
+ imap_fetchbody($this->mbox, $_uid, $partText['partID'], FT_UID) ,
+ $partText['encoding']
+ );
+
+ $bodyPart[] = array(
+ 'body' => $partContent ,
+ 'mimeType' => 'text/plain' ,
+ 'charSet' => $partText['charset']
+ );
+ }
+ break;
+
+ default:
+ if (is_array($partText)) {
+ $partContent = $this->decodeMimePart(
+ imap_fetchbody($this->mbox, $_uid, $partText['partID'], FT_UID) ,
+ $partText['encoding']
+ );
+
+ $bodyPart[] = array(
+ 'body' => $partContent ,
+ 'mimeType' => 'text/plain' ,
+ 'charSet' => $partText['charset']
+ );
+ }
+ break;
+ }
+
+ return $bodyPart;
+
+ }
+
+ #function microtime_float()
+ #{
+ # list($usec, $sec) = explode(" ", microtime());
+ # return ((float)$usec + (float)$sec);
+ #}
+
+ function updateCache($_folderName)
+ {
+ $caching =& CreateObject('felamimail.bocaching',
+ $this->mailPreferences['imapServerAddress'],
+ $this->mailPreferences['username'],
+ $_folderName);
+
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+ $status = imap_status ($this->mbox, $mailboxString, SA_ALL);
+ $this->reopen($_folderName);
+
+ $cachedStatus = $caching->getImapStatus();
+
+ // no data cached yet?
+ // get all message informations from the imap server for this folder
+ if ($cachedStatus['uidnext'] == 0 || $cachedStatus['uidnext'] > $status->uidnext)
+ {
+ //drop all cached info for this folder
+ $caching->clearCache();
+ #print "nix gecached!!
";
+ #print "current UIDnext :".$cachedStatus['uidnext']."
";
+ # "new UIDnext :".$status->uidnext."
";
+ // (regis) seems to be necessary to reopen...
+ for($i=1; $i<=$status->messages; $i++)
+ {
+ @set_time_limit();// FIXME: beware no effect if in PHP safe_mode
+ $messageData['uid'] = imap_uid($this->mbox, $i);
+ $header = imap_headerinfo($this->mbox, $i);
+ // parse structure to see if attachments exist
+ // display icon if so
+ $structure = imap_fetchstructure($this->mbox, $i);
+ $sections = array();
+ $this->parseMessage($sections, $structure);
+
+ $messageData['date'] = $header->udate;
+ $messageData['subject'] = $header->subject;
+ $messageData['to_name'] = $header->to[0]->personal;
+ $messageData['to_address'] = $header->to[0]->mailbox."@".$header->to[0]->host;
+ $messageData['sender_name'] = $header->from[0]->personal;
+ $messageData['sender_address'] = $header->from[0]->mailbox."@".$header->from[0]->host;
+ $messageData['size'] = $header->Size;
+
+ $messageData['attachments'] = "false";
+
+ foreach($sections as $key => $value)
+ {
+ if($value['type'] == 'attachment')
+ {
+ $messageData['attachments'] = "true";
+ break;
+ }
+ }
+
+ $caching->addToCache($messageData);
+
+ unset($messageData);
+ }
+
+ $caching->updateImapStatus($status);
+ }
+ // update cache, but only add new emails
+ elseif($status->uidnext != $cachedStatus['uidnext'])
+ {
+ #print "found new messages
";
+ #print "new uidnext: ".$status->uidnext." old uidnext: ".$cachedStatus['uidnext']."
";
+ $uidRange = $cachedStatus['uidnext'].":".$status->uidnext;
+ #print "$uidRange
";
+ #return $uidRange;
+ $newHeaders = imap_fetch_overview($this->mbox,$uidRange,FT_UID);
+ $countNewHeaders = count($newHeaders);
+ for($i=0; $i<$countNewHeaders; $i++)
+ {
+ $messageData['uid'] = $newHeaders[$i]->uid;
+ $header = imap_headerinfo($this->mbox, $newHeaders[$i]->msgno);
+ // parse structure to see if attachments exist
+ // display icon if so
+ $structure = imap_fetchstructure($this->mbox, $newHeaders[$i]->msgno);
+ $sections = array();
+ $this->parseMessage($sections, $structure);
+
+ $messageData['date'] = $header->udate;
+ $messageData['subject'] = $header->subject;
+ $messageData['to_name'] = $header->to[0]->personal;
+ $messageData['to_address'] = $header->to[0]->mailbox."@".$header->to[0]->host;
+ $messageData['sender_name'] = $header->from[0]->personal;
+ $messageData['sender_address'] = $header->from[0]->mailbox."@".$header->from[0]->host;
+ $messageData['size'] = $header->Size;
+
+ $messageData['attachments'] = "false";
+ foreach($sections as $key => $value)
+ {
+ if($value['type'] == 'attachment')
+ {
+ $messageData['attachments'] = "true";
+ break;
+ }
+ }
+
+ // maybe it's already in the database
+ // lets remove it, sometimes the database gets out of sync
+ $caching->removeFromCache($messageData['uid']);
+
+ $caching->addToCache($messageData);
+
+ unset($messageData);
+ }
+ $caching->updateImapStatus($status);
+ }
+
+ // now let's do some clean up
+ // if we have more messages in the cache then in the imap box, some external
+ // imap client deleted some messages. It's better to erase the messages from the cache.
+ #$displayHeaders = $caching->getHeaders();
+ #printf ("this->bofelamimail->getHeaders start: %s Zeile: %d
",$this->microtime_float()-$start, __LINE__);
+ $dbMessageCounter = $caching->getMessageCounter();
+ #printf ("this->bofelamimail->getHeaders start: %s Zeile: %d
",$this->microtime_float()-$start, __LINE__);
+ #print count($displayHeaders) .' - '.$messageCounter."
";
+ if ($dbMessageCounter > $status->messages)
+ {
+ $displayHeaders = $caching->getHeaders();
+ $messagesToRemove = count($displayHeaders) - $status->messages;
+ if ($displayHeaders) {
+ reset($displayHeaders);
+ }
+ for($i=0; $imbox,$displayHeaders[$i]['uid'],FT_UID);
+ if (count($header[0]) == 0)
+ {
+ $caching->removeFromCache($displayHeaders[$i]['uid']);
+ $removedMessages++;
+ }
+ if ($removedMessages == $messagesToRemove) break;
+ }
+ }
+
+ }
+
+ function getHeaders($_startMessage, $_numberOfMessages, $_sort)
+ {
+ $caching =& CreateObject('felamimail.bocaching',
+ $this->mailPreferences['imapServerAddress'],
+ $this->mailPreferences['username'],
+ $this->sessionData['mailbox']);
+ $bofilter =& CreateObject('felamimail.bofilter');
+ $transformdate =& CreateObject('felamimail.transformdate');
+
+ $this->updateCache($this->sessionData['mailbox']);
+
+ $filter = $bofilter->getFilter($this->sessionData['activeFilter']);
+ $displayHeaders = $caching->getHeaders($_startMessage, $_numberOfMessages, $_sort, $filter);
+
+ $count=0;
+ $countDisplayHeaders = count($displayHeaders);
+ for ($i=0;$i<$countDisplayHeaders;$i++)
+ {
+ $header = imap_fetch_overview($this->mbox,$displayHeaders[$i]['uid'],FT_UID);
+
+ $retValue['header'][$count]['subject'] = $this->decode_header($displayHeaders[$i]['subject']);
+ $retValue['header'][$count]['sender_name'] = $this->decode_header($displayHeaders[$i]['sender_name']);
+ $retValue['header'][$count]['sender_address'] = $this->decode_header($displayHeaders[$i]['sender_address']);
+ $retValue['header'][$count]['to_name'] = $this->decode_header($displayHeaders[$i]['to_name']);
+ $retValue['header'][$count]['to_address'] = $this->decode_header($displayHeaders[$i]['to_address']);
+ $retValue['header'][$count]['attachments'] = $displayHeaders[$i]['attachments'];
+ $retValue['header'][$count]['size'] = $this->decode_header($header[0]->size);
+
+ $timestamp = $displayHeaders[$i]['date'];
+ $timestamp7DaysAgo =
+ mktime(date("H"), date("i"), date("s"), date("m"), date("d")-7, date("Y"));
+ $timestampNow =
+ mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y"));
+
+ // date from the future
+ if($timestamp > $timestampNow)
+ {
+ $retValue['header'][$count]['date'] = date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],$timestamp);
+ }
+
+ // email from today, show only time
+ elseif (date("Y-m-d") == date("Y-m-d",$timestamp))
+ {
+ $retValue['header'][$count]['date'] = date("H:i:s",$timestamp);
+ }
+ // email from the last 7 days, show only weekday
+ elseif($timestamp7DaysAgo < $timestamp)
+ {
+ $retValue['header'][$count]['date'] = lang(date("l",$timestamp));
+ #$retValue['header'][$count]['date'] = date("Y-m-d H:i:s",$timestamp7DaysAgo)." - ".date("Y-m-d",$timestamp);
+ $retValue['header'][$count]['date'] = date("H:i:s",$timestamp)."(".lang(date("D",$timestamp)).")";
+ }
+ else
+ {
+ $retValue['header'][$count]['date'] = date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],$timestamp);
+ }
+ $retValue['header'][$count]['id'] = $header[0]->msgno;
+ $retValue['header'][$count]['uid'] = $displayHeaders[$i]['uid'];
+ $retValue['header'][$count]['recent'] = $header[0]->recent;
+ $retValue['header'][$count]['flagged'] = $header[0]->flagged;
+ $retValue['header'][$count]['answered'] = $header[0]->answered;
+ $retValue['header'][$count]['deleted'] = $header[0]->deleted;
+ $retValue['header'][$count]['seen'] = $header[0]->seen;
+ $retValue['header'][$count]['draft'] = $header[0]->draft;
+
+ #$retValue['header'][$count]['recent'] = $this->sessionData['mailbox'];
+
+ $count++;
+ }
+
+ #printf ("this->bofelamimail->getHeaders start: %s Zeile: %d
",$this->microtime_float()-$start, __LINE__);
+
+ #printf ("this->bofelamimail->getHeaders done: %s
",date("H:i:s",mktime()));
+
+ if(is_array($retValue['header']))
+ {
+ #_debug_array($retValue['header']);
+ $retValue['info']['total'] = $caching->getMessageCounter($filter);
+ $retValue['info']['first'] = $_startMessage;
+ $retValue['info']['last'] = $_startMessage + $count - 1 ;
+ return $retValue;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ function getIMAPACL($_folderName)
+ {
+ $acl = array();
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+ if(function_exists('imap_getacl'))
+ {
+ $acl = imap_getacl ($this->mbox, $this->encodeFolderName($_folderName));
+ }
+
+ return $acl;
+ }
+
+ function getMailPreferences()
+ {
+ return $this->mailPreferences;
+ }
+
+ function getMessageAttachments($_uid, $_partID='')
+ {
+ $structure = imap_fetchstructure($this->mbox, $_uid, FT_UID);
+ $sections = array();
+ $this->parseMessage($sections, $structure, $_partID);
+
+ $arrayData = array();
+ if(count($sections) > 0)
+ {
+ foreach($sections as $key => $value)
+ {
+ if($value['type'] == 'attachment' && $sections[substr($key,0,-2)]['mimeType'] != "multipart/alternative")
+ {
+ $arrayData[] = $value;
+ }
+ }
+ if(count($arrayData) > 0)
+ {
+ return $arrayData;
+ }
+ }
+
+
+ return false;
+
+ }
+
+ function getMessageBody($_uid, $_htmlOptions='', $_partID='', $_structure='')
+ {
+ #print "UID: $_uid HTML: $_htmlOptions PART: $_partID
";
+ #print $this->htmlOptions."
";
+ #require_once('Mail/mimeDecode.php');
+ #$messageBody = imap_fetchbody($this->mbox, $_uid, '', FT_UID);
+ #print "".$messageBody."
"; print "
";
+ #$decoder = new Mail_mimeDecode($messageBody);
+ #$structure = $decoder->decode($params);
+
+ if($_htmlOptions != '')
+ $this->htmlOptions = $_htmlOptions;
+
+ if(is_object($_structure)) {
+ $structure = $_structure;
+ } else {
+ $structure = imap_fetchstructure($this->mbox, $_uid, FT_UID);
+ if($_partID != '') {
+ $imapPartIDs = explode('.',$_partID);
+ foreach($imapPartIDs as $id) {
+ if($structure->type == TYPEMESSAGE && $structure->subtype == 'RFC822') {
+ $structure = $structure->parts[0]->parts[$id-1];
+ } else {
+ $structure = $structure->parts[$id-1];
+ }
+ }
+ }
+ }
+ #_debug_array($structure);
+ if($structure->type == TYPETEXT) {
+ $bodyPart = array();
+ if (($structure->subtype == 'HTML' || $structure->subtype == 'PLAIN') && $structure->disposition != 'ATTACHMENT') {
+ // only text or html email
+ #print "_patrID = $_partID";
+ if($_partID == '')
+ $_partID=1;
+ #else
+ # $_partID=$_partID.'.1';
+ #$partID = $_partID == '' ? $_partID=1 : $_partID=$_partID.'.1';
+ $partID = $_partID;
+ $mimePartBody = imap_fetchbody($this->mbox, $_uid, $partID, FT_UID);
+ $bodyPart = array(
+ array(
+ 'body' => $this->decodeMimePart($mimePartBody, $structure->encoding),
+ 'mimeType' => $structure->subtype == 'HTML' ? 'text/html' : 'text/plain',
+ 'charSet' => $this->getMimePartCharset($structure),
+ )
+ );
+ }
+ return $bodyPart;
+
+ } elseif ($structure->type == TYPEMULTIPART && $structure->subtype == 'ALTERNATIVE') {
+ return $this->getMultipartAlternative($_uid, $_partID, $structure, $this->htmlOptions);
+
+ #} elseif (($structure->type == TYPEMULTIPART && ($structure->subtype == 'MIXED' || $structure->subtype == 'REPORT' || $structure->subtype == 'SIGNED'))) {
+ } elseif ($structure->type == TYPEMULTIPART) {
+ $i = 1;
+ $parentPartID = ($_partID != '') ? $_partID.'.' : '';
+ $bodyParts = array();
+ foreach($structure->parts as $part) {
+ if($part->type == TYPETEXT || ($part->type == TYPEMULTIPART && $part->subtype == 'ALTERNATIVE')) {
+ $bodyParts = array_merge($bodyParts, $this->getMessageBody($_uid, $this->htmlOptions, $parentPartID.$i, $part));
+ }
+ $i++;
+ }
+ return $bodyParts;
+ } elseif ($structure->type == TYPEMESSAGE && $structure->subtype == 'RFC822') {
+ #$bodyParts = $this->getMessageBody($_uid, $this->htmlOptions, $_partID, $structure->parts[0]);
+ #return $bodyParts;
+ $i=1;
+ foreach($structure->parts as $part) {
+ if($part->type == TYPEMULTIPART &&
+ ($part->subtype == 'RELATED' || $part->subtype == 'MIXED' || $part->subtype == 'ALTERNATIVE' || $part->subtype == 'REPORT') ) {
+ $bodyParts = $this->getMessageBody($_uid, $this->htmlOptions, $_partID, $part);
+ } else {
+ $bodyParts = $this->getMessageBody($_uid, $this->htmlOptions, $_partID.'.'.$i, $part);
+ }
+ $i++;
+ }
+ return $bodyParts;
+ } elseif ($structure->type == TYPEMESSAGE && $structure->subtype == 'DELIVERY-STATUS') {
+ // only text
+ if($_partID == '') $_partID=1;
+ $mimePartBody = imap_fetchbody($this->mbox, $_uid, $_partID, FT_UID);
+ $bodyPart = array(
+ array(
+ 'body' => $this->decodeMimePart($mimePartBody, $structure->encoding),
+ 'mimeType' => 'text/plain',
+ 'charSet' => $this->getMimePartCharset($structure),
+ )
+ );
+ return $bodyPart;
+ } else {
+ $bodyPart = array(
+ array(
+ 'body' => lang('The mimeparser can not parse this message.'),
+ 'mimeType' => 'text/plain',
+ 'charSet' => 'iso-8859-1',
+ )
+ );
+ return $bodyPart;
+ }
+ }
+
+
+ function getMessageHeader($_uid, $_partID = '')
+ {
+ $msgno = imap_msgno($this->mbox, $_uid);
+ if($_partID == '')
+ {
+
+ $retValue = imap_header($this->mbox, $msgno);
+ }
+ else
+ {
+ // do it the hard way
+ // we need to fetch the headers of another part(message/rfcxxxx)
+ $headersPart = imap_fetchbody($this->mbox, $_uid, $_partID.".0", FT_UID);
+ $retValue = imap_rfc822_parse_headers($headersPart);
+ }
+ #_debug_array($retValue);
+ return $retValue;
+ }
+
+ function getMessageRawBody($_uid, $_partID = '')
+ {
+ if($_partID != '')
+ {
+ $body = imap_fetchbody($this->mbox, $_uid, $_partID, FT_UID);
+ }
+ else
+ {
+ $header = imap_fetchheader($this->mbox, $_uid, FT_UID);
+ $body = $header.imap_body($this->mbox, $_uid, FT_UID);
+ }
+
+ return $body;
+ }
+
+ function getMessageRawHeader($_uid, $_partID = '')
+ {
+ if(!$_partID == '')
+ {
+ return imap_fetchbody($this->mbox, $_uid, $_partID.'.0', FT_UID);
+ }
+ else
+ {
+ return imap_fetchheader($this->mbox, $_uid, FT_UID);
+ }
+ }
+
+ function getMessageStructure($_uid)
+ {
+ return imap_fetchstructure($this->mbox, $_uid, FT_UID);
+ }
+
+ // return the qouta of the users INBOX
+ function getQuotaRoot()
+ {
+ if(is_array($this->storageQuota))
+ {
+ return $this->storageQuota;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function imap_createmailbox($_folderName, $_subscribe = False)
+ {
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+
+ $result = @imap_createmailbox($this->mbox,$mailboxString);
+
+ if($_subscribe)
+ {
+ return @imap_subscribe($this->mbox,$mailboxString);
+ }
+
+ return $result;
+ }
+
+ function imap_deletemailbox($_folderName)
+ {
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+
+ @imap_unsubscribe ($this->mbox, $mailboxString);
+
+ $this->reopen("INBOX");
+
+ $result = imap_deletemailbox($this->mbox, $mailboxString);
+
+ #print imap_last_error();
+
+ return $result;
+ }
+
+ function imapGetQuota($_username)
+ {
+ $quota_value = @imap_get_quota($this->mbox, "user.".$_username);
+
+ if(is_array($quota_value) && count($quota_value) > 0)
+ {
+ return array('limit' => $quota_value['limit']/1024);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function imap_get_quotaroot($_folderName)
+ {
+ return @imap_get_quotaroot($this->mbox, $_folderName);
+ }
+
+ function imap_renamemailbox($_oldMailboxName, $_newMailboxName)
+ {
+ if(strcasecmp("inbox",$_oldMailboxName) == 0 || strcasecmp("inbox",$_newMailboxName) == 0)
+ {
+ return False;
+ }
+
+ $oldMailboxName = ExecMethod('emailadmin.bo.getMailboxString',$_oldMailboxName,3,$this->profileID);
+
+ $newMailboxName = ExecMethod('emailadmin.bo.getMailboxString',$_newMailboxName,3,$this->profileID);
+
+ $this->reopen("INBOX");
+
+ $result = @imap_renamemailbox($this->mbox,$oldMailboxName, $newMailboxName);
+
+ #print imap_last_error();
+
+ return $result;
+ }
+
+ function imapSetQuota($_username, $_quotaLimit)
+ {
+ if(is_numeric($_quotaLimit) && $_quotaLimit >= 0)
+ {
+ // enable quota
+ $quota_value = @imap_set_quota($this->mbox, "user.".$_username, $_quotaLimit*1024);
+ }
+ else
+ {
+ // disable quota
+ $quota_value = @imap_set_quota($this->mbox, "user.".$_username, -1);
+ }
+ }
+
+ function isSentFolder($_folderName)
+ {
+ if($this->mailPreferences['sentFolder'] == $_folderName)
+ return TRUE;
+ else
+ return FALSE;
+ }
+
+ function moveMessages($_foldername, $_messageUID)
+ {
+ $caching =& CreateObject('felamimail.bocaching',
+ $this->mailPreferences['imapServerAddress'],
+ $this->mailPreferences['username'],
+ $this->sessionData['mailbox']);
+ $deleteOptions = $GLOBALS['egw_info']["user"]["preferences"]["felamimail"]["deleteOptions"];
+
+ reset($_messageUID);
+ while(list($key, $value) = each($_messageUID))
+ {
+ if(!empty($msglist)) $msglist .= ",";
+ $msglist .= $value;
+ }
+ #print $msglist."
";
+
+ #print "destination folder($_folderName): ".$this->encodeFolderName($_foldername)."
";
+
+ $this->reopen($this->sessionData['mailbox']);
+
+ if (imap_mail_move ($this->mbox, $msglist, $this->encodeFolderName($_foldername), CP_UID))
+ {
+ #print "allet ok
";
+ if($deleteOptions != "mark_as_deleted")
+ {
+ imap_expunge($this->mbox);
+ reset($_messageUID);
+ while(list($key, $value) = each($_messageUID))
+ {
+ $caching->removeFromCache($value);
+ }
+ }
+ }
+ else
+ {
+ error_log(__FILE__ .' '.__LINE__.': '.imap_last_error());
+ }
+
+ }
+
+ function openConnection($_folderName='', $_options=0, $_adminConnection=false)
+ {
+ if(!function_exists('imap_open'))
+ {
+ return lang('This PHP has no IMAP support compiled in!!');
+ }
+
+ if(!$this->mailPreferences['emailConfigValid'])
+ {
+ return lang('no valid emailprofile selected!!');
+ }
+
+ if($_folderName == '' && !$_adminConnection)
+ {
+ $_folderName = $this->sessionData['mailbox'];
+ }
+
+ if($_adminConnection)
+ {
+ $folderName = '';
+ $username = $this->mailPreferences['imapAdminUsername'];
+ $password = $this->mailPreferences['imapAdminPW'];
+ $options = '';
+ }
+ else
+ {
+ $folderName = $_folderName;
+ $username = $this->mailPreferences['username'];
+ $password = $this->mailPreferences['key'];
+ $options = $_options;
+ }
+
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_folderName,3,$this->profileID);
+ #print "
aa
bb
aa
bb
cc
$mailboxString, $username, $password
";
+ if(!$this->mbox = @imap_open ($mailboxString, $username, $password, $options))
+ {
+ return imap_last_error();
+ }
+ else
+ {
+ // get the quota for this mailboxbox
+ if (function_exists('imap_get_quotaroot') && !$_adminConnection)
+ {
+ $quota = @imap_get_quotaroot($this->mbox, $this->decodeFolderName($folderName));
+ if(is_array($quota['STORAGE']))
+ {
+ $storage = $this->storageQuota = $quota['STORAGE'];
+ }
+ }
+ #$_folderName = "user.lars.Asterisk";
+ #print "$_folderName
";
+ #imap_setacl($this->mbox, $_folderName, 'support', 'lrswipcda');
+ #print "";
+ #print_r(imap_getacl($this->mbox, $_folderName));
+ #print "
";
+ return True;
+ }
+
+ }
+
+ function parseMessage(&$_sections, $_structure, $_wantedPartID = '', $_currentPartID='')
+ {
+ #print "w: $_wantedPartID, c: $_currentPartID
";
+ #if($_currentPartID == '')
+ #{
+ # _debug_array($_structure);
+ # print "
";
+ #}
+ #_debug_array($_sections);
+ #if ($_currentPartID == '') _debug_array($_structure);
+ switch ($_structure->type)
+ {
+ case TYPETEXT:
+ if(!preg_match("/^$_wantedPartID/i",$_currentPartID))
+ {
+ break;
+ }
+ $mime_type = "text";
+ $data['encoding'] = $_structure->encoding;
+ $data['size'] = $_structure->bytes;
+ $data['partID'] = $_currentPartID;
+ $data["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $data["name"] = lang("unknown");
+ #for ($lcv = 0; $lcv < count($_structure->parameters); $lcv++)
+ foreach ((array)$_structure->parameters as $param)
+ {
+ #$param = $_structure->parameters[$lcv];
+ switch(strtolower($param->attribute))
+ {
+ case 'name':
+ $data["name"] = $param->value;
+ break;
+ case 'charset':
+ $data["charset"] = $param->value;
+ break;
+ }
+
+ }
+
+ // set this to zero, when we have a plaintext message
+ // if partID[0] is set, we have no attachments
+ if($_currentPartID == '') $_currentPartID = '0';
+
+ if (strtolower($_structure->disposition) == "attachment" ||
+ $data["name"] != lang("unknown"))
+ {
+ // treat it as attachment
+ // must be a attachment
+ $_sections[$_currentPartID] = $data;
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ }
+ else
+ {
+ #print "found a body part $_currentPartID
";
+ // must be a body part
+ $_sections["$_currentPartID"] = $data;
+ $_sections["$_currentPartID"]['name'] = lang('body part')." $_currentPartID";
+ $_sections[$_currentPartID]['type'] = 'body';
+ }
+ #print "
";
+ #_debug_array($retData);
+ #print "
";
+ break;
+
+ case TYPEMULTIPART:
+ #print "found multipart
";
+ $mimeType = 'multipart';
+ // lets cycle trough all parts
+ $_sections[$_currentPartID]['mimeType'] = $mimeType."/". strtolower($_structure->subtype);
+
+ if($_currentPartID != '') $_currentPartID .= '.';
+
+ #print $_sections[$_currentPartID]['mimeType']."
";
+ for($i = 0; $i < count($_structure->parts); $i++)
+ {
+ $structureData = array();
+ $this->parseMessage($_sections, $_structure->parts[$i], $_wantedPartID, $_currentPartID.($i+1));
+ }
+ break;
+
+ case TYPEMESSAGE:
+ #print "found message $_currentPartID
";
+ #_debug_array($_structure);
+ #print "
";
+ // handle it as attachment
+ #print "$_wantedPartID : $_currentPartID
";
+ if(($_wantedPartID < $_currentPartID) ||
+ empty($_wantedPartID))
+ {
+ #print "add as attachment
";
+ $mime_type = "message";
+ $_sections[$_currentPartID]['encoding'] = $_structure->encoding;
+ $_sections[$_currentPartID]['size'] = $_structure->bytes;
+ $_sections[$_currentPartID]['partID'] = $_currentPartID;
+ $_sections[$_currentPartID]["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $_sections[$_currentPartID]["name"] = lang("unknown");
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ if(!empty($_structure->description))
+ {
+ $_sections[$_currentPartID]["name"] = lang($_structure->description);
+ }
+
+ // has the structure dparameters ??
+ if($_structure->ifdparameters)
+ {
+ foreach($_structure->dparameters as $key => $value)
+ {
+ switch(strtolower($value->attribute))
+ {
+ case 'filename':
+ $_sections[$_currentPartID]["name"] = $value->value;
+ break;
+ }
+ }
+ }
+
+ // has the structure parameters ??
+ if($_structure->ifparameters)
+ {
+ foreach($_structure->parameters as $key => $value)
+ {
+ switch(strtolower($value->attribute))
+ {
+ case 'name':
+ $_sections[$_currentPartID]["name"] = $value->value;
+ break;
+ }
+ }
+ }
+
+
+ }
+ // recurse in it
+ else
+ {
+ #_debug_array($_structure);
+ for($i = 0; $i < count($_structure->parts); $i++)
+ {
+ # print "dive into Message
";
+ if($_structure->parts[$i]->type != TYPEMULTIPART)
+ $_currentPartID = $_currentPartID.'.'.($i+1);
+ $this->parseMessage($_sections, $_structure->parts[$i], $_wantedPartID, $_currentPartID);
+ # $this->parseMessage($_sections, $_structure->parts[0], $_wantedPartID, $_currentPartID);
+ # print "done diving
";
+ }
+ }
+ break;
+
+ case TYPEAPPLICATION:
+ if(!preg_match("/^$_wantedPartID/i",$_currentPartID))
+ {
+ break;
+ }
+ $mime_type = "application";
+ $_sections[$_currentPartID]['encoding'] = $_structure->encoding;
+ $_sections[$_currentPartID]['size'] = $_structure->bytes;
+ $_sections[$_currentPartID]['partID'] = $_currentPartID;
+ $_sections[$_currentPartID]["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $_sections[$_currentPartID]["name"] = lang("unknown");
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ for ($lcv = 0; $lcv < count($_structure->dparameters); $lcv++)
+ {
+ $param = $_structure->dparameters[$lcv];
+ switch(strtolower($param->attribute))
+ {
+ case 'filename':
+ $_sections[$_currentPartID]["name"] = $param->value;
+ break;
+ }
+ }
+
+ #for ($lcv = 0; $lcv < count($_structure->parameters); $lcv++)
+ #{
+ # $param = $_structure->parameters[$lcv];
+ foreach ((array)$_structure->parameters as $param)
+ {
+ switch(strtolower($param->attribute))
+ {
+ case 'name':
+ $_sections[$_currentPartID]["name"] = $param->value;
+ break;
+ }
+ }
+
+ break;
+
+ case TYPEAUDIO:
+ if(!preg_match("/^$_wantedPartID/i",$_currentPartID))
+ {
+ break;
+ }
+ $mime_type = "audio";
+ $_sections[$_currentPartID]['encoding'] = $_structure->encoding;
+ $_sections[$_currentPartID]['size'] = $_structure->bytes;
+ $_sections[$_currentPartID]['partID'] = $_currentPartID;
+ $_sections[$_currentPartID]["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $_sections[$_currentPartID]["name"] = lang("unknown");
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ #for ($lcv = 0; $lcv < count($_structure->dparameters); $lcv++)
+ #{
+ # $param = $_structure->dparameters[$lcv];
+ foreach ((array)$_structure->dparameters as $param)
+ {
+ switch(strtolower($param->attribute))
+ {
+ case 'filename':
+ $_sections[$_currentPartID]["name"] = $param->value;
+ break;
+ }
+ }
+ break;
+
+ case TYPEIMAGE:
+ if(!preg_match("/^$_wantedPartID/i",$_currentPartID))
+ {
+ break;
+ }
+ #print "found image $_currentPartID
";
+ $mime_type = "image";
+ $_sections[$_currentPartID]['encoding'] = $_structure->encoding;
+ $_sections[$_currentPartID]['size'] = $_structure->bytes;
+ $_sections[$_currentPartID]['partID'] = $_currentPartID;
+ $_sections[$_currentPartID]["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $_sections[$_currentPartID]["name"] = lang("unknown");
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ for ($lcv = 0; $lcv < count($_structure->dparameters); $lcv++)
+ {
+ $param = $_structure->dparameters[$lcv];
+ switch(strtolower($param->attribute))
+ {
+ case 'filename':
+ $_sections[$_currentPartID]["name"] = $param->value;
+ break;
+ }
+ }
+ break;
+
+ case TYPEVIDEO:
+ if(!preg_match("/^$_wantedPartID/i",$_currentPartID))
+ {
+ break;
+ }
+ $mime_type = "video";
+ $_sections[$_currentPartID]['encoding'] = $_structure->encoding;
+ $_sections[$_currentPartID]['size'] = $_structure->bytes;
+ $_sections[$_currentPartID]['partID'] = $_currentPartID;
+ $_sections[$_currentPartID]["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $_sections[$_currentPartID]["name"] = lang("unknown");
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ for ($lcv = 0; $lcv < count($_structure->dparameters); $lcv++)
+ {
+ $param = $_structure->dparameters[$lcv];
+ switch(strtolower($param->attribute))
+ {
+ case 'filename':
+ $_sections[$_currentPartID]["name"] = $param->value;
+ break;
+ }
+ }
+ break;
+
+ case TYPEMODEL:
+ if(!preg_match("/^$_wantedPartID/i",$_currentPartID))
+ {
+ break;
+ }
+ $mime_type = "model";
+ $_sections[$_currentPartID]['encoding'] = $_structure->encoding;
+ $_sections[$_currentPartID]['size'] = $_structure->bytes;
+ $_sections[$_currentPartID]['partID'] = $_currentPartID;
+ $_sections[$_currentPartID]["mimeType"] = $mime_type."/". strtolower($_structure->subtype);
+ $_sections[$_currentPartID]["name"] = lang("unknown");
+ $_sections[$_currentPartID]['type'] = 'attachment';
+ for ($lcv = 0; $lcv < count($_structure->dparameters); $lcv++)
+ {
+ $param = $_structure->dparameters[$lcv];
+ switch(strtolower($param->attribute))
+ {
+ case 'filename':
+ $_sections[$_currentPartID]["name"] = $param->value;
+ break;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ #if ($_currentPartID == '') _debug_array($_sections);
+
+ #print "$_wantedPartID, $_currentPartID
";
+ #if($_currentPartID >= $_wantedPartID)
+ #{
+ # print "will add
";
+ # return $retData;
+ #}
+
+ }
+
+ function reopen($_foldername)
+ {
+ // (regis) seems to be necessary/usefull to reopen in the good folder
+ //echo "
reopening imap mailbox in:".$_foldername;
+ $mailboxString = ExecMethod('emailadmin.bo.getMailboxString',$_foldername,3,$this->bofelamimail->profileID);
+ imap_reopen ($this->mbox, $mailboxString);
+ }
+
+ function restoreSessionData()
+ {
+ $this->sessionData = $GLOBALS['egw']->session->appsession('session_data');
+ }
+
+ function saveFilter($_formData)
+ {
+ if(!empty($_formData['from']))
+ $data['from'] = $_formData['from'];
+ if(!empty($_formData['to']))
+ $data['to'] = $_formData['to'];
+ if(!empty($_formData['subject']))
+ $data['subject']= $_formData['subject'];
+ if($_formData['filterActive'] == "true")
+ {
+ $data['filterActive']= "true";
+ }
+
+ $this->sessionData['filter'] = $data;
+ $this->saveSessionData();
+ }
+
+ function saveSessionData()
+ {
+ $GLOBALS['egw']->session->appsession('session_data','',$this->sessionData);
+ }
+
+ function setEMailProfile($_profileID)
+ {
+ $config =& CreateObject('phpgwapi.config','felamimail');
+ $config->read_repository();
+ $config->value('profileID',$_profileID);
+ $config->save_repository();
+ }
+
+ function subscribe($_folderName, $_status)
+ {
+ #$this->mailPreferences['imapServerAddress']
+ #$this->mailPreferences['imapPort'],
+
+ $folderName = $this->encodeFolderName($_folderName);
+ $folderName = "{".$this->mailPreferences['imapServerAddress'].":".$this->mailPreferences['imapPort']."}".$folderName;
+
+ if($_status == 'unsubscribe')
+ {
+ return imap_unsubscribe($this->mbox,$folderName);
+ }
+ else
+ {
+ return imap_subscribe($this->mbox,$folderName);
+ }
+ }
+
+ function toggleFilter()
+ {
+ if($this->sessionData['filter']['filterActive'] == 'true')
+ {
+ $this->sessionData['filter']['filterActive'] = 'false';
+ }
+ else
+ {
+ $this->sessionData['filter']['filterActive'] = 'true';
+ }
+ $this->saveSessionData();
+ }
+
+ function updateAccount($_hookValues)
+ {
+ ExecMethod('emailadmin.bo.updateAccount',$_hookValues);
+ }
+
+ function updateSingleACL($_folderName, $_accountName, $_aclType, $_aclStatus)
+ {
+ $folderACL = $this->getIMAPACL($_folderName);
+ $userACL = $folderACL[$_accountName];
+
+ if($_aclStatus == 'true')
+ {
+ if(strpos($userACL, $_aclType) === false)
+ {
+ $userACL .= $_aclType;
+ imap_setacl ($this->mbox, $_folderName, $_accountName, $userACL);
+ }
+ }
+ elseif($_aclStatus == 'false')
+ {
+ if(strpos($userACL, $_aclType) !== false)
+ {
+ $userACL = str_replace($_aclType,'',$userACL);
+ imap_setacl ($this->mbox, $_folderName, $_accountName, $userACL);
+ }
+ }
+
+ return $userACL;
+ }
+
+ /* inspired by http://de2.php.net/wordwrap
+ desolate19 at hotmail dot com */
+ function wordwrap($str, $cols, $cut)
+ {
+/*
+ // todo
+ // think about multibyte charsets
+ // think about links in html mode
+ $len = strlen($str);
+ $tag = 0;
+ $lineLenght = 0;
+
+ for ($i = 0; $i < $len; $i++)
+ {
+ $lineLenght++;
+ $chr = substr($str,$i,1);
+ if(ctype_cntrl($chr))
+ {
+ if(ord($chr) == 10)
+ $lineLenght = 0;
+ }
+ if ($chr == '<') {
+ $tag++;
+ } elseif ($chr == '>') {
+ $tag--;
+ } elseif ((!$tag) && (ctype_space($chr))) {
+ $wordlen = 0;
+ } elseif (!$tag) {
+ $wordlen++;
+ }
+
+ if ((!$tag) && (!$wordlen) && $lineLenght > $cols) {
+ //if ((!$tag) && ($wordlen) && (!($wordlen % $cols))) {
+ #print "add cut
";
+ $chr .= $cut;
+ $lineLenght = 0;
+ }
+ $result .= $chr;
+ }
+ return $result;
+*/
+ $lines = explode('\n', $str);
+ $newStr = '';
+ foreach($lines as $line)
+ {
+ // replace tabs by 8 space chars, or any tab only counts one char
+ $line = str_replace("\t"," ",$line);
+ $newStr .= wordwrap($line, $cols, $cut);
+ }
+ return $newStr;
+ }
+
+ }
+?>