imap_fetchstructure

(PHP 4, PHP 5)

imap_fetchstructure — Read the structure of a particular message

Описание

object imap_fetchstructure ( resource $imap_stream , int $msg_number [, int $options ] )

Fetches all the structured information for a given message.

Список параметров

imap_stream

An IMAP stream returned by imap_open().

msg_number

The message number

options

This optional parameter only has a single option, FT_UID, which tells the function to treat the msg_number argument as a UID.

Возвращаемые значения

Returns an object includes the envelope, internal date, size, flags and body structure along with a similar object for each mime attachment. The structure of the returned objects is as follows:

Returned Objects for imap_fetchstructure()
type Primary body type
encoding Body transfer encoding
ifsubtype TRUE if there is a subtype string
subtype MIME subtype
ifdescription TRUE if there is a description string
description Content description string
ifid TRUE if there is an identification string
id Identification string
lines Number of lines
bytes Number of bytes
ifdisposition TRUE if there is a disposition string
disposition Disposition string
ifdparameters TRUE if the dparameters array exists
dparameters An array of objects where each object has an "attribute" and a "value" property corresponding to the parameters on the Content-disposition MIMEheader.
ifparameters TRUE if the parameters array exists
parameters An array of objects where each object has an "attribute" and a "value" property.
parts An array of objects identical in structure to the top-level object, each of which corresponds to a MIME body part.

Primary body type
0text
1multipart
2message
3application
4audio
5image
6video
7other

Transfer encodings
07BIT
18BIT
2BINARY
3BASE64
4QUOTED-PRINTABLE
5OTHER

Смотрите также

Коментарии

the parts objects are identical in
structure to those returned by imap_fetchstructure, describing one subfolder each

parameters and dparameters are MIME-specific, theese contain the
extra parameters provided in the Content-Type and Content-Disposion Header lines such as Charset or Filename
1999-12-15 15:59:00
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
Assuming $struct = imap_fetchstructure($x,$y);

It is important to note that if a message has NO attachements, $struct->parts is an empty array, and $struct->bytes has a value.  If a message as ANY attachements, $struct->bytes ALWAYS = 0. To get the size of the primary body, you have to call structure->part[0]->bytes.  To get the size of the whole message, either strlen(imap_body) or add up the ->bytes of all the parts.

Another interesting note: 
When there is body text and no attachements:
count($struct->parts) = 0
When there is body text and 1 attachement:
count($struct->parts) = 2

These imap functions could really use better documentation. Like giving the meathods for the dparameter and parameter classes...
2001-04-25 21:48:45
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
Point of clarification:

The seventh primary body type is not "Other" as documented, but actually "Model".  This encompasses IGES, VRML, MESH, DWF, etc.

http://www.isi.edu/in-notes/iana/assignments/media-types/media-types

"Other" is the eigth primary body type.
2002-02-18 15:15:02
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
I think the above note about attachments is wrong. I tested sending files with and without attachments and I get the following<br>
with attachment: type=3 bytes=343648
no attachment: type=0 bytes=2
so checking for $struct->bytes == " " means nothing. At least in my test
running windows 2000, php4.2.1 using outlook and exchange. It seems that cheking the type will be more reliable
2002-09-20 16:16:28
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
If you are getting CHARSET as US-ASCII even if the header has a Content-Type: field, make sure the header also has a MIME-Version: field.

For example, the following header will correcty report charset as KOI8-R

MIME-Version: 1.0
Content-Type: text/plain; charset="koi8-r"

Without the MIME-Version it will be reported as US-ASII
2003-08-13 05:38:58
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
For people just beging this may help alot as I spent a couple hours just trying to relize how exact the array was stored. (at the time I did not know the print_r function :P)

$struct = imap_fetchstructure($mbox, $msgnumber);
print_r($struct);

Will give you a better example for your messages but they are called as $struct using the varible method above.

$struct->type; //would return the type
$struct->encoding //would return the encoding 

and etc..

This can be done many different ways but that is the basics on pulling the info out of the structure of fetchstructure itself, I hope it helps someone starting because it wouldve helped me :/.
2003-10-23 14:36:49
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
Автор:
I think the following line (when building attachment information)

>>> "filename" => $parts[$i]->parameters[0]->value

needs to be

>>> "filename" => $parts[$i]->dparameters[0]->value

The first version generated a PHP warning under PHP 5.0.3.  The second version actually gets the filename.
2005-04-18 12:52:54
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
"Primary body type" of "unknown/unknown" will be int(9).
2006-01-04 13:48:58
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
Another comment to inform people about something that should really be in the function description:

