猿问

Laravel imap 获取按最近排序的消息

我正在使用laravel-imap从邮箱中检索消息:


$aMessage = $selectedFolder->query()->setFetchFlags(true)->setFetchBody(true)->setFetchAttachment(false)->leaveUnread()

->limit(40, $highest_page)->get();

默认情况下,最新消息位于最高页面上。如果我只是获取所有消息并按原样显示它们,我会首先看到旧消息(第 1 页)。


到目前为止我尝试了什么:


我调用后->get()的结果可以被视为一个普通的 laravel 集合,但是我用这些方法没有成功:


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


$aMessage = $aMessage->sortByDesc(function ($item) {

    //\Log::info(print_r($item, true));

    return $item->date;

})->values()->all();

我确信上面的方法不起作用,因为我使用->limit(40, $highest_page)了 ,这意味着集合的大小为 40。


如果我不限制结果并使用切片我会遇到超时错误,因为邮箱中的消息太多:


$aMessage = $selectedFolder->query()->setFetchFlags(true)->setFetchBody(true)->setFetchAttachment(false)->leaveUnread()

->get()->reverse()->slice(0, $messages_per_page);

我也尝试了 laravel-imap 的方法paginate()。结果与limit().


在这一点上,我确信我必须在结果变成集合之前以某种方式进行排序。我还发现:


'options' => [

    'fetch_order' => 'desc',

]

选项被添加到客户端。我试过asc和desc。我还清除了配置缓存,但没有任何效果。


我仍然在第 1 页上看到最旧的结果,最后看到最新的结果。


有人有更多想法吗?


喵喔喔
浏览 147回答 1
1回答

富国沪深

在尝试了几种解决方案后,我决定进入供应商文件(config/imap.php)并在那里更改 fetch_order:'fetch_order' => 'desc'默认为 asc。似乎在创建客户端时更改 fetch_order 不会覆盖配置。我以前有这个,但它不起作用,也没有抛出错误:$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',    ]]);
随时随地看视频慕课网APP
我要回答