imap_fetch_overview

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

imap_fetch_overview阅读给定消息头信息中的一个概览

描述

imap_fetch_overview(IMAP\Connection $imap, string $sequence, int $flags = 0): array|false

此函数获取给定的 sequence 的邮件头,并返回其内容的概述。

参数

imap

一个 IMAP\Connection 实例。

sequence

一条消息序列描述。可以使用 X,Y 语法列举所需的消息,也可以使用 X:Y 语法检索某个时间间隔内的所有消息

flags

如果此参数设置为 FT_UID,则 sequence 将包含一条消息索引或 UID 的序列。

返回值

返回一个对象数组,其中每个对象描述一个消息头。此对象将仅定义存在的属性。可能的属性有

  • subject - 消息主题
  • from - 发送者
  • to - 收件人
  • date - 发送时间
  • message_id - 消息 ID
  • references - 引用此消息 ID
  • in_reply_to - 是对此消息 ID 的回复
  • size - 大小(以字节为单位)
  • uid - 此消息在邮箱中的 UID
  • msgno - 此消息在邮箱中的序列号
  • recent - 此消息标记为最近
  • flagged - 此消息已标记
  • answered - 此消息标记为已答复
  • deleted - 此消息标记为已删除
  • seen - 此消息标记为已读
  • draft - 此消息标记为草稿
  • udate - 到达日期的 UNIX 时间戳
此函数在失败时返回 false

变更日志

版本 描述
8.1.0 现在 imap 参数需要一个 IMAP\Connection 实例;以前,它需要一个有效的 imap 资源

示例

范例 #1 imap_fetch_overview() 示例

<?php
$mbox
= imap_open("{imap.example.org:143}INBOX", "username", "password")
or die(
"无法连接: " . imap_last_error());

$MC = imap_check($mbox);

// 获取收件箱中所有邮件的概述
$result = imap_fetch_overview($mbox,"1:{$MC->Nmsgs}",0);
foreach (
$result as $overview) {
echo
"#{$overview->msgno} ({$overview->date}) - From: {$overview->from}
{$overview->subject}\n";
}
imap_close($mbox);
?>

另请参阅

添加注释

用户贡献注释 19 条注释

raja at aonic dot net
17 年前
这是一个从 IMAP 获取消息并将它们排序以供分页的功能。

<?php
/**
* Return array of IMAP messages for pagination
*
* @param int $page page number to get
* @param int $per_page number of results per page
* @param array $sort array('subject', 'asc') etc
*
* @return mixed array containing imap_fetch_overview, pages, and total rows if successful, false if an error occurred
* @author Raja K
*/
public function listMessages($page = 1, $per_page = 25, $sort = null) {
$limit = ($per_page * $page);
$start = ($limit - $per_page) + 1;
$start = ($start < 1) ? 1 : $start;
$limit = (($limit - $start) != ($per_page-1)) ? ($start + ($per_page-1)) : $limit;
$info = imap_check($this->_imap_stream);
$limit = ($info->Nmsgs < $limit) ? $info->Nmsgs : $limit;

if(
true === is_array($sort)) {
$sorting = array(
'direction' => array( 'asc' => 0,
'desc' => 1),

'by' => array( 'date' => SORTDATE,
'arrival' => SORTARRIVAL,
'from' => SORTFROM,
'subject' => SORTSUBJECT,
'size' => SORTSIZE));
$by = (true === is_int($by = $sorting['by'][$sort[0]]))
?
$by
: $sorting['by']['date'];
$direction = (true === is_int($direction = $sorting['direction'][$sort[1]]))
?
$direction
: $sorting['direction']['desc'];

$sorted = imap_sort($this->_imap_stream, $by, $direction);

$msgs = array_chunk($sorted, $per_page);
$msgs = $msgs[$page-1];
}
else
$msgs = range($start, $limit); //just to keep it consistent

$result = imap_fetch_overview($this->_imap_stream, implode($msgs, ','), 0);
if(
false === is_array($result)) return false;

//sorting!
if(true === is_array($sorted)) {
$tmp_result = array();
foreach(
$result as $r)
$tmp_result[$r->msgno] = $r;

$result = array();
foreach(
$msgs as $msgno) {
$result[] = $tmp_result[$msgno];
}
}

$return = array('res' => $result,
'start' => $start,
'limit' => $limit,
'sorting' => array('by' => $sort[0], 'direction' => $sort[1]),
'total' => imap_num_msg($this->_imap_stream));
$return['pages'] = ceil($return['total'] / $per_page);
return
$return;
}
?>
Nitrogen
9 年前
从这里的评论来看,人们似乎忘记了现有的 PHP 排序函数的基本知识。使用 usort();以及最小的自定义函数来比较它们。

