imap_headerinfo

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

imap_headerinfo读取邮件的标题

描述

imap_headerinfo(
    IMAP\Connection $imap,
    int $message_num,
    int $from_length = 0,
    int $subject_length = 0
): stdClass|false

通过读取邮件标题获取有关给定邮件编号的信息。

参数

imap

一个 IMAP\Connection 实例。

message_num

邮件编号

from_length

用于 fetchfrom 属性的字符数。必须大于或等于零。

subject_length

用于 fetchsubject 属性的字符数。必须大于或等于零。

defaulthost

返回值

如果发生错误,则返回 false,如果成功,则返回一个包含以下属性的对象

  • toaddress - 完整的 to: 行,最多 1024 个字符
  • to - 来自 To: 行的对象数组,具有以下属性:personaladlmailboxhost
  • fromaddress - 完整的 from: 行,最多 1024 个字符
  • from - 来自 From: 行的对象数组,具有以下属性:personaladlmailboxhost
  • ccaddress - 完整的 cc: 行,最多 1024 个字符
  • cc - 来自 Cc: 行的对象数组,具有以下属性:personaladlmailboxhost
  • bccaddress - 完整的 bcc: 行,最多 1024 个字符
  • bcc - 来自 Bcc: 行的对象数组,具有以下属性:personaladlmailboxhost
  • reply_toaddress - 完整的 Reply-To: 行,最多 1024 个字符
  • reply_to - 来自 Reply-To: 行的对象数组,具有以下属性:personaladlmailboxhost
  • senderaddress - 完整的 sender: 行,最多 1024 个字符
  • sender - 来自 Sender: 行的对象数组,具有以下属性:personaladlmailboxhost
  • return_pathaddress - 完整的 Return-Path: 行,最多 1024 个字符
  • return_path - 来自 Return-Path: 行的对象数组,具有以下属性:personaladlmailboxhost
  • remail -
  • date - 邮件标题中的邮件日期
  • Date - 与 date 相同
  • subject - 邮件主题
  • Subject - 与 subject 相同
  • in_reply_to -
  • message_id -
  • newsgroups -
  • followup_to -
  • references -
  • Recent - 如果是最近且已查看,则为 R;如果是最近但未查看,则为 N;如果不是最近,则为 ' '。
  • Unseen - 如果未查看且不是最近,则为 U;如果是已查看或未查看但最近,则为 ' '。
  • Flagged - 如果已标记,则为 F;如果未标记,则为 ' '。
  • Answered - 如果已答复,则为 A;如果未答复,则为 ' '。
  • Deleted - 如果已删除,则为 D;如果未删除,则为 ' '。
  • Draft - 如果是草稿,则为 X;如果不是草稿,则为 ' '。
  • Msgno - 邮件编号
  • MailDate -
  • Size - 邮件大小
  • udate - 邮件日期的 Unix 时间戳
  • fetchfrom - 格式化为 from_length 个字符的 from 行
  • fetchsubject - 格式化为 subject_length 个字符的 subject 行

变更日志

版本 描述
8.1.0 现在,imap 参数需要一个 IMAP\Connection 实例;之前,需要一个有效的 imap 资源
8.0.0 已删除未使用的 defaulthost 参数。

参见

添加备注

用户贡献的备注 10 个备注

24
andyltm
14 年前
当我使用包含多个收件人(在 to: 和/或 cc: 字段中列出多个电子邮件)的电子邮件测试 imap_headerinfo() 时,我注意到 imap_headerinfo() 在 PHP 5.2.10-2ubuntu6.4 上使用 Suhosin-Patch 0.9.7(cli)时出现了严重错误。

它没有为我在 to 和/或 cc 字段中列出的每个电子邮件地址提供一个数组,而只提供了第一个列出的地址。这令人失望。

[to] => Array
(
[0] => stdClass Object
(
[mailbox] => game
[host] => blunts.com
)
)

幸运的是,有一个很好的解决方法

