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 UIDFT_INTERNAL
- The return string is in "internal" format, without any attempt to canonicalize to CRLF newlinesFT_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
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.