显然,将 imap_fetch_overview 的参数改为你自己的。

<?php
$result
= imap_fetch_overview($imap_stream, '1:10', 0);

usort($result, function($a, $b) {
return(
$b->udate-$a->udate);
});
?>

此 usort 函数将查看每条概述并按“udate”值确定的最新到最旧消息顺序对它们进行排序。此方法有效。我正在使用 it。它们的排序完全按照它们在我实际收件箱中显示的顺序进行。为什么还要再混淆它?
thinice at gmail dot com
13 年前
希望有人觉得这有助于生成可排序分页列表

<?php
public function listMessages($nStart=0, $nCnt=10) {

if (!
$this->loaded) {
return
NULL;
}

if ((
$nStart+$nCnt) > $this->getNum()) {
$nCnt = $this->getNum()-$nStart;
}

$aMsgs = imap_fetch_overview($this->rCon, ($nStart+1).':'.($nStart+$nCnt));
$aRet = array();
if (
$aMsgs) {
foreach (
$aMsgs as $msg) {
$aRet[$msg->udate] = $msg;
}
}

krsort($aRet);

var_dump($aRet);
}
?>
undernetangel 在 gmail dot com
7 年前
手册中存在一个错别字。到达时间的正确返回值为:udate 而不是 update。
Ap.Muthu
8 年前
$range 参数的用法在以下示例中进行了说明:http://www.phpdig.net/ref/rn31re596.html

<?php
$imap
= imap_open("{localhost}INBOX","graeme","inferno");

// 获取消息 2
// 和消息 4 到 6 的消息信息
$info = imap_fetch_overview($imap, "2,4:6");

?>

<table border=1>
<tr><th>已读</th><th>来自</th><th>日期</th><th>主题</th></tr>

<?php
// 循环该数组
foreach ($info as $msg) {
echo
"<tr>";

// 以美观的方式显示 seen 属性
if ($msg->seen == 1) {
$read = "Yes";
} else {
$read = "No";
}

// 打印其他信息
printf("<td>%s</td>", $read);
printf("<td>%s</td>", $msg->from);
printf("<td>%s</td>", $msg->date);
printf("<td>%s</td>", $msg->subject);
}