imap_fetchstructure() downloads the entire email, attachments and all, rather than just the structure.
I guess it's an undocumented feature, not a bug.

I had assumed that the script would have only downloaded the amount of data that was returned, but my script downloaded a cumulative 2.5gig before i noticed.  Hopefully no-one else will have this happen.
2007-09-26 22:13:51
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
Here is code to parse and decode all types of messages, including attachments. I've been using something like this for a while now, so it's pretty robust.

<?php
function getmsg($mbox,$mid) {
   
// input $mbox = IMAP stream, $mid = message id
    // output all the following:
   
global $charset,$htmlmsg,$plainmsg,$attachments;
   
$htmlmsg $plainmsg $charset '';
   
$attachments = array();

   
// HEADER
   
$h imap_header($mbox,$mid);
   
// add code here to get date, from, to, cc, subject...

    // BODY
   
$s imap_fetchstructure($mbox,$mid);
    if (!
$s->parts// simple
       
getpart($mbox,$mid,$s,0);  // pass 0 as part-number
   
else {  // multipart: cycle through each part
       
foreach ($s->parts as $partno0=>$p)
           
getpart($mbox,$mid,$p,$partno0+1);
    }
}

function 
getpart($mbox,$mid,$p,$partno) {
   
// $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
   
global $htmlmsg,$plainmsg,$charset,$attachments;

   
// DECODE DATA
   
$data = ($partno)?
       
imap_fetchbody($mbox,$mid,$partno):  // multipart
       
imap_body($mbox,$mid);  // simple
    // Any part may be encoded, even plain text messages, so check everything.
   
if ($p->encoding==4)
       
$data quoted_printable_decode($data);
    elseif (
$p->encoding==3)
       
$data base64_decode($data);

   
// PARAMETERS
    // get all parameters, like charset, filenames of attachments, etc.
   
$params = array();
    if (
$p->parameters)
        foreach (
$p->parameters as $x)
           
$params[strtolower($x->attribute)] = $x->value;
    if (
$p->dparameters)
        foreach (
$p->dparameters as $x)
           
$params[strtolower($x->attribute)] = $x->value;

   
// ATTACHMENT
    // Any part with a filename is an attachment,
    // so an attached text file (type 0) is not mistaken as the message.
   
if ($params['filename'] || $params['name']) {
       
// filename may be given as 'Filename' or 'Name' or both
       
$filename = ($params['filename'])? $params['filename'] : $params['name'];
       
// filename may be encoded, so see imap_mime_header_decode()
       
$attachments[$filename] = $data// this is a problem if two files have same name
   
}

   
// TEXT
   
if ($p->type==&& $data) {
       
// Messages may be split in different parts because of inline attachments,
        // so append parts together with blank row.
       
if (strtolower($p->subtype)=='plain')
           
$plainmsg. = trim($data) ."\n\n";
        else
           
$htmlmsg. = $data ."<br><br>";
       
$charset $params['charset'];  // assume all parts are same charset
   
}

   
// EMBEDDED MESSAGE
    // Many bounce notifications embed the original message as type 2,
    // but AOL uses type 1 (multipart), which is not handled here.
    // There are no PHP functions to parse embedded messages,
    // so this just appends the raw source to the main message.
   
elseif ($p->type==&& $data) {
       
$plainmsg. = $data."\n\n";
    }

   
// SUBPART RECURSION
   
if ($p->parts) {
        foreach (
$p->parts as $partno0=>$p2)
           
getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1));  // 1.2, 1.2.1, etc.
   
}
}
?>
2008-09-02 05:31:01
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
If you have errors with wrong attachment names like this:

correct name:
String -> Prüfbericht Hersteller.pdf

fetchstructure object name:
 =?ISO-8859-1?Q?Pr=FCfbericht_Hersteller=2Epdf?=

Workaround to reconvert:

imap_mime_header_decode($fetchstructure->dparameters->value)[0]->text

imap_mime_header_decode($filename)[0]->text
2019-01-24 13:44:38
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html
If you logic based on compare structure strings, you must compare it case insensetive.
<?php

$p 
imap_fetchstructure($this->_imap_resource$mid);
//do not compare $p->disposition == 'INLINE' 
if(preg_match('/inline/i'$p->disposition)) 
{
 
//this works
}
?>
2019-04-08 14:33:44
http://php5.kiev.ua/manual/ru/function.imap-fetchstructure.html

    Поддержать сайт на родительском проекте КГБ