imap_sort

(PHP 4,PHP 5,PHP 7,PHP 8)

imap_sort获取并排序邮件

描述

imap_sort(
    IMAP\Connection $imap,
    int $criteria,
    bool $reverse,
    int $flags = 0,
    ?string $search_criteria = null,
    ?string $charset = null
): array|false

按照指定参数获取和对消息编号进行排序。

参数

imap

IMAP\Connection 实例。

criteria

条件可以是以下条件中的一个(且只能是一个)

reverse

是否按照反向顺序进行排序。

flags

flags 是以下一项或多项的位掩码

search_criteria

IMAP2 格式的搜索条件字符串。有关详细信息,请参见 imap_search()

charset

对字符串进行排序时要使用的 MIME 字符集。

返回值

返回按照指定参数排序的消息编号数组,或在失败时返回 false

变更日志

版本 描述
8.1.0 imap 参数现在需要一个 IMAP\Connection 实例;以前需要一个有效的 imap 资源
8.0.0 reverse 现在为 bool,而不是 int
8.0.0 search_criteriacharset 现在为 nullable
添加备注

用户贡献的备注 7 则备注

antoine dot spam-nono at maxg dot info
18 年前
自编写完整的网络邮件程序以来,我一直在使用 IMAP 函数,下面是有关 imap_sort 函数的一点提示

之间有很大差别

<?php
imap_sort
($imap, SORTDATE, 1);
// 和
imap_sort($imap, SORTARRIVAL, 1);
?>

第一个命令将发出
>> FETCH 1:last (UID ENVELOPE BODY.PEEK[HEADER.FIELDS (Newsgroups Content-MD5 Content-Disposition Content-Language Content-Location Followup-To References)] INTERNALDATE RFC822.SIZE FLAGS)

而第二个将导致
>> FETCH 1:last (UID INTERNALDATE RFC822.SIZE FLAGS)

因此,在有 800 封邮件的邮箱中使用 SORTDATE 完成需要花费 3 秒钟,虽然得到的结果几乎相同(除非您要处理伪造的日期或时区,但到来的顺序更符合逻辑)

如果您按到达时间对邮件进行排序,我的建议是使用 SORTARRIVAL,或者更直接的方法是省掉 imap_sort,转而使用消息号码(而非 UID)。在大型邮箱中,如果您按页面显示邮件,性能将大幅提升(避免了 5 秒的排序时间)。
boscolau at mac dot com
19 年前
以下是 graham_NOSPAM at rdb-concepts dot NOSPAM dot co dot uk 回复的一个更优雅的搜索结果排序方法

function order_search($searchresults, $sortresults) {
return array_values(array_intersect($sortresults,$searchresults));
}

函数使用方法的示例
$sortresults = imap_sort($stream, $sort, $sortorder);
$searchresults = imap_search($stream, $query);
$sorted_search_results = order_search($searchresults, $sortresults);

