文字

imap_fetchheader

(PHP 4, PHP 5, PHP 7)

imap_fetchheaderReturns header for a message

说明

string imap_fetchheader ( resource $imap_stream , int $msg_number [, int $options = 0 ] )

This function causes a fetch of the complete, unfiltered » RFC2822 format header of the specified message.

参数

imap_stream

imap_open() 返回的 IMAP 流。

msg_number

The message number

options

The possible options are:

  • FT_UID - The msgno argument is a UID
  • FT_INTERNAL - The return string is in "internal" format, without any attempt to canonicalize to CRLF newlines
  • FT_PREFETCHTEXT - The RFC822.TEXT should be pre-fetched at the same time. This avoids an extra RTT on an IMAP connection if a full message text is desired (e.g. in a "save to local file" operation)

返回值

Returns the header of the specified message as a text string.

参见

  • imap_fetch_overview() - Read an overview of the information in the headers of the given message

用户评论:

[#1] george dot who at gmail dot com [2015-06-15 14:03:55]

Here is a simple function to get an array with all headers.

<?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;
}
?>

[#2] rgagnon24 dot nospam at gmail dot com [2010-06-24 09:52:56]

Interesting that imap_headerinfo() does not allow a UID for the $msg_number field like all other fetching functions seem to allow.

If you want to use a UID to fetch the headers, use this two-step process:

<?php

$hText imap_fetchbody($mbox$uid'0'FT_UID);
$headers imap_rfc822_parse_headers($hText);
?>


The result is the same as the output of imap_headerinfo(), but you get to use the UID.

[#3] Jille at nomorecrap dot quis dot cx [2008-04-06 15:15:39]

<?PHP
$headers
=imap_fetchheader($imap$msgid);
preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m'$headers$matches);
?>


Works quite well for splitting headers,
$matches will contain 3 arrays:
$matches[0] are the full-lines (To: Jille@devnull.quis.cx\r\n)
$matches[1] will be the header (To)
$matches[2] will be the value (Jille@devnull.quis.cx)

In multi-line values the 'multilining is not stripped!'
this could be achieved with something like:
<?PHP
preg_replace
('/\r\n\s+/m'''$matches[2]);
?>

[#4] onofabio at gmail dot com [2008-03-07 03:18:24]

This function ignore that some header value have multiple lines...

<?php
    
// connecting to imap mailserver
    
$connection = @imap_open("{localhost:143/imap}INBOX""your_username""your_password");

    
// get imap_fetch header and put single lines into array
    
$header explode("\n"imap_fetchheader($connection1));

    
// browse array for additional headers
    
if (is_array($header) && count($header)) {
        
$head = array();
        foreach(
$header as $line) {
            
// is line with additional header?
            
if (eregi("^X-"$line)) {
                
// separate name and value
                
eregi("^([^:]*): (.*)"$line$arg);
                
$head[$arg[1]] = $arg[2];
            }
        }
    }

    
// now are all contained additional headers in array $head
?>


I write this simple function....

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

// Get headers
$header = imap_fetchheader($mbox, $mid);

// Split on \n
$h_array=split("\n",$header);

foreach ( $h_array as $h ) {

    // Check if row start with a char
    if ( preg_match("/^[A-Z]/i", $h )) {

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

$headers[$header_name] = $header_value;

    } else {
        // Append row to previous field
$headers[$header_name] = $header_value . $h;
    }

}

[#5] Max Geiger [2007-03-08 15:59:29]

If you call the function with the bitmask-parameter FT_PREFETCHTEXT the /Seen flag of the message will be set.

[#6] dj_doktor at upskirt dot cz [2005-04-03 07:17:48]

I spend lot of time find out how I can detect messages with
different priorities. When I read users notes I remember
function imap_fetchheader which show header of message
and additional headers too. Because I'm so lazy to work with
regular expressions I required my frend for writing code
- thanx Znouza.
And there is... :)

<?php
    
// connecting to imap mailserver
    
$connection = @imap_open("{localhost:143/imap}INBOX""your_username""your_password");

    
// get imap_fetch header and put single lines into array
    
$header explode("\n"imap_fetchheader($connection1));

    
// browse array for additional headers
    
if (is_array($header) && count($header)) {
        
$head = array();
        foreach(
$header as $line) {
            
// is line with additional header?
            
if (eregi("^X-"$line)) {
                
// separate name and value
                
eregi("^([^:]*): (.*)"$line$arg);
                
$head[$arg[1]] = $arg[2];
            }
        }
    }

    
// now are all contained additional headers in array $head
?>

上一篇: 下一篇: