3131namespace OCA \Mail ;
3232
3333use Horde_Imap_Client ;
34+ use Horde_Imap_Client_Exception ;
35+ use Horde_Imap_Client_Fetch_Query ;
3436use Horde_Imap_Client_Ids ;
3537use Horde_Imap_Client_Mailbox ;
3638use Horde_Imap_Client_Search_Query ;
@@ -88,7 +90,7 @@ public function __construct($conn, $mailBox, $attributes, $delimiter='/') {
8890 $ this ->makeDisplayName ();
8991 }
9092
91- public function getMessages ($ from = 0 , $ count = 2 , $ filter = '' ) {
93+ private function getSearchIds ($ from , $ count , $ filter ) {
9294 if ($ filter instanceof Horde_Imap_Client_Search_Query) {
9395 $ query = $ filter ;
9496 } else {
@@ -105,11 +107,39 @@ public function getMessages($from = 0, $count = 2, $filter = '') {
105107 if ($ from >= 0 && $ count >= 0 ) {
106108 $ ids = array_slice ($ ids , $ from , $ count );
107109 }
108- $ ids = new \Horde_Imap_Client_Ids ($ ids , false );
110+ return new \Horde_Imap_Client_Ids ($ ids , false );
111+ }
112+
113+ private function getFetchIds ($ from , $ count ) {
114+ $ q = new Horde_Imap_Client_Fetch_Query ();
115+ $ q ->uid ();
116+ $ q ->imapDate ();
117+
118+ $ result = $ this ->conn ->fetch ($ this ->mailBox , $ q );
119+ $ uidMap = [];
120+ foreach ($ result as $ r ) {
121+ $ uidMap [$ r ->getUid ()] = $ r ->getImapDate ()->getTimeStamp ();
122+ }
123+ // sort by time
124+ uasort ($ uidMap , function ($ a , $ b ) {
125+ return $ a < $ b ;
126+ });
127+ if ($ from >= 0 && $ count >= 0 ) {
128+ $ uidMap = array_slice ($ uidMap , $ from , $ count , true );
129+ }
130+ return new \Horde_Imap_Client_Ids (array_keys ($ uidMap ), false );
131+ }
132+
133+ public function getMessages ($ from = 0 , $ count = 2 , $ filter = '' ) {
134+ if (!$ this ->conn ->capability ->query ('SORT ' ) && (is_null ($ filter ) || $ filter === '' )) {
135+ $ ids = $ this ->getFetchIds ($ from , $ count );
136+ } else {
137+ $ ids = $ this ->getSearchIds ($ from , $ count , $ filter );
138+ }
109139
110140 $ headers = [];
111141
112- $ fetch_query = new \ Horde_Imap_Client_Fetch_Query ();
142+ $ fetch_query = new Horde_Imap_Client_Fetch_Query ();
113143 $ fetch_query ->envelope ();
114144 $ fetch_query ->flags ();
115145 $ fetch_query ->size ();
@@ -266,7 +296,7 @@ public function getListArray($accountId, $status = null) {
266296 'uidnext ' => $ status ['uidnext ' ],
267297 'delimiter ' => $ this ->delimiter
268298 ];
269- } catch (\ Horde_Imap_Client_Exception $ e ) {
299+ } catch (Horde_Imap_Client_Exception $ e ) {
270300 return [
271301 'id ' => base64_encode ($ this ->getFolderId ()),
272302 'parent ' => null ,
0 commit comments