2024年PHP开发者大会(日本)

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 - 完整的收件人: 行,最多1024个字符
  • to - 来自收件人: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • fromaddress - 完整的发件人: 行,最多1024个字符
  • from - 来自发件人: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • ccaddress - 完整的抄送: 行,最多1024个字符
  • cc - 来自抄送: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • bccaddress - 完整的密送: 行,最多1024个字符
  • bcc - 来自密送: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • reply_toaddress - 完整的回复到: 行,最多1024个字符
  • reply_to - 来自回复到: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • senderaddress - 完整的发件人: 行,最多1024个字符
  • sender - 来自发件人: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • return_pathaddress - 完整的返回路径: 行,最多1024个字符
  • return_path - 来自返回路径: 行的对象数组,包含以下属性:personal, adl, mailbox, 和 host
  • 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个字符
  • fetchsubject - 格式化后的主题行,最多subject_length个字符

变更日志

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

参见

添加备注

用户贡献的笔记 5条笔记

andyltm
14年前
当我使用包含多个收件人(在收件人: 和/或抄送: 字段中有多个电子邮件)的电子邮件测试 imap_headerinfo() 时,我注意到在使用 Suhosin-Patch 0.9.7 (cli) 的 PHP 5.2.10-2ubuntu6.4 上,imap_headerinfo() 对我来说失败得很严重。

它没有提供包含收件人和/或抄送字段中列出的每个电子邮件地址的数组,而只提供了第一个列出的地址。这令人失望。

[to] => 数组
(
[0] => stdClass 对象
(
[mailbox] => game
[host] => blunts.com
)
)

幸运的是,这个问题有一个很酷的解决方法

imap_rfc822_parse_headers(imap_fetchheader( 字符串 )); 它随后像个好宠物一样工作了

[to] => 数组
(
[0] => stdClass 对象
(
[mailbox] => game
[host] => blunts.com
)
[1] => stdClass 对象
(
[mailbox] => dutch
[host] => masters.com
)
)

长话短说
换句话说,不要使用 imap_headerinfo(),而要使用 imap_rfc822_parse_headers(imap_fetchheader())。

希望这能帮助将来遇到此问题的任何人。FreeNode IRC 上的 #PHP 中的人建议发布这篇文章。
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()` 会更快,但我确实知道它更快,所以我认为可以分享一下这个知识。如果有人知道原因,请告诉我……
php at our-software dot com
7年前
请注意:`imap_headerinfo` 只返回报头的一个子集,而不是整个报头。

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

如果您没有看到您期望的内容,最好使用

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

然后您将看到完整的报头集,并能够对其进行更多操作。
scott at fuzzygroup dot com
22年前
如果您想从收件人、发件人或其他报头元素中提取值,它们是对象,您需要循环遍历它们,例如:

$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 提供的帮助
Murray
9年前
没有主题行的电子邮件不会生成“subject”属性。

在使用“subject”属性之前,您应该对其进行测试。
if (property_exists($header, 'subject')) echo $header->subject;
To Top