• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imap_fetchheader()

    (PHP 4, PHP 5, PHP 7)

    Returns header for a message

    说明

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

    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$optionsare:

    • FT_UID- The$msgnoargument 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.

    参见

    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.
    <?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]);
    ?>
    
    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;
      }
    }
    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
    ?>
    
    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;
    }
    ?>
    
    If you call the function with the bitmask-parameter FT_PREFETCHTEXT the /Seen flag of the message will be set.