imap_fetchheader

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

imap_fetchheaderDevolver la cabecera de un mensaje

Descripción

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

Esta función lleva a cabo la obtención de la cabecera completa, sin filtrar, con formato » RFC2822 del mensaje especificado.

Parámetros

imap_stream

IMAP stream devuelto por imap_open().

msg_number

El número de mensaje

options

Las opciones dadas por options son:

  • FT_UID - El argumento msgno es un UID
  • FT_INTERNAL - La cadena devuelta está en formato "interno" sin ningún intento de canonizar a nuevas líneas CRLF
  • FT_PREFETCHTEXT - RFC822.TEXT debería ser preobtenido al mismo tiempo. Esto evita un RTT extra en una conexión IMAP si se desea un mensaje de texto completo (p.ej. en una operación "guardar en fichero local")

Valores devueltos

Devuelve la cabecera del mensaje especificado como una cadena de texto.

Ver también

add a note add a note

User Contributed Notes 6 notes

up
8
rgagnon24 dot nospam at gmail dot com
13 years ago
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
/*
* assumes $mbox is your stream, and $uid is set
* properly. Proper error checking is up to you.
*/
$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.
up
3
onofabio at gmail dot com
16 years ago
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($connection, 1));

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

}
up
2
Jille at nomorecrap dot quis dot cx
16 years ago
<?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]);
?>
up
0
dj_doktor at upskirt dot cz
19 years ago
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($connection, 1));

   
// 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
?>
up
-2
george dot who at gmail dot com
8 years ago
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;
}
?>
up
-5
Max Geiger
17 years ago
If you call the function with the bitmask-parameter FT_PREFETCHTEXT the /Seen flag of the message will be set.
To Top