Skip to content
Advertisement

Laravel imap get messages sorted by most recent

I am using laravel-imap to retrieve messages from a mailbox:

$aMessage = $selectedFolder->query()->setFetchFlags(true)->setFetchBody(true)->setFetchAttachment(false)->leaveUnread()
->limit(40, $highest_page)->get();

On default the most recent messages are on the highest page. If I simply get all messages and display them as they are I see the old ones first (page 1).

What I tried so far:

After I call ->get() the results can be treated as a normal laravel collection, but I had no success with these methods:

$aMessage = $aMessage->sortByDesc('date')->values()->all();

$aMessage = $aMessage->sortByDesc(function ($item) {
    //Log::info(print_r($item, true));
    return $item->date;
})->values()->all();

I am sure the methods above do not work because I use ->limit(40, $highest_page), which means the collection has a size of 40.

If I dont limit the results and use slice I encounter a timeout error, because there are too many messages in the mailbox:

$aMessage = $selectedFolder->query()->setFetchFlags(true)->setFetchBody(true)->setFetchAttachment(false)->leaveUnread()
->get()->reverse()->slice(0, $messages_per_page);

I also tried laravel-imap’s method paginate(). The results were the same as with limit().

At this point I am sure I have to sort somehow before the results turn into a collection. I also found:

'options' => [
    'fetch_order' => 'desc',
]

The options are added to the Client. I tried asc and desc. I also cleared config cache, but nothing works.

I still see the oldest results on page 1 and the most recent at the end.

Someone has more ideas?

Advertisement

Answer

After playing around with several solutions I decided to go into the vendor file (config/imap.php) and change the fetch_order there:

'fetch_order' => 'desc'

It was asc on default. It seems that changing the fetch_order when creating the client does not override the config. I had this before and it did not work, also no errors were thrown:

$this->oClient = new Client([
    'host'          => env('MAIL_HOST_IN'),
    'port'          => env('MAIL_PORT_IN'),
    'encryption'    => env('MAIL_ENCRYPTION_IN'),
    'validate_cert' => true,
    'username'      => env('MAIL_USERNAME'),
    'password'      => env('MAIL_PASSWORD'),
    'protocol'      => 'imap',
    'options' => [
        'fetch_order' => 'desc',
    ]
]);
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement