PHP Conference Japan 2024

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 行,以符合 from_length 字元數
  • fetchsubject - 格式化後的 subject 行,以符合 subject_length 字元數

更新日誌

版本 說明
8.1.0 現在 imap 參數需要一個 IMAP\Connection 實例;先前,它需要一個有效的 imap 資源
8.0.0 已移除未使用的 defaulthost 參數。

另請參閱

新增備註

使用者貢獻的備註 5 則備註

andyltm
14 年前
當我使用 imap_headerinfo() 測試具有多個收件人(在 to 和/或 cc 欄位中有多個電子郵件地址)的電子郵件時,我注意到 imap_headerinfo() 在我的 PHP 5.2.10-2ubuntu6.4 與 Suhosin-Patch 0.9.7 (cli) 環境中嚴重失敗。

它沒有提供給我一個包含 to 和/或 cc 欄位中列出的每個電子郵件地址的陣列,而是只提供給我第一個列出的地址。這令人失望。

[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_rfc822_parse_headers(imap_fetchheader()) 來代替 imap_headerinfo()。

希望這能幫助從現在到未來遇到此問題的任何人。這篇文章是由 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 年前
如果您想從 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 的協助
Murray
9 年前
沒有主旨的電子郵件不會產生「subject」屬性。

在使用「subject」屬性之前,您應該先測試它是否存在。
if (property_exists($header, 'subject')) echo $header->subject;
To Top