【问题标题】:Laravel imap get messages sorted by most recentLaravel imap 获取按最近排序的消息
【发布时间】:2020-03-31 06:27:10
【问题描述】:

我正在使用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 页上看到最早的结果,最后看到最新的结果。

有人有更多想法吗?

【问题讨论】:

    标签: php laravel imap


    【解决方案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',
        ]
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2011-09-04
      • 2015-11-06
      • 2021-11-04
      • 2017-01-06
      相关资源
      最近更新 更多