/** * Searches for the emails on the server * * @param ContentParameter $cpo * @param string $prefix If used with the combined backend here will come the backend id and delimiter * * @return array */ public function GetMailboxSearchResults($cpo, $prefix = '') { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults()")); $items = false; $searchFolderId = $cpo->GetSearchFolderid(); $searchRange = explode('-', $cpo->GetSearchRange()); $filter = $this->getSearchRestriction($cpo); // Open the folder to search $search = true; if (empty($searchFolderId)) { $searchFolderId = $this->getFolderIdFromImapId('INBOX'); } // Convert searchFolderId to IMAP id $imapId = $this->getImapIdFromFolderId($searchFolderId); $listMessages = array(); $numMessages = 0; ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: Filter <%s>", $filter)); if ($cpo->GetSearchDeepTraversal()) { // Recursive search ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: Recursive search %s", $imapId)); $listFolders = @imap_list($this->mbox, $this->server, "*"); if ($listFolders === false) { ZLog::Write(LOGLEVEL_WARN, sprintf("BackendIMAP->GetMailboxSearchResults: Error recursive list %s", imap_last_error())); } else { foreach ($listFolders as $subFolder) { if (@imap_reopen($this->mbox, $subFolder)) { $imapSubFolder = str_replace($this->server, "", $subFolder); $subFolderId = $this->getFolderIdFromImapId($imapSubFolder); if ($subFolderId !== false) { // only search found folders $subList = @imap_search($this->mbox, $filter, SE_UID, "UTF-8"); if ($subList !== false) { $numMessages += count($subList); ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: SubSearch in %s : %s ocurrences", $imapSubFolder, count($subList))); $listMessages[] = array($subFolderId => $subList); } } } } } } else { // Search in folder if (@imap_reopen($this->mbox, $this->server . $imapId)) { $subList = @imap_search($this->mbox, $filter, SE_UID, "UTF-8"); if ($subList !== false) { $numMessages += count($subList); ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: Search in %s : %s ocurrences", $imapId, count($subList))); $listMessages[] = array($searchFolderId => $subList); } } } if ($numMessages > 0) { // range for the search results $rangestart = 0; $rangeend = SEARCH_MAXRESULTS - 1; if (is_array($searchRange) && isset($searchRange[0]) && isset($searchRange[1])) { $rangestart = $searchRange[0]; $rangeend = $searchRange[1]; } $querycnt = $numMessages; $items = array(); $querylimit = $rangeend + 1 < $querycnt ? $rangeend + 1 : $querycnt + 1; $items['range'] = $rangestart . '-' . ($querylimit - 1); $items['searchtotal'] = $querycnt; ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: %s entries found, returning %s", $items['searchtotal'], $items['range'])); $p = 0; $pc = 0; for ($i = $rangestart, $j = 0; $i <= $rangeend && $i < $querycnt; $i++, $j++) { $keys = array_keys($listMessages[$p]); $cntFolder = count($listMessages[$p][$keys[0]]); if ($pc >= $cntFolder) { $p++; $pc = 0; $keys = array_keys($listMessages[$p]); } ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: %s %s %s %s", $p, $pc, $keys[0], $listMessages[$p][$keys[0]][$pc])); $foundFolderId = $keys[0]; $items[$j]['class'] = 'Email'; $items[$j]['longid'] = $prefix . $foundFolderId . ":" . $listMessages[$p][$foundFolderId][$pc]; $items[$j]['folderid'] = $prefix . $foundFolderId; $pc++; } } else { ZLog::Write(LOGLEVEL_DEBUG, sprintf("BackendIMAP->GetMailboxSearchResults: No messages found!")); } return $items; }
/** * Searches for the emails on the server * * @param ContentParameter $cpo * * @return array */ public function GetMailboxSearchResults($cpo) { ZLog::Write(LOGLEVEL_DEBUG, "Combined->GetMailboxSearchResults()"); $i = $this->getSearchBackend(ISearchProvider::SEARCH_MAILBOX); $result = false; if ($i !== false) { //Convert $cpo GetSearchFolderid $cpo->SetSearchFolderid($this->GetBackendFolder($cpo->GetSearchFolderid())); $result = $this->backends[$i]->GetMailboxSearchResults($cpo, $i . $this->config['delimiter']); } return $result; }