imap_close($imap);
?>
info at djdb dot be
11 年前
如果你丢失邮件,请使用它
<?php
public function READallUnreadmail(){
if (
$headers = imap_check($this->msgbox)){
$lastnr = $headers->Nmsgs;
if (
$mails=imap_fetch_overview($this->msgbox,"1:".$lastnr,0)){
while (list(
$key, $val) = each($mails)) {
if (++
$key>=0&&$header= imap_header($this->msgbox, $key)){
if(
$header->Unseen=='U'||$header->Recent=='R'){
echo
"<br>".$val->msgno." - ".$val->date." - ".$val->subject."\n<br>";
print
"IREAD".$header->Msgno;
//$this->getattachmentof($header->Msgno);
}
}
}
}
}
}
?>
steve at stevenchalker dot net
22 年以前
我认为,如果您使用列表,便可以列出您的“hotmail”邮件。
<?php
$mbox
=imap_open("{imap.server.com}","user","pass");
$MC=imap_check($mbox);
$MN=$MC->Nmsgs;
$overview=imap_fetch_overview($mbox,"1:$MN",0);
$size=sizeof($overview);
for(
$i=$size-1;$i>=0;$i--){
$val=$overview[$i];
$msg=$val->msgno;
$from=$val->from;
$date=$val->date;
$subj=$val->subject;
echo
"#$msg: From:'$from' Date:'$date' Subject:'$subj'<BR>";
imap_close($mbox);
?>
mails at slueoend dot ch
20 年前
并非此函数和所有其他 imap_fetch*-函数将下载整个邮件,而不仅仅是标题信息。
damien at dipisoft dot com
3 年前
这未编制文档,但我刚刚发现,使用 FT_UID 标志可将“-1”用作最后的标识符。示例

<?php
[...]
$result = imap_fetch_overview($mbox, "$first_uid:-1", FT_UID);
[...]
?>
jeff at newscloud dot com
10 年前
此处的远程类 (https://github.com/newscloud/mail_filter/blob/master/app/protected/models/Remote.php) 有许多使用 imap-fetch-overview 处理邮箱文件夹的示例

$this->open($account_id,$this->path_inbox);
$recent_messages = @imap_search($this->stream, 'SINCE "'.date("j F Y",$tstamp).'"',SE_UID); // 2013 年 11 月 30 日
if ($recent_messages===false) continue; // 待执行 - 继续进入下一个帐户
$result = imap_fetch_overview($this->stream, implode(',',array_slice($recent_messages,0,$message_limit)),FT_UID);
foreach ($result as $item) {
$msg = $this->parseHeader($item);
will
15 年前
此操作似乎会检索头部的部分值,而不是检索整个值,它会检索第一个值。例如,这是一个有效的 To: 头部

To: [email protected],[email protected]
[email protected]

而 imap_fetch_overview 将只会返回
[email protected]
Group-Office Developer
20 年前
关于序列排序问题。
我发现通过准备序列,然后一次性用大型邮箱提取这些序列,可以显著提升速度。对于小邮箱,你不会察觉出速度上的差异。

但是会出现排序问题。我花了整晚时间琢磨如何自己解决这个问题。我找到了解决办法!

利用 imap_sort 准备一条消息数组。创建第二个数组,将消息编号映射到已提取数组中的实际位置。
你知道它按照数字顺序排列,因此你可以使用 sort() 函数创建数组映射并从高到低进行排序。
然后你可以使用 array_map 处理利用 imap_fetch_overview 提取的数组,并且内容将会进行排序。如果你需要示例,请查看 Group-Office 稍晚于 2.04 版本的代码类中的 imap.class.inc。
trionon at mail dot ru
22 年以前
如果你需要打印 imap_sort() 的结果,此性能提示很有用

准备包含 UID 的大型字符串,然后一次调用 imap_fetchoverview,速度快于循环中调用 imap_fetchoverview。
rueda dot raul at gmail dot com
10 年前
英语
我发现,对于某些消息,此函数和函数 imap_headerinfo() 也无法对 message_id 信息进行解码,并且返回像 "<xxxxxxxxx@unknownmsgid>" 这样的 ID。

在这些情况下,我使用以下方法来获取正确的 messageid

$header=imap_rfc822_parse_headers(imap_fetchheader($mbox,$msgno))

西班牙语
某些消息的问题是,此函数及函数 imap_headerinfo() 无法正确解码消息 ID 信息,并返回类似于“<xxxxxxxxx@unknownmsgid>”的 ID。

在这些情况下,我使用以下内容来获取正确的消息 ID

$header=imap_rfc822_parse_headers(imap_fetchheader($mbox,$msgno))
suurenbroekNoSpam at ov35 dot NoSpam dot nl
21 年前
请注意,这些对象变量仅当它们实际在邮件中时才存在。

这意味着,如果一封邮件没有主题,属性 $val->subject 将不存在。

调用 $val->subject 会产生提示
通知: 在第 xxx 行的 /home/html/inc/Mbox.php 中未定义属性: subject

使用该方法进行检查
if (array_key_exists( "subject", get_object_vars($val)))
$subj=$val->subject;
else
$subj="";
se at designlinks dot net
21 年前
进一步解释 'warrenfalk' 的评论,以下序列完全相同,并始终按 UID 从最低到最高返回邮件

1:5
5:1
1,2,3,4,5
5,4,3,2,1
3,2,5,1,4

(始终返回 1、2、3、4、5)
dognose
15 年前
没错

调用 imap_fetch_overview() 一次比在
循环中调用它要快。

但是,如果你想获取一个“按日期分类”的列表,则需要在循环中调用它,因为如果你输入一个 UID 的“字符串”,它们始终按 UID 排序,而不是按你输入它们的顺序排序。

以下是一个小型示例,说明如何获取按日期排序的列表

<?php
/*按到达日期对所有邮件进行排序。最新 = 0,最旧 = 数组计数*/
/*返回一个数组,包含邮件的 UID*/
$SortedArray = imap_sort($Handle,SORTARRIVAL,1,SE_UID);

For (
$i = $Start; $i< $Start + $Limit; $i++){
/*从已排序数组中读取 UID*/
$UID = $SortedArray[$i];

/*获取详细的消息信息*/
$Overview = imap_fetch_overview($Handle, $UID, FT_UID);

[...]
}
?>
xhack at web dot de
17 年前
您想要一个按邮件排序的列表,但你总是得到相同的顺序?你的 c-client 似乎导致了这个问题。我用 Linux libc6-2.3.6 和 php-5.2.0 意识到这个问题。

试用这个小代码

# 在这里,您尝试按您的条件进行排序
$sort=@imap_sort($mbox,SORTDATE,1,SE_UID);

# 在这里,应该识别要获取的邮件顺序,但没有

$tmp=@imap_fetch_overview($mbox,implode(',',$sort),FT_UID);
# 所以简单尝试解决
for($i=0;$i<count($tmp);$i++)
{ $liste[$i]=$tmp[array_search($tmp[$i]->uid,$sort)]; }

所以现在您可以按日期、地址等进行排序。
vijayakumard01 at gmail dot com
7 年前
使用获取预览时,只显示一封邮件。我需要显示包括回复、转发和所有内容在内的邮件。怎么做?
To Top