31
31
namespace OCA \Mail ;
32
32
33
33
use Horde_Imap_Client ;
34
+ use Horde_Imap_Client_Exception ;
35
+ use Horde_Imap_Client_Fetch_Query ;
34
36
use Horde_Imap_Client_Ids ;
35
37
use Horde_Imap_Client_Mailbox ;
36
38
use Horde_Imap_Client_Search_Query ;
@@ -88,7 +90,7 @@ public function __construct($conn, $mailBox, $attributes, $delimiter='/') {
88
90
$ this ->makeDisplayName ();
89
91
}
90
92
91
- public function getMessages ($ from = 0 , $ count = 2 , $ filter = '' ) {
93
+ private function getSearchIds ($ from , $ count , $ filter ) {
92
94
if ($ filter instanceof Horde_Imap_Client_Search_Query) {
93
95
$ query = $ filter ;
94
96
} else {
@@ -105,11 +107,39 @@ public function getMessages($from = 0, $count = 2, $filter = '') {
105
107
if ($ from >= 0 && $ count >= 0 ) {
106
108
$ ids = array_slice ($ ids , $ from , $ count );
107
109
}
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
+ }
109
139
110
140
$ headers = [];
111
141
112
- $ fetch_query = new \ Horde_Imap_Client_Fetch_Query ();
142
+ $ fetch_query = new Horde_Imap_Client_Fetch_Query ();
113
143
$ fetch_query ->envelope ();
114
144
$ fetch_query ->flags ();
115
145
$ fetch_query ->size ();
@@ -266,7 +296,7 @@ public function getListArray($accountId, $status = null) {
266
296
'uidnext ' => $ status ['uidnext ' ],
267
297
'delimiter ' => $ this ->delimiter
268
298
];
269
- } catch (\ Horde_Imap_Client_Exception $ e ) {
299
+ } catch (Horde_Imap_Client_Exception $ e ) {
270
300
return [
271
301
'id ' => base64_encode ($ this ->getFolderId ()),
272
302
'parent ' => null ,
0 commit comments