/** * Searches IMAP (and POP3?) accounts/folders for emails with qualifying criteria */ function search($ieId, $subject = '', $from = '', $to = '', $body = '', $dateFrom = '', $dateTo = '') { global $current_user; global $app_strings; global $timedate; $beans = array(); $bean = new InboundEmail(); $bean->retrieve($ieId); $beans[] = $bean; //$beans = $this->retrieveAllByGroupId($current_user->id, true); $subject = urldecode($subject); $criteria = ""; $criteria .= !empty($subject) ? 'SUBJECT ' . from_html($subject) . '' : ""; $criteria .= !empty($from) ? ' FROM "' . $from . '"' : ""; $criteria .= !empty($to) ? ' FROM "' . $to . '"' : ""; $criteria .= !empty($body) ? ' TEXT "' . $body . '"' : ""; $criteria .= !empty($dateFrom) ? ' SINCE "' . $timedate->fromString($dateFrom)->format('d-M-Y') . '"' : ""; $criteria .= !empty($dateTo) ? ' BEFORE "' . $timedate->fromString($dateTo)->format('d-M-Y') . '"' : ""; //$criteria .= (!empty($from)) ? ' FROM "'.$from.'"' : ""; $showFolders = unserialize(base64_decode($current_user->getPreference('showFolders', 'Emails'))); $out = array(); foreach ($beans as $bean) { if (!in_array($bean->id, $showFolders)) { continue; } $GLOBALS['log']->info("*** INBOUNDEMAIL: searching [ {$bean->name} ] for [ {$subject}{$from}{$to}{$body}{$dateFrom}{$dateTo} ]"); $group = !$bean->is_personal ? 'group.' : ''; $bean->connectMailServer(); $mailboxes = $bean->getMailboxes(true); if (!in_array('INBOX', $mailboxes)) { $mailboxes[] = 'INBOX'; } $totalHits = 0; foreach ($mailboxes as $mbox) { $bean->mailbox = $mbox; $searchOverviews = array(); if ($bean->protocol == 'pop3') { $pop3Criteria = "SELECT * FROM email_cache WHERE ie_id = '{$bean->id}' AND mbox = '{$mbox}'"; $pop3Criteria .= !empty($subject) ? ' AND subject like "%' . $bean->db->quote($subject) . '%"' : ""; $pop3Criteria .= !empty($from) ? ' AND fromaddr like "%' . $from . '%"' : ""; $pop3Criteria .= !empty($to) ? ' AND toaddr like "%' . $to . '%"' : ""; $pop3Criteria .= !empty($dateFrom) ? ' AND senddate > "' . $dateFrom . '"' : ""; $pop3Criteria .= !empty($dateTo) ? ' AND senddate < "' . $dateTo . '"' : ""; $GLOBALS['log']->info("*** INBOUNDEMAIL: searching [ {$mbox} ] using criteria [ {$pop3Criteria} ]"); $r = $bean->db->query($pop3Criteria); while ($a = $bean->db->fetchByAssoc($r)) { $overview = new Overview(); foreach ($a as $k => $v) { $k = strtolower($k); switch ($k) { case "imap_uid": $overview->imap_uid = $v; $overview->uid = $a['message_id']; break; case "toaddr": $overview->to = from_html($v); break; case "fromaddr": $overview->from = from_html($v); break; case "mailsize": $overview->size = $v; break; case "senddate": $overview->date = $timedate->fromString($v)->format('r'); break; default: $overview->{$k} = from_html($v); break; } // sqitch } // foreach $searchOverviews[] = $overview; } // while } else { $bean->connectMailServer(); $searchResult = imap_search($bean->conn, $criteria, SE_UID); if (!empty($searchResult)) { $searchOverviews = imap_fetch_overview($bean->conn, implode(',', $searchResult), FT_UID); } // if } // else $numHits = count($searchOverviews); if ($numHits > 0) { $totalHits = $totalHits + $numHits; $ret = $bean->sortFetchedOverview($searchOverviews, 'date', 'desc', true); $mbox = "{$bean->id}.SEARCH"; $out = array_merge($out, $bean->displayFetchedSortedListXML($ret, $mbox, false)); } } } $metadata = array(); $metadata['mbox'] = $app_strings['LBL_EMAIL_SEARCH_RESULTS_TITLE']; $metadata['ieId'] = $this->id; $metadata['name'] = $this->name; $metadata['unreadChecked'] = $current_user->getPreference('showUnreadOnly', 'Emails') == 1 ? 'CHECKED' : ''; $metadata['out'] = $out; return $metadata; }
public function testsortFetchedOverview() { $inboundEmail = new InboundEmail(); $inboundEmail->id = 1; $inboundEmail->mailbox = 'INBOX'; $overview1 = new Overview(); $overview1->subject = 'subject 1'; $overview1->from = 'from 1'; $overview1->flagged = '1'; $overview1->answered = '1'; $overview1->date = '2016-01-01'; $overview2 = new Overview(); $overview2->subject = 'subject 2'; $overview2->from = 'from 2'; $overview2->flagged = '2'; $overview2->answered = '2'; $overview2->date = '2016-01-02'; $arr = array(); $arr[] = $overview1; $arr[] = $overview2; //execute the method to sort the objects array descending and verify the order $result = $inboundEmail->sortFetchedOverview($arr, 3, 'DESC'); $this->assertEquals('subject 2', $result['retArr'][0]->subject); //execute the method to sort the objects array ascending and verify the order $result = $inboundEmail->sortFetchedOverview($arr, 3, 'ASC'); $this->assertEquals('subject 1', $result['retArr'][0]->subject); }