imap_rfc822_parse_headers(imap_fetchheader( string ); 随后就像一只可爱的宠物一样工作了

[to] => Array
(
[0] => stdClass Object
(
[mailbox] => game
[host] => blunts.com
)
[1] => stdClass Object
(
[mailbox] => dutch
[host] => masters.com
)
)

TL;DR
换句话说,不要使用 imap_headerinfo(),而是使用 imap_rfc822_parse_headers(imap_fetchheader())。

希望这能帮助任何将来遇到此问题的人。这篇文章是 FreeNode IRC 上的 #PHP 中的人建议的。
9
jahservant 13 at gmail dot com
14 年前
我不确定为什么会出现这种情况,但如果您遍历邮箱中的所有邮件,每次都调用 imap_header(),则可以通过首先调用 imap_headers() 来显着提高性能。

比较一下
<?php
$imap
= imap_open("{my.server.com:143}INBOX", "user", "pass");
$n_msgs = imap_num_msg($imap);
$s = microtime(true);
for (
$i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
}
$e = microtime(true);
echo (
$e - $s);
imap_close($imap);
?>

与之对比
<?php
$imap
= imap_open("{my.server.com:143}INBOX", "user", "pass");
$n_msgs = imap_num_msg($imap);
/****** 添加此行: ******/
imap_headers($imap)
/***************************/
$s = microtime(true);
for (
$i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
}
$e = microtime(true);
echo (
$e - $s);
imap_close($imap);
?>

我在多个机器上测试过,连接到多个不同的服务器,发现第二个代码片段始终只需要一半的时间,甚至更少。

也许是因为 `imap_headers()` 在一个连接上检索所有邮件,而 `imap_header()` 必须为每封邮件发出新的获取请求?我不确定为什么如果先调用 `imap_headers()` 它会更快,但我确实知道它更快,所以我想分享一下我的发现。如果有人知道原因,请告诉我。
3
php at our-software dot com
7年前
请注意:`imap_headerinfo` 仅返回标头的一部分,而不是整个标头。

其中包括它只显示邮件“to”部分的第一个收件人,而不是所有收件人。

如果你没有看到你想要的东西,最好使用

$hdr_raw = imap_fetchheader($mbox, $mailid);
$hdr = imap_rfc822_parse_headers($hdr_raw);

然后你会看到完整的标头集,并且能够做更多的事情。
5
scott at fuzzygroup dot com
21年前
如果你想从 to、from 或其他标头元素中提取值,它们是一个对象,你需要循环遍历它们,例如:

$header = imap_header($mbox, $message_id);
$from = $header->from;
foreach ($from as $id => $object) {
$fromname = $object->personal;
$fromaddress = $object->mailbox . "@" . $object->host;
}

这将为你提供两个变量,一个是友好的发件人,一个是 SMTP 发件人地址。

感谢 www.natrak.net 的帮助
1
ron at NOSPAM dot clicks2hits dot com
15年前
使用 `headerinfo` 检查 Gmail 的简单代码

<?php /* 创建于:2008 年 11 月 3 日,作者:Ron Hickey 6tx.net/gmail_mod
适用于管理面板的 Gmail 模块,你可以编辑它并将 HTML 结果转换为 XML,以便在个人 RSS 阅读器中使用 */

// 在下面输入 Gmail 用户名,例如:$m_username = "yourusername";
$m_username = "";

// 在下面输入 Gmail 密码,例如:$m_password = "yourpword";
$m_password = "";

// 输入你想要从邮箱中显示的未读邮件数量,或者
// 输入 0 以显示所有未读邮件,例如:$m_acs = 0;
$m_acs = 15;

// 你想追溯多久时间的未读邮件 - 一个月 = 0,两周 = 1,一周 = 2,三天 = 3,
// 一天 = 4,六小时 = 5,一小时 = 6,例如:$m_t = 6;
$m_t = 2;

//----------->下面不需要再编辑了
// 打开邮箱......
$m_mail = imap_open ("{imap.gmail.com:993/imap/ssl}INBOX", $m_username . "@gmail.com", $m_password)

// 或者抛出错误......你个猪
or die("ERROR: " . imap_last_error());

// 过去的 Unix 时间,或者说是再见......当然不是 bi......或者说它是?......我不知道,傻瓜
$m_gunixtp = array(2592000, 1209600, 604800, 259200, 86400, 21600, 3600);

// 开始搜索的日期
$m_gdmy = date('d-M-Y', time() - $m_gunixtp[$m_t]);

// 在邮箱中搜索自 $m_t 日期以来的未读邮件
$m_search=imap_search ($m_mail, 'UNSEEN SINCE ' . $m_gdmy . '');

// 如果邮箱为空......显示“没有新邮件”,否则......你收到邮件了......真高兴
if($m_search < 1){
$m_empty = "没有新邮件";}
else {

// 按最新邮件排序结果
rsort($m_search);

// 如果 m_acs > 0 则限制结果
if($m_acs > 0){
array_splice($m_search, $m_acs);
}

// 循环它
foreach ($m_search as $what_ever) {

// 获取对象的东西的 IMAP 标头信息
$obj_thang = imap_headerinfo($m_mail, $what_ever);

// 然后把它吐出来......如果你不吞掉它
echo "<body bgcolor=D3D3D3><div align=center><br /><font face=Arial size=2 color=#800000>邮件 ID# " . $what_ever . "</font>

<table bgcolor=#D3D3D3 width=700 border=1 bordercolor=#000000 cellpadding=0 cellspacing=0>
<tr>
<td><table width=100% border=0>
<tr>
<td><table width=100% border=0>
<tr>
<td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>日期:</font> <font face=Arial size=2 color=#000000>"
. date("F j, Y, g:i a", $obj_thang->udate) . "</font></td>
<td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>发件人:</font> <font face=Arial size=2 color=#000000>"
. $obj_thang->fromaddress . "</font></td>
<td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>收件人:</font> <font face=Arial size=2 color=#000000>"
. $obj_thang->toaddress . " </font></td>
</tr>
<tr>
</table>
</td>
</tr><tr><td bgcolor=#F8F8FF><font face=Arial size=2 color=#800000>主题:</font> <font face=Arial size=2 color=#000000>"
. $obj_thang->Subject . "</font></td></tr><tr>
</tr>
</table></td>
</tr>
</table><a href=http://gmail.com target=_blank><font face=Arial size=2 color=#800000>登录以阅读邮件</a></font><br /></div></body>"
;

}} echo
"<div align=center><font face=Arial size=4 color=#800000><b>" . $m_empty . "</b></font></div>";
// 关闭邮箱,再见
imap_close($m_mail);
?>
1
Murray
8年前
没有主题行的电子邮件不会生成“subject”属性。

在使用“subject”属性之前,你应该对其进行测试。
if (property_exists($header, 'subject')) echo $header->subject;
0
milosh
10年前
我对使用 `imap_headerinfo()` 函数进行了一些测试,我对结果非常困惑。

在小型邮箱中,获取 30 条邮件的数据大约需要 0.5 秒。在拥有大约 500 条邮件的邮箱中,获取相同数量的邮件数据大约需要 7 秒。

为什么邮箱的大小会影响检索单封邮件标头所需的时间?邮箱都在同一个帐户上。

接下来,如果你测量每次对 `imap_headerinfo()` 函数的调用,结果就更奇怪了!第一次以及之后每隔 22 次对 `imap_headerinfo()` 函数的调用所花的时间是其他调用的 10000 倍。例如:第一次调用大约需要 0.39 秒,然后另外 20 次调用大约需要 0.0001 秒,然后第 22 次调用大约需要 0.47 秒,然后另外 20 次调用大约需要 0.00004 秒,依此类推。

经过进一步的研究,又发现了一些情况。

如果你使用

$message_header[$i] = imap_headerinfo($mbox, $i + 1);

它在每次第 22 次调用时大约需要 0.4 秒,在其他调用时大约需要 0.0001 秒。

然而,你会期望使用以下代码获得相同的结果:

$message_header[$i] = imap_headerinfo($mbox, 30 - $i);

但是,在这种情况下,每次调用大约需要 0.2 秒!

唯一的区别是,在第二个示例中,标头以反向邮件顺序检索(从第 30 条到第 1 条),并且由于某种原因,它极大地影响了操作所需的时间。奇怪吧,还是只有我这样?
0
trinkaus at ttNetz dot de
14 年前
当我尝试通过 POP3 和 IMAP 访问同一个邮箱时,我得到了不同的更新信息。

1. 使用 IMAP
header->udate 与 strtotime($header->date) 不同
<?php
$mBox
= imap_open("{host:143/imap/novalidate-cert}INBOX}", $username, $password); // 以 IMAP 方式打开
$header = imap_header($mBox, 1); // 获取第一封邮件的标头
echo $header->udate;
echo
strtotime($header->date);
?>

1. 使用 POP3
header->udate 与 strtotime($header->date) 相同
<?php
$mBox
= imap_open("{host:110/pop3/novalidate-cert}INBOX}", $username, $password); // 以 POP3 方式打开
$header = imap_header($mBox, 1); // 获取第一封邮件的头部
echo $header->udate;
echo
strtotime($header->date);
?>

我不知道为什么会出现这种情况,但出于这个原因,我使用 strtotime($header->date) 以及其他值来创建我自己的消息 UID,因为这似乎独立于协议工作。
-2
aeolianmeson at exoyiga dot blitzeclipse dot com
15年前
我通常使用 UID 来识别邮件,最近发现我使用此函数和邮件编号拉取的头部与 UID 不匹配。为了避免麻烦,我开始使用 imap_fetchheader() 和 imap_rfc822_parse_headers() 来处理它的输出。我立即发现的唯一显著差异是,没有 "udate" 属性,所以我使用 'date' 属性的 strtotime() 的结果分配了一个属性。

Dustin
-3
php at spacefish dot biz
15年前
我不得不将 msgid 作为数组($msgid) 传递,而不是整数。如果传递整数,则会生成错误 "Invalid messageID"。
To Top