diff --git a/emailadmin/inc/class.emailadmin_imapbase.inc.php b/emailadmin/inc/class.emailadmin_imapbase.inc.php index 48c245db00..ccf48aee99 100644 --- a/emailadmin/inc/class.emailadmin_imapbase.inc.php +++ b/emailadmin/inc/class.emailadmin_imapbase.inc.php @@ -842,7 +842,7 @@ class emailadmin_imapbase $mailbox=null; try { - if($this->folderExists($this->sessionData['mailbox'])) $mailbox = $this->sessionData['mailbox']; + if(isset($this->sessionData['mailbox'])&&$this->folderExists($this->sessionData['mailbox'])) $mailbox = $this->sessionData['mailbox']; if (empty($mailbox)) $mailbox = $this->icServer->getCurrentMailbox(); /* if (isset(emailadmin_imap::$supports_keywords[$_icServerID])) @@ -1109,12 +1109,7 @@ class emailadmin_imapbase } static $folderInfoCache; // reduce traffic on single request static $folderBasicInfo; - if (is_null($folderBasicInfo) || !isset($folderBasicInfo[$this->profileID])) - { - $folderBasicInfo = egw_cache::getCache(egw_cache::INSTANCE,'email','folderBasicInfo'.trim($GLOBALS['egw_info']['user']['account_id']),null,array(),$expiration=60*60*1); - $folderInfoCache = $folderBasicInfo[$this->profileID]; - } - else + if (isset($folderBasicInfo[$this->profileID])) { $folderInfoCache = $folderBasicInfo[$this->profileID]; } @@ -1159,7 +1154,7 @@ class emailadmin_imapbase // no folder info, but there is a status returned for the folder: something is wrong, try to cope with it $folderInfo = is_array($folderInfo)?$folderInfo:array('HIERACHY_DELIMITER'=>$this->getHierarchyDelimiter(), 'ATTRIBUTES' => ''); - if (empty($folderInfo['HIERACHY_DELIMITER']) || (isset($folderInfo['delimiter']) && empty($folderInfo['delimiter']))) + if (!isset($folderInfo['HIERACHY_DELIMITER']) || empty($folderInfo['HIERACHY_DELIMITER']) || (isset($folderInfo['delimiter']) && empty($folderInfo['delimiter']))) { //error_log(__METHOD__.' ('.__LINE__.') '.array2string($folderInfo)); $folderInfo['HIERACHY_DELIMITER'] = $this->getHierarchyDelimiter(); @@ -1169,8 +1164,8 @@ class emailadmin_imapbase #if(!is_array($folderInfo)) { # return false; #} - $retValue['delimiter'] = ($folderInfo['HIERACHY_DELIMITER']?$folderInfo['HIERACHY_DELIMITER']:$folderInfo['delimiter']); - $retValue['attributes'] = ($folderInfo['ATTRIBUTES']?$folderInfo['ATTRIBUTES']:$folderInfo['attributes']); + $retValue['delimiter'] = (isset($folderInfo['HIERACHY_DELIMITER']) && $folderInfo['HIERACHY_DELIMITER']?$folderInfo['HIERACHY_DELIMITER']:$folderInfo['delimiter']); + $retValue['attributes'] = (isset($folderInfo['ATTRIBUTES']) && $folderInfo['ATTRIBUTES']?$folderInfo['ATTRIBUTES']:$folderInfo['attributes']); $shortNameParts = explode($retValue['delimiter'], $_folderName); $retValue['shortName'] = array_pop($shortNameParts); $retValue['displayName'] = $_folderName; @@ -1185,7 +1180,6 @@ class emailadmin_imapbase $retValue['displayName'] = $retValue['shortDisplayName'] = lang($retValue['shortName']); } if ($folderInfo) $folderBasicInfo[$this->profileID][$_folderName]=$retValue; - egw_cache::setCache(egw_cache::INSTANCE,'email','folderBasicInfo'.trim($GLOBALS['egw_info']['user']['account_id']),$folderBasicInfo,$expiration=60*60*1); //error_log(__METHOD__.' ('.__LINE__.') '.' '.$_folderName.array2string($retValue['attributes'])); if ($basicInfoOnly || (isset($retValue['attributes']) && stripos(array2string($retValue['attributes']),'noselect')!==false)) { @@ -1195,10 +1189,6 @@ class emailadmin_imapbase // cache it for a minute 60*60*1 // this should reduce communication to the imap server static $subscribedFolders; - if ($fetchSubscribedInfo && is_null($subscribedFolders)||empty($subscribedFolders[$this->profileID])) - { - $subscribedFolders = egw_cache::getCache(egw_cache::INSTANCE,'email','subscribedFolders'.trim($GLOBALS['egw_info']['user']['account_id']),null,array(),$expiration=60*60*1); - } static $nameSpace; static $prefix; if (is_null($nameSpace) || empty($nameSpace[$this->profileID])) $nameSpace[$this->profileID] = $this->_getNameSpaces(); @@ -1216,7 +1206,6 @@ class emailadmin_imapbase if ($fetchSubscribedInfo && is_null($subscribedFolders) || empty($subscribedFolders[$this->profileID])) { $subscribedFolders[$this->profileID] = $this->icServer->listSubscribedMailboxes(); - egw_cache::setCache(egw_cache::INSTANCE,'email','subscribedFolders'.trim($GLOBALS['egw_info']['user']['account_id']),$subscribedFolders,$expiration=60*60*1); } if($fetchSubscribedInfo && is_array($subscribedFolders[$this->profileID]) && in_array($_folderName,$subscribedFolders[$this->profileID])) { @@ -1289,6 +1278,7 @@ class emailadmin_imapbase $rByUid = true; // try searching by uid. this var will be passed by reference to getSortedList, and may be set to false, if UID retrieval fails #print "
"; #$this->icServer->setDebug(true); + $total=0; if ($_thisUIDOnly === null) { if (($_startMessage || $_numberOfMessages) && !isset($_filter['range'])) @@ -1388,7 +1378,7 @@ class emailadmin_imapbase 'X-PRIORITY' ),array( // Cache headers, we'll look at them below - 'cache' => true, + 'cache' => true,//$_cacheResult, // Set peek so messages are not flagged as read 'peek' => true )); @@ -1459,11 +1449,12 @@ class emailadmin_imapbase $headerObject['SUBJECT'] = (is_array($headerForPrio['SUBJECT'])?$headerForPrio['SUBJECT'][0]:$headerForPrio['SUBJECT']); $headerObject['FROM'] = (array)($headerForPrio['FROM']?$headerForPrio['FROM']:($headerForPrio['REPLY-TO']?$headerForPrio['REPLY-TO']:$headerForPrio['RETURN-PATH'])); $headerObject['TO'] = (array)$headerForPrio['TO']; - $headerObject['CC'] = (array)$headerForPrio['CC']; - $headerObject['PRIORITY'] = $headerForPrio['X-PRIORITY']; + $headerObject['CC'] = isset($headerForPrio['CC'])?(array)$headerForPrio['CC']:array(); + $headerObject['PRIORITY'] = isset($headerForPrio['X-PRIORITY'])?$headerForPrio['X-PRIORITY']:null; foreach (array('FROM','TO','CC') as $_k => $key) { $address = array(); + $remember=null; foreach ($headerObject[$key] as $k => $ad) { if (stripos($ad,'@')===false) @@ -1601,7 +1592,7 @@ class emailadmin_imapbase } } } - if(is_array($headerObject['CC']) && $headerObject['CC'][0]) { + if(is_array($headerObject['CC']) && count($headerObject['CC'])>0) { $ki=0; foreach($headerObject['CC'] as $k => $add) { @@ -2652,11 +2643,44 @@ class emailadmin_imapbase { // Get top mailboxes of icServer $topFolders = $this->icServer->getMailboxes("", 2, true); + // Trigger examination of namespace to retrieve + // folders located in other and shared; needed only for some servers + if (is_null(self::$mailConfig)) self::$mailConfig = config::read('mail'); + if (self::$mailConfig['examineNamespace']) + { + $nameSpace = $this->_getNameSpaces(); + //error_log(__METHOD__.__LINE__.array2string($nameSpace)); + $prefixes=array(); + if (is_array($nameSpace)) + { + foreach($nameSpace as $k => $singleNameSpace) { + $type = $singleNameSpace['type']; + // the following line (assumption that for the same namespace the delimiter should be equal) may be wrong + $foldersNameSpace[$type]['delimiter'] = $singleNameSpace['delimiter']; + if(is_array($singleNameSpace) && $singleNameSpace['prefix']){ + $prefixes[$type] = $singleNameSpace['prefix']; + $result = $this->icServer->getMailboxes($singleNameSpace['prefix'], 2, true); + if (is_array($result)) + { + ksort($result); + $topFolders = array_merge($topFolders,$result); + } + } + } + } + } foreach ($topFolders as &$node) { + //error_log(__METHOD__.__LINE__.array2string($node)); $pattern = "/\\".$delimiter."/"; $reference = preg_replace($pattern, '', $node['MAILBOX']); + if(!empty($prefixes)) + { + $reference = ''; + $tmpArray = explode($delimiter,$node['MAILBOX']); + foreach($tmpArray as $p) $reference = empty($reference)?$p:$reference.$delimiter.$p; + } $mainFolder = $subFolders = array(); // Get special use folders @@ -2676,6 +2700,8 @@ class emailadmin_imapbase $mainFolder = $this->icServer->getMailboxes($reference, 1, true); $subFolders = $this->icServer->getMailboxes($node['MAILBOX'].$node['delimiter'], $_search, true); } + //error_log(__METHOD__.__LINE__.$reference.'.'.array2string($mainFolder)); + //error_log(__METHOD__.__LINE__.$node['MAILBOX'].$node['delimiter'].'.'.array2string($subFolders)); if (is_array($mainFolder['INBOX'])) { // Array container of auto folders @@ -2746,6 +2772,7 @@ class emailadmin_imapbase } // Get counter information and add them to each fetched folders array + // TODO: do not fetch counters for user .... as in shared / others if ($_getCounter) { foreach ($folders as &$folder) @@ -4232,7 +4259,7 @@ class emailadmin_imapbase if (empty($_folder)) { - $_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox()); + $_folder = (isset($this->sessionData['mailbox'])&&$this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox()); } //error_log(__METHOD__.' ('.__LINE__.') '.array2string($_folder).'/'.$this->icServer->getCurrentMailbox().'/'. $this->sessionData['mailbox']); // querying contents of body part @@ -4491,6 +4518,7 @@ class emailadmin_imapbase */ static function &getdisplayableBody(&$mailClass, $bodyParts, $preserveHTML = false) { + $message=''; for($i=0; $isessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox()); - + $attachments = array(); if (!isset($_structure)) { $_structure = $this->getStructure($_uid, $_partID,$_folder,true); @@ -5099,6 +5127,7 @@ class emailadmin_imapbase if (!empty($_partID)) $_structure = $_structure->getPart($_partID); $skipParts = array(); $tnefParts = array(); + $skip = 0; foreach($_structure->contentTypeMap() as $mime_id => $mime_type) { $part = $_structure->getPart($mime_id); @@ -5289,7 +5318,7 @@ class emailadmin_imapbase */ function getAttachment($_uid, $_partID, $_winmail_nr=0, $_returnPart=true, $_stream=false, $_folder=null) { - //error_log(__METHOD__.__LINE__."Uid:$_uid, PartId:$_partID, WinMailNr:$_winmail_nr, ReturnPart:$_returnPart, Stream:$_stream"); + error_log(__METHOD__.__LINE__."Uid:$_uid, PartId:$_partID, WinMailNr:$_winmail_nr, ReturnPart:$_returnPart, Stream:$_stream, Folder:$_folder".function_backtrace()); if (!isset($_folder)) $_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox()); $uidsToFetch = new Horde_Imap_Client_Ids(); @@ -5320,7 +5349,7 @@ class emailadmin_imapbase if (empty($partDisposition)) $partDisposition='attachment'; if ($part && ($partDisposition=='attachment' || $partDisposition=='inline' || ($part->getPrimaryType() == 'text' && $part->getSubType() == 'calendar'))) { - $headerObject['ATTACHMENTS'][$mime_id]=$part->getAllDispositionParameters(); + //$headerObject=$part->getAllDispositionParameters();//not used anywhere around here $structure_bytes = $part->getBytes(); $structure_mime=$part->getType(); diff --git a/mail/lang/egw_de.lang b/mail/lang/egw_de.lang index 6671d08e69..3642836313 100644 --- a/mail/lang/egw_de.lang +++ b/mail/lang/egw_de.lang @@ -163,6 +163,7 @@ error:could not save the acl! because some names are empty! mail de Fehler: Zugr esync will fail without a working email configuration! mail de eSync steht Ihnen nicht zur Verfügung, weil kein gültiges Mailkonto eingestellt wurde! event details follow mail de Details zum Termin folgen everyone mail de Alle Anwender +examine namespace to retrieve folders in others and shared mail de Untersuche Namespace für Mail-Ordner in den Bereichen OTHERS and SHARED extended mail de Erweitert extra sent folders mail de Anzeigeschema Gesendet Ordner failed to delete %1 mail de Löschen von %1 fehlgeschlagen @@ -310,6 +311,7 @@ notify when new mails arrive in these folders mail de Benachrichtigung, sobald n on mail de am one address is not valid mail de Eine Adresse ist ungültig only makes sense, if you transport password through a different channel / outside of this mail to recipients! mail de Macht nur dann Sinn, wenn das Passwort auf einem andren Weg, außerhalb dieser Mail, den Empfängern mitgeteilt wird! +only needed for some servers, that do not return all folders on root level queries to retrieve all folders for that level mail de wird nur für bestimmte Server gebraucht, die NICHT alle Ordner für Root-Knoten-Abfragen zurückgeben (damit wird in diesem Fall explizit auf Ordner in den Prefixes der Namespaces geprüft) only one window mail de nur ein einziges Fenster only send message, do not copy a version of the message to the configured sent folder mail de Versende Nachricht, kopiere sie nicht in den konfigurierten Gesendet Ordner open in html mode mail de In HTML Modus öffnen diff --git a/mail/lang/egw_en.lang b/mail/lang/egw_en.lang index 234f24f96e..5bc69a4c5c 100644 --- a/mail/lang/egw_en.lang +++ b/mail/lang/egw_en.lang @@ -163,6 +163,7 @@ error:could not save the acl! because some names are empty! mail en Error:Could esync will fail without a working email configuration! mail en eSync will FAIL without a working eMail configuration! event details follow mail en Event Details follow everyone mail en Everyone +examine namespace to retrieve folders in others and shared mail en Examine Namespace to retrieve Folders in OTHERS and SHARED extended mail en Extended extra sent folders mail en Extra sent folders failed to delete %1 mail en Failed to delete %1 @@ -310,6 +311,7 @@ notify when new mails arrive in these folders mail en notify when new mails arri on mail en on one address is not valid mail en One address is not valid only makes sense, if you transport password through a different channel / outside of this mail to recipients! mail en Only makes sense, if you transport password through a different channel / outside of this mail to recipients! +only needed for some servers, that do not return all folders on root level queries to retrieve all folders for that level mail en only needed for some servers, that do not return all folders on root level queries to retrieve all folders for that level only one window mail en only one window only send message, do not copy a version of the message to the configured sent folder mail en only send message, do not copy a version of the message to the configured sent folder open in html mode mail en Open in HTML mode diff --git a/mail/templates/default/config.tpl b/mail/templates/default/config.tpl index 69e256b072..51bfeef039 100755 --- a/mail/templates/default/config.tpl +++ b/mail/templates/default/config.tpl @@ -13,6 +13,17 @@ + {lang_Deny_certain_groups_access_to_following_features} + {lang_examine_namespace_to_retrieve_folders_in_others_and_shared} +
+ {lang_only_needed_for_some_servers,_that_do_not_return_all_folders_on_root_level_queries_to_retrieve_all_folders_for_that_level} ++ + +{lang_Create_new_account}