排序后的搜索结果将存储到 $sorted_search_results 数组中。
persian-horde at metanetworking dot com
19 年前
imap_sort 使用 c-client 库对消息进行排序。此库目前不支持
对其他语言进行基于语言环境的排序(尽管它有字符集选项)。
他们在研究这个问题(http://www.washington.edu/imap/IMAP-FAQs/#1.12),
但是可以使用以下函数,它使用 strcoll() 进行基于语言环境的排序。
请注意,SUBJECT 域排序需要这样做,因为大多数
其他域在任何语言环境中都会被 imap_sort 正确排序

function imap_locale_sort($stream,$criteria,$reverse,$locale,$options)
{
if ($criteria!=SORTSUBJECT)
return (imap_sort($stream,$criteria,$reverse,$options));

$unsorted = array();
$sortresult = array();

$MC=imap_check($stream);
$MN=$MC->Nmsgs;

$overview = imap_fetch_overview($stream,"1:$MN",0);
$k=0;
while( list($key,$val) = each($overview))
{
$unsorted[$k]["uid"]=$val->uid;
$unsorted[$k]["subject"]=MIME::decode($val->subject, NLS::getCharset());
$k++;
}
usort ($unsorted, create_function('$a,$b','setlocale(LC_ALL,$locale);return strcoll($a["subject"],$b["subject"]);'));

for ($m=0;$m<count($unsorted);$m++)
array_push($sortresult,$unsorted[$m]["uid"]);

if ($reverse)
$sortresult = array_reverse($sortresult);

return $sortresult;
}

使用示例

$sorted = imap_locale_sort($stream,SORTSUBJECT,0,'fa_IR',0);
tilmauder at yahoo dot com
20 年前
针对 fprado 的问题,解决方法是对 imap_fetchheader() 使用 array_multisort() 函数。sdavey at datalink dot net dot au 在 array_multisort 下写了一个很好的示例。我用它根据邮件大小对 POP3 进行排序。不幸的是,我的代码太复杂,无法在此处发布。
persian-horde at metanetworking dot com
19 年前
你好,
我们在之前的代码 (imap_locale_sort) 中使用了 MIME 和 NLS 库,
它们是 PEAR 和 Horde 项目的一部分,因此我们的函数
非常具体。下面是此函数的一般(纯 PHP)代码
function

function imap_locale_sort($stream,$criteria,$reverse,$locale,$options)
{
if ($criteria!=SORTSUBJECT)
return (imap_sort($stream,$criteria,$reverse,$options));

$unsorted = array();
$sortresult = array();

$MC=imap_check($stream);
$MN=$MC->Nmsgs;

$overview = imap_fetch_overview($stream,"1:$MN",0);
$k=0;
while( list($key,$val) = each($overview))
{
$unsorted[$k]["uid"]=$val->uid;
$unsorted[$k]["subject"]=imap_utf8($val->subject);
$k++;
}
usort ($unsorted, create_function('$a,$b','setlocale(LC_ALL,$locale);return strcoll($a["subject"],$b["subject"]);'));

for ($m=0;$m<count($unsorted);$m++)
array_push($sortresult,$unsorted[$m]["uid"]);

if ($reverse)
$sortresult = array_reverse($sortresult);

return $sortresult;
}

示例用法

$mbox = imap_open("{localhost:143}INBOX.sent-mail","userid","password");

if ($mbox)
echo ("连接成功!");

$sorted = imap_locale_sort($mbox,SORTSUBJECT,0,'fa_IR',0);
print_r($sorted);
print ("\n\n");
$sorted = imap_sort($mbox,SORTSUBJECT,SE_UID);
print_r($sorted);

imap_close($mbox);
fprado at pmovil dot com dot br
21 年前
我使用 imap_sort() 来遍历 POP3 帐户。但是,有时当邮箱太大时,响应非常慢。

我尝试嗅探网络以发现问题根源,发现当对 POP3 服务器调用 imap_sort() 时,它会下载信箱中所有邮件的完整正文和附件。由于我的 POP 服务器和 Web 服务器位于不同的计算机上,因此导致响应速度明显变慢。

我一直在尝试解决这个问题,如果我成功解决了,我将在此处发布解决方法。
graham_NOSPAM at rdb-concepts dot NOSPAM dot co dot uk
22 年前
对于使用不支持额外的搜索参数的旧版 PHP 的人,你们可能需要使用此函数
function order_search($searchresults, $sortresults) {
$searchhash = array();
$returnresults = array();
$count = 0;
for ($i = 0; $i < sizeof($searchresults); $i++) {
$searchhash[$searchresults[$i]] = true;
}
for ($i = 0; $i < sizeof($sortresults); $i++) {
if (@$searchhash[$sortresults[$i]]) {
$returnresults[$count] = $sortresults[$i];
$count++;
}
}
return $returnresults;
}

函数使用方法的示例
$sortresults = imap_sort($stream, $sort, $sortdir, SE_UID);
$searchresults = imap_search($stream, $search, SE_UID);
$results = order_search($searchresults, $sortresults);

$results 将保存一个搜索结果排序数组。
To Top