imap_fetchheader

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

imap_fetchheader返回邮件的报头

描述

imap_fetchheader(IMAP\Connection $imap, int $message_num, int $flags = 0): string|false

此函数会获取指定邮件的完整、未过滤的 » RFC2822 格式报头。

参数

imap

一个 IMAP\Connection 实例。

message_num

邮件编号

flags

可能的 flags

  • FT_UID - message_num 参数是 UID
  • FT_INTERNAL - 返回字符串是“内部”格式,不尝试规范化为 CRLF 换行符
  • FT_PREFETCHTEXT - RFC822.TEXT 应该在同一时间预先获取。这避免了在 IMAP 连接上进行额外的 RTT,如果需要完整的邮件正文(例如在“保存到本地文件”操作中)。

返回值

返回指定邮件的报头作为文本字符串,或者在失败时返回 false

变更日志

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

参见

添加注释

用户贡献注释 6 notes

7
rgagnon24 dot nospam at gmail dot com
14 年前
有趣的是 imap_headerinfo() 不允许像所有其他获取函数那样,在 $msg_number 字段中使用 UID。

如果要使用 UID 获取报头,请使用以下两步过程

<?php
/*
* 假设 $mbox 是您的流,并且 $uid 设置
* 正确。由您负责进行适当的错误检查。
*/
$hText = imap_fetchbody($mbox, $uid, '0', FT_UID);
$headers = imap_rfc822_parse_headers($hText);
?>

结果与 imap_headerinfo() 的输出相同,但可以使用 UID。
3
Jille at nomorecrap dot quis dot cx
16 年前
<?PHP
$headers
=imap_fetchheader($imap, $msgid);
preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m', $headers, $matches);
?>

非常适合分割报头,
$matches 将包含 3 个数组
$matches[0] 是完整的行 (To: [email protected]\r\n)
$matches[1] 将是报头 (To)
$matches[2] 将是值 ([email protected])

在多行值中,“多行不进行剥离!”
这可以通过以下方法实现
<?PHP
preg_replace
('/\r\n\s+/m', '', $matches[2]);
?>
3
onofabio at gmail dot com
16 年前
此函数忽略了一些报头值具有多行的事实...

<?php
// 连接到 imap 邮件服务器
$connection = @imap_open("{localhost:143/imap}INBOX", "your_username", "your_password");

// 获取 imap_fetch 报头并将单行放入数组
$header = explode("\n", imap_fetchheader($connection, 1));

// 浏览数组以查找其他报头
if (is_array($header) && count($header)) {
$head = array();
foreach(
$header as $line) {
// 是包含其他报头的行吗?
if (eregi("^X-", $line)) {
// 分隔名称和值
eregi("^([^:]*): (.*)", $line, $arg);
$head[$arg[1]] = $arg[2];
}
}
}

// 现在所有包含其他报头的报头都在 $head 数组中
?>

我写了这个简单的函数....

$mbox = imap_open("{localhost:143/imap}INBOX", "your_username", "your_password");
$mid=1 // 邮件 ID

// 获取报头
$header = imap_fetchheader($mbox, $mid);

// 按 \n 分割
$h_array=split("\n",$header);

foreach ( $h_array as $h ) {

// 检查行是否以字符开头
if ( preg_match("/^[A-Z]/i", $h )) {

$tmp = split(":",$h);
$header_name = $tmp[0];
$header_value = $tmp[1];

$headers[$header_name] = $header_value;

} else {
// 将行追加到上一个字段
$headers[$header_name] = $header_value . $h;
}

}
0
dj_doktor at upskirt dot cz
19 年前
我花了很多时间才弄清楚如何检测具有
不同优先级的邮件。当我阅读用户笔记时,我想起了
imap_fetchheader 函数,它显示邮件的报头
以及其他报头。因为我懒得使用
正则表达式,我要求我的朋友写代码
- 感谢 Znouza。
而且它确实存在... :)

<?php
// 连接到 IMAP 邮件服务器
$connection = @imap_open("{localhost:143/imap}INBOX", "your_username", "your_password");

// 获取 IMAP_FETCH 标头并将单行放入数组
$header = explode("\n", imap_fetchheader($connection, 1));

// 在数组中查找附加标头
if (is_array($header) && count($header)) {
$head = array();
foreach(
$header as $line) {
// 是否包含附加标头的行?
if (eregi("^X-", $line)) {
// 分隔名称和值
eregi("^([^:]*): (.*)", $line, $arg);
$head[$arg[1]] = $arg[2];
}
}
}

// 现在所有包含的附加标头都在数组 $head 中
?>
-5
Max Geiger
17 年前
如果你用 bitmask 参数 FT_PREFETCHTEXT 调用该函数,邮件的 /Seen 标志会被设置。
-4
george dot who at gmail dot com
9 年前
这是一个获取包含所有标头的数组的简单函数。

<?php
function mail_header_parse($mbox,$msg){
$header=imap_fetchheader($mbox,$msg);
preg_match_all("/^([^\r\n:]+)\s*[:]\s*([^\r\n:]+(?:[\r]?[\n][ \t][^\r\n]+)*)/m",$header,$matches,PREG_SET_ORDER);
foreach(
$matches as $match){
$match[2]=iconv_mime_decode($match[2],ICONV_MIME_DECODE_CONTINUE_ON_ERROR,'utf-8');
if(
is_array($headers[$match[1]])){
$headers[$match[1]][]=$match[2];
}elseif(isset(
$headers[$match[1]])){
$headers[$match[1]]=array($headers[$match[1]],$match[2]);
}else{
$headers[$match[1]]=$match[2];
}
}
return
$headers;
}
?>
To Top