Что такое код imap_fetchstructure

IMAP. Получить встроенные изображения

Здравствуйте!
Если не тот раздел, поправьте

Дорабатываю мини почтовый клиент. Задача отображать картинки, встроенные в html тела письма. При приеме такого письма, html картинки выглядит так:

И обрабатывал, если частей две или больше. Где-то читал, что вложения сохраняются только во вторую и последующие части. По идее встроенные картинки тоже должны сохранятся, как вложения. В пользу этого говорит и тот факт, что они таки сохраняются как вложения, правда пустыми и со странными именами.

Как быть? Как извлечь и сохранить эти картинки?
Заранее спасибо!

23.05.2020, 12:19

Встроенные изображения во вьюхе
Доброго времени суток, форумчане! Подскажите пожалуйста ответ на мой вопрос. В представлении у.

MailKit/Imap получить почту
Пробую получить почту с помощью библиотек MailKit, все что нашел и понял из исходников в интернете.

Используя встроенные функции получить заданную матрицу
При помощи встроенных функций для заполнения стандартных матриц, индексации двоеточием и, возможно.

Используя встроенные функции получить заданную матрицу.
При помощи встроенных функций для заполнения стандартных матриц, индексации двоеточием и, возможно.

Получить список контактов imap/pop3/smtp
Доброго времени суток, можно ли как-то получить список контактов с помощью imap/pop3/smtp .

php — imap_fetchstructure() не возвращает объект частей

У меня проблема с imap_fetchstructure ($this-> stream, $ messageNumber). некоторая электронная почта работает отлично, а другое письмо не работает, проблема в том, что в структуре отсутствует объект детали.

поскольку я сказал, что какая-то учетная запись gmail отлично работает с кодом, и тот, который я должен использовать, не работает для извлечения структуры сообщения. но почтовая информация, заголовок я получил без проблем, проблема в том, что я вызываю эту функцию

$ msg = $imap-> returnEmailMessageArr ($ val [msgno]);

//после этого эта функция вызывается

private function returnMessageStructureObj ($ messageNumber) <

для этой учетной записи gmail, которая не извлекает объект частей, структура выглядит следующим образом:

Пожалуйста, помогите мне найти эту проблему

imap_fetchstructure — Read the structure of a particular message

(PHP 4, PHP 5, PHP 7)

imap_fetchstructure — Read the structure of a particular message

Описание

Fetches all the structured information for a given message.

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

Поток IMAP, полученный из imap_open() .

The message number

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 MIME header.
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 (value may vary with used library, use of constants is recommended)

Value Type Constant
text TYPETEXT
1 multipart TYPEMULTIPART
2 message TYPEMESSAGE
3 application TYPEAPPLICATION
4 audio TYPEAUDIO
5 image TYPEIMAGE
6 video TYPEVIDEO
7 model TYPEMODEL
8 other TYPEOTHER

Transfer encodings (value may vary with used library, use of constants is recommended)

Value Type Constant
7bit ENC7BIT
1 8bit ENC8BIT
2 Binary ENCBINARY
3 Base64 ENCBASE64
4 Quoted-Printable ENCQUOTEDPRINTABLE
5 other ENCOTHER

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

  • imap_fetchbody() — Fetch a particular section of the body of the message
  • imap_bodystruct() — Read the structure of a specified body section of a specific message

Что такое код imap_fetchstructure

«; print_r($obj); echo » «; > //получение заголовка письма в виде объекта function getHeader($mbox,$u ; //перебираем элементы for ($i=0; $i charset;//кодировка $text = $elements[$i]->text;//закодированный текст if($charset == ‘default’)< //если элемент не кодирован, то значение кодировки default $ret .= $text; >else < //приводим всё кодировке к UTF-8 $ret .= iconv($charset,"UTF-8",$text); >> return $ret; > //получение содержимого письма в виде простого текста function getTextBody($imap,$u >parameters[0]->value;//кодировка символов //0 — 7BIT; 1 — 8BIT; 2 — BINARY; 3 — BASE64; 4 — QUOTED-PRINTABLE; 5 — OTHER switch ($structure->encoding) < case 3: //imap_base64 - декодирует BASE64-кодированный текст $text = imap_base64($text); break; case 4: //imap_qprint - конвертирует закавыченную строку в 8-битную строку $text = imap_qprint($text); break; >if($mimetype == ‘TEXT/PLAIN’) < $text = iconv($charset,"UTF-8",$text); >if($mimetype == ‘TEXT/HTML’) < $text = iconv($charset,"UTF-8",$text); >return $text; > > return false; > //MIME-тип передается числом, а подтип — текстом. //Функция приводит все в текстовый вид. //Например: если type = 0 и subtype = «PLAIN», //то функция вернет «TEXT/PLAIN». //TEXT — 0, MULTIPART — 1, .. , APPLICATION — 3 и т.д. function getMimeType($structure) < $primaryMimetype = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); if ($structure->subtype) < return $primaryMimetype[(int)$structure->type] . «/» . $structure->subtype; > return «TEXT/PLAIN»; > //перевести текст в дату MySQL function strToMysqlDate($text) < $unixTimestamp=strtotime($text); return date("Y-m-d H:i:s", $unixTimestamp); >//заполняем ассоциативный массив, где ключом является тип адреса, //а значение массив адресов function getAddress($header,$type,&$map)< //проверка существования типа в заголовке if(property_exists($header,$type))< $arr = $header->$type; if(is_array($arr) && count($arr) > 0) < $map[$type] = $arr; >> > //загрузка вложений function loadAttaches($mbox,$u >parts) return $attachCount; //перебираем части сообщения foreach($struct->parts as $number => $part)< //ищем части, у которых ifdisposition равно 1 и disposition равно ATTACHMENT, //все остальные части игнорируем. Также стоит заметить, что значение поля //disposition может быть как в верхнем, так и в нижнем регистрах, //т.е. может быть "attachment" и "ATTACHMENT". Поэтому в коде всё приведено //к верхнему регистру if(!$part->ifdisposition || strtoupper($part->disposition) != «ATTACHMENT»)continue; //получаем название файла $filename = getDecodedHeader($part->dparameters[0]->value); //получаем содержимое файла в закодированном виде $text = imap_fetchbody($mbox, $uid, $number + 1, FT_UID); //декодирование содержимого файла switch ($part->encoding) < case 3: $text = imap_base64($text); break; case 4: $text = imap_qprint($text); break; >//оригинальное название файла будем сохранять в базе данных. //Разные письма могут иметь вложения с одинаковыми названиями, //поэтому в файловой системе будем сохранять файла с уникальным именем, //сохранив при этом расширение файла $file_path = getStoreDirectory() . getU ,$filename); return count($arr) > 1 ? «.» . end($arr) : «»; > ?>

7 комментариев

Спасибо за скрипт, однако есть ошибки:
При внесении записей в mailbox необходимо в запрос добавить поле last_message_uid, иначе появляется лишний аргумент в VALUE.
Кроме того некорректно грузятся письма, а именно в большинстве писем не грузится тело письма. Причину пока не нашел.
Буду благодарен, если подскажете где рыть.

Да, и функция getMimeType в вашей записи должна всегда возвращать «TEXT/PLAIN».

очень понравился ваш скрипт. допилю веб морду к базе и буду использовать.

ошибка в sql «INSERT INTO mailboxes(email,password,host,port,is_ssl,is_deleted) VALUES», не хватает еще «last_message_uid».

спасибо за Вашу работу

Спасибо за скрипт. Согласен с замечаниями выше.
Копать по поводу тела письма тут: getPart();
Пока не копал. Как докопаю выложу.

Привет, лучший скрипт из всех что я встречал. Вот если бы другие тоже было бы описаны типы…

Привет! Скрипт супер, все работает как надо, почти! Если в тело письма вставлена картинка не как вложение, или есть подпись с картинкой то $body_text и $body_html не заполняются. так же скрипт не может прочитать сообщения в Rich text. Может у Вас уже есть решение данной проблемы?

По ссылке выше нужно взять функцию get_part и заменить на getPart, тогда начинают грузиться multipart сообщения, но местами с кодировкой есть проблемы. Нужно допиливать.

Что такое код imap_fetchstructure

(PHP 3, PHP 4 , PHP 5)

imap_fetchstructure — Read the structure of a particular message

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

This function fetches all the structured information for a given message. The optional options parameter only has a single option, FT_UID , which tells the function to treat the msg_number argument as a UID . The returned 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:

Таблица 1. 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 MIME header.
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.

Таблица 2. Primary body type

text
1 multipart
2 message
3 application
4 audio
5 image
6 video
7 other

Таблица 3. Transfer encodings

7BIT
1 8BIT
2 BINARY
3 BASE64
4 QUOTED-PRINTABLE
5 OTHER

I think the following line (when building attachment information)

The first version generated a PHP warning under PHP 5.0.3. The second version actually gets the filename.

I’ve created a function which simply extracts basic message content as a string ($content) and attachments as an array ($attachments). I’ve tested it with messages from Outlook, Outlook Express and Hotmail. Perhaps it’s useful to anyone.

= imap_fetchstructure ( $mbox , $mid );

$parts = $struct -> parts ;
$i = 0 ;

$stack = array(); /* Stack while parsing message */
$content = «» ; /* Content of message */
$attachment = array(); /* Attachments */

while (! $endwhile ) <
if (! $parts [ $i ]) <
if ( count ( $stack ) > 0 ) <
$parts = $stack [ count ( $stack )- 1 ][ «p» ];
$i = $stack [ count ( $stack )- 1 ][ «i» ] + 1 ;
array_pop ( $stack );
> else <
$endwhile = true ;
>
>

if (! $endwhile ) <
/* Create message part first (example ‘1.2.3’) */
$partstring = «» ;
foreach ( $stack as $s ) <
$partstring .= ( $s [ «i» ]+ 1 ) . «.» ;
>
$partstring .= ( $i + 1 );

if ( strtoupper ( $parts [ $i ]-> disposition ) == «ATTACHMENT» ) < /* Attachment */
$attachment [] = array( «filename» => $parts [ $i ]-> parameters [ 0 ]-> value ,
«filedata» => imap_fetchbody ( $mbox , $mid , $partstring ));
> elseif ( strtoupper ( $parts [ $i ]-> subtype ) == «PLAIN» ) < /* Message */
$content .= imap_fetchbody ( $mbox , $mid , $partstring );
>
>

if ( $parts [ $i ]-> parts ) <
$stack [] = array( «p» => $parts , «i» => $i );
$parts = $parts [ $i ]-> parts ;
$i = 0 ;
> else <
$i ++;
>
> /* while */
> /* complicated message */

echo «Analyzed message $mid, result:
» ;
echo «Content: $content

» ;
echo «Attachments:» ; print_r ( $attachment );
?>

Hey people, get the message attachments with this code:

= imap_open ( «$imap_server» . $f , $name , $pass );

// delibertely choose a message with an attachment

$info = imap_fetchstructure ( $mbox , $mno );

// find out how may parts the object has
$numparts = count ( $info -> parts );

$i = 0 ;
// find if multipart message
if ( $numparts > 1 )
<
echo «More than one part

foreach ( $info -> parts as $part )
<
if ( $part -> disposition == «INLINE» )
printf ( «Inline message has %s lines
» , $part -> lines );
elseif ( $part -> disposition == «attachment» )
<
$i ++;
echo $i . » Attachment/s found!
» ;
echo «Filename: » . $part -> dparameters [ 0 ]-> value . «

About above comment and source code I wrote: certainly, plain/html text files are attachments, but I’ve written my code thinking about web IMAP clients, where text parts are not for downloading, simply they are shown. That’s the reason.

I have written a code that check’s for attachments.
There is a slight problem with the above code;
when you send a mail with a .txt document as attachment
the type will be 0 and so there won’t be a attachment found.

I check for the disposition of the body part witch can be inline or attachment.
If this is an attachment he will display it.
You an also mix up both codes by checking on the type and the disposition.

$structuur = imap_fetchstructure($mbox,$a_mails_sort[$i]);
$bericht_delen=$structuur->parts;
for($i_delen = 0; $i_delen disposition == «attachment»)
<
$attachment = «OK»;
>// end if
>//end for

This is my function to check attachments:

= imap_fetchstructure ( $con , $msg );

if( checkAttachments ( $est ))
<
echo( «You have attachment(s)» );
>
else
<
echo( «You don’t have attachment(s)» );
>

function checkAttachments ( $estMsg )
<
if(( $estMsg -> type != 0 ) && ( $estMsg -> type != 1 ))
<
// Text and multipart parts will not be shown as attachments
return( true );
>
else
<
// If there’s no attachments, parts inside will be checked
if( $estMsg -> parts )
<
$partMsg = $estMsg -> parts ;
$i = 0 ;
// Parts will be checked while no attachments found or not all of them checked
while(!( checkAttachments ( $partMsg [ $i ])) && ( $i sizeof ( $estMsg -> parts )))
<
$i ++;
>

// If any ‘checkAttachment’ calls returned ‘true’, ‘i’ should be
// equal to number of parts(after increased in while). So, no
// attachments found
if( $i == sizeof ( $estMsg -> parts ))
<
return( false );
>
else
<
return( true );
>
>
else
<
// If no parts and text or multipart type, no attachments
return( false );
>
>
>
imap_close ( $con );
?>

I hope this helps somebody else(if bugs, thanks for your fixes).

After many long hours of pouring over the object returned by imap_fetchstructure() I came up with the solution posted at the following url:

The structure returned looks something like this:

0 Raw Headers
$this->p > $this->p > multipart/mixed — part is skipped!
2.0 Raw Headers
$this->p > 2.1.0 Raw Headers
$this->p > $this->p >
$this->p > multipart/mixed — part is skipped!
2.2.0 Raw Headers
$this->p > $this->p > $this->p > $this->p > $this->p > $this->p > $this->p >
Its important to note why multipart/related, multipart/mixed and certain multipart/alternative (if parent part is message/rfc822 && not multipart/mixed) parts are skipped, imap_fetchbody **does not** retreive a message part for these parts. Which isn’t a bug, as I have read in other places, these parts exist for the purpose of designing the viewer portion of a mail application. Also, headers aren’t assigned part numbers here because they are easy to pick out.

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

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 :/.

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

Sorry, my before code is not complet:

$struct = imap_fetchstructure( $conn, $curMsg );

$i = 1;
while( imap_fetchbody( $conn, $curMsg, $i ) ) <
$struct->parts[$i-1] = imap_bodystruct( $conn, $curMsg, $i );
$j = 1;
while( imap_fetchbody( $conn, $curMsg, «$i.$j» ) ) <
$struct->parts[$i-1]->parts[$j-1] = imap_bodystruct( $conn, $curMsg, «$i.$j» );
$j++;
>
$i++;
>

If your imap_fetchstructure not retrive all parts, write it:

$struct = imap_fetchstructure( $conn, $curMsg );

$i = 1;
while( imap_fetchbody( $conn, $curMsg, $i ) ) <
$struct->parts[$i-1] = imap_bodystruct( $conn, $curMsg, $i );
$i++;
>

I’m using freeBSD and had lots of problems with all functions/mail applications i could find on the net.

So i’m writing my own now..

Most of the stuff works fine now.. but i’m still working on the chooser to select the best part to show. (plain or HTML).

The #1 problem is that most functions give the wrong ID numbers beck to fetch the body.

Here’s a sollution to that problem.. :P

// Debug function.. always handy until it’s 100% completed..
$attachments = array(); $dispos=0;
$debug=true;
function doDebug($msg) <
global $debug, $debug_depth, $dispos;
if($debug) <
for($y = 0; $y type .»/». mimetype($part->type) .»/». $part->subtype);

switch($part->type) <
case 1: if((strtolower($part->subtype) == «mixed»)
or (strtolower($part->subtype) == «alternative»)
or (strtolower($part->subtype) == «related»)) break;

default: $an = sizeof($attachments);
if($part->ifdparameters) <
$dpara = $part->dparameters;
for ($v=0;$v attribute))
$fname = $dpara[$v]->value;>
>
if($part->ifparameters) <
if(empty($fname)) <
$para = $part->parameters;
for ($v=0;$v attribute)) $fname = $para[$v]->value;
>
>
>
if(empty($fname))$fname = «Onbekend»;

$attachments[$an]-> > $attachments[$an]->part = $id;
$attachments[$an]->filename = $fname;
$attachments[$an]->type=$part->type;
$attachments[$an]->subtype=$part->subtype;
$attachments[$an]->dispos=$dispos;
$attachments[$an]->size=$part->bytes;
doDebug(«Filename=».$attachments[$an]->filename); break;
>

for($x = 0; $x parts); $x++) <
Check_Part($part->parts[$x], $id.».».($x+1));
>
doDebug(«Dit deel had iets nuttigs.»);
if($part->ifdisposition) $dispos—;
$debug_depth—;
doDebug(«-End of part $id»);
>

function decode_mail($mbox, $msg) <
global $attachments, $debug, $debug_depth;
doDebug(«+Decoding message $msg»); $debug_depth++;
$obj = imap_fetchstructure($mbox, $msg, FT_U > while($moet_werken) <
Check_Part($obj, $id);

$moet_werken=false;
>
$debug_depth—; doDebug(«-End of message $msg»);
>

Now to get this to work..
Decode_Mail([Mailbox connection], [Message Number]);

this is the outpu attachment array..
1—1.1.1—Onbekend—0—PLAIN—0—31
2—1.1.2—Onbekend—0—HTML—0—29
3—1.2—Beschrijving Nieuw E.doc—3—MSWORD—1—613718
—————————————

PS.. «Onbekend» is dutch for «Unknown».

Good luck.
Paradise (www.ml75.nl)

you can easily see through everything with these functions:

function printarray($array) <
while(list($key,$value) = each($array)) <
if(is_array($value)) <
echo $key.»(array):

function printobject($obj) <
$array = get_object_vars($obj);
printarray($array);
>

end then do this:

$struct = imap_fetchstructure($box,$mailnr);
//$struct is een object!!
drukobjectaf($struct);

you get an extended tree-view into the hierarchie of objects and arrays
Comparing different mails(changing thenumber) may bring more clarity into this matter

(these functions may not work properly as they are translated from my dutch original, but they ought to be OK)

I think the above note about attachments is wrong. I tested sending files with and without attachments and I get the following

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

Somebody must include some good examples of how to decode a message with and without an attachement.

I’m writing a web based email, and it wasn’t verry easy for me to understand that part.
After a week of searching I still don’t get it very well, but now (I think and hope) I’m able to write it.

Yet I’m not that good with it, so I’m not able to put an example in it myself.

It’s better to use special constants instead of digits for primary content-type:

TYPETEXT unformatted text
TYPEMULTIPART multiple part
TYPEMESSAGE encapsulated message
TYPEAPPLICATION application data
TYPEAUDIO audio
TYPEIMAGE static image (GIF, JPEG, etc.)
TYPEVIDEO video
TYPEOTHER unknown

These constants are documented in the source code of IMAP extension but they are still undocumented here :(

Point of clarification:

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

«Other» is the eigth primary body type.

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.

Parsing the recursive object returned from imap_fetchstructure is easy. However trying to figure out the name of the section to pass to imap_fetchbody() isn’t quite so straight forward because the naming conventions for the MIME sections are odd. If you copy and paste the following function you can pass an UID of an IMAP message and it will print out a hierarchy of the message and label each section.

The only required parameters are $mbox and $em_uid. The other parameters are used when the function needs to call itself.

Two functions mime_encoding() and mime_type() are not included. All they do is return string for the integer represention of a mime type/encoding.

function imap_dbody($mbox, $em_u > <
// If this is the first run of the function then grab a object of the MIME structure of the message

if($section == 0) $mimeobj = imap_fetchstructure($mbox, $em_uid, FT_UID);

for($y = 0; $y type) . «/<$mimeobj->subtype>, «);
echo(mime_encoding($mimeobj->encoding) . » ( $section )
«);

for($x = 0; $x parts); $x++)
<
// If we are in the root of the object increment by whole integers

if($section == 0) $nsection = $x + 1;

// If we are in the object and the first sub-object of our object isn’t multipart
// then increment the postfix by «.1» otherwise we are multipart or a message
// and leave the section id alone to be handled by the next code block

// If there are more parts to the part about to be processed reference it as a header with «.0»
// but only if the child of this child isn’t MULTIPART

if(count($mimeobj->parts[$x]->parts))
<
// Funny really, if a mime section is a inline message that has a multipart body you reference the message
// mime section with «2» the inline message header with «2.0» and the subsections with «2.x»
// However if the mime section is a inline message with only 1 part then you reference the
// mime section in the message with 2.0 and the inline message body with 2.1

imap_dbody($mbox, $em_uid, $mimeobj->parts[$x], $depth + 1, $nsection);

// If after processing the entire MIME object the $x variable is still zero then we didn’t
// process a multipart mime message, it’s just normal email so say so here.

It looks like some clients (e.g. outlook) can attach a file that has two mime-types associated with it, like:

This bombs the parsing procedure somewhere in c-client, I guess, and as a result ifparameters is set to false for the respective part, and you can not retrieve filename, mimetype, or any other parameters.

Проблема с imap_fetchstructure (): неверный номер сообщения

Я работаю над IMAP, читая электронную почту из моей учетной записи Google, и не могу найти способ проверить, существует ли электронная почта с точным номером или почему произошла эта ошибка.

Вот мой код, поэтому в основном я устанавливаю соединение, а затем ищу все письма, получаю их список из списка определенных отправителей, а затем запускаю функцию процесса.

Функция процесса выглядит следующим образом

Я попытался удалить FT_UID, но та же ошибка сохраняется. Что может быть вашим предложением, что делать?

Найдите HTML и обычный текст с помощью imap_fetchstructure

Я хочу найти html и/или обычный текст с помощью imap_fetchstructure. Я попробовал несколько решений, но электронные письма не всегда имеют одинаковую структуру. Я на самом деле с помощью:

При попытке это; результат иногда является правильным и иногда возвращается. Содержимое вложений зависит от почтового сервера. Так что я хочу решение на основе Imap_fetchstructure.

Создан 26 авг. 14 2014-08-26 10:49:07 Makram

Больше кода .. необходимо. – MoshMage 26 авг. 14 2014-08-26 10:59:40

Я не думаю, что требуется больше кода, потому что мне нужно переключиться на другое решение, используя imap_fetchstructure, чтобы обнаружить HTML и обычный текст. – Makram 26 авг. 14 2014-08-26 11:05:53

Можно изменить свой вопрос makram :) Будет намного легче читать для людей, пытающихся помочь вам. – Damien Overeem 26 авг. 14 2014-08-26 11:21:18

@DamienOvereem благодарю вас за вашу рекомендацию. Вопрос сейчас много ясен **. – Makram 26 авг. 14 2014-08-26 11:56:19

Не имеет смысла, хотя .. оба ваших оператора ‘if’ будут выполняться каждый раз .. они оба’ if ($ body == «») ‘.. И строка’ $ message imap_fetchbody ($ inbox, $ number , «1.2.1»); ‘будет вызывать ошибку синтаксического анализа. Пожалуйста, сделайте ваш код похожим на вашу реальную ситуацию. – Damien Overeem 26 авг. 14 2014-08-26 12:45:01

Спасибо @DamienOvereem. Я нашел решение проблемы. Спасибо, что помогли мне улучшить качество моих вопросов. – Makram 26 авг. 14 2014-08-26 14:05:51

Что такое код imap_fetchstructure

imap_fetchstructure — Read the structure of a particular message

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

This function fetches all the structured information for a given message. The optional flags parameter only has a single option, FT_UID , which tells the function to treat the msg_number argument as a UID . The returned object includes the envelope, internal date, size, flags and body structure along with a similar object for each mime attachement. The structure of the returned objects is as follows:

Table 1. 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 MIME header.
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 >MIME body part.

Table 2. Primary body type

text
1 multipart
2 message
3 application
4 audio
5 image
6 video
7 other

Table 3. Transfer encodings

7BIT
1 8BIT
2 BINARY
3 BASE64
4 QUOTED-PRINTABLE
5 OTHER

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

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 :/.

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

Sorry, my before code is not complet:

$struct = imap_fetchstructure( $conn, $curMsg );

$i = 1;
while( imap_fetchbody( $conn, $curMsg, $i ) ) <
$struct->parts[$i-1] = imap_bodystruct( $conn, $curMsg, $i );
$j = 1;
while( imap_fetchbody( $conn, $curMsg, «$i.$j» ) ) <
$struct->parts[$i-1]->parts[$j-1] = imap_bodystruct( $conn, $curMsg, «$i.$j» );
$j++;
>
$i++;
>

If your imap_fetchstructure not retrive all parts, write it:

$struct = imap_fetchstructure( $conn, $curMsg );

$i = 1;
while( imap_fetchbody( $conn, $curMsg, $i ) ) <
$struct->parts[$i-1] = imap_bodystruct( $conn, $curMsg, $i );
$i++;
>

I’m using freeBSD and had lots of problems with all functions/mail applications i could find on the net.

So i’m writing my own now..

Most of the stuff works fine now.. but i’m still working on the chooser to select the best part to show. (plain or HTML).

The #1 problem is that most functions give the wrong ID numbers beck to fetch the body.

Here’s a sollution to that problem.. :P

// Debug function.. always handy until it’s 100% completed..
$attachments = array(); $dispos=0;
$debug=true;
function doDebug($msg) <
global $debug, $debug_depth, $dispos;
if($debug) <
for($y = 0; $y type .»/». mimetype($part->type) .»/». $part->subtype);

switch($part->type) <
case 1: if((strtolower($part->subtype) == «mixed»)
or (strtolower($part->subtype) == «alternative»)
or (strtolower($part->subtype) == «related»)) break;

default: $an = sizeof($attachments);
if($part->ifdparameters) <
$dpara = $part->dparameters;
for ($v=0;$v attribute))
$fname = $dpara[$v]->value;>
>
if($part->ifparameters) <
if(empty($fname)) <
$para = $part->parameters;
for ($v=0;$v attribute)) $fname = $para[$v]->value;
>
>
>
if(empty($fname))$fname = «Onbekend»;

$attachments[$an]-> > $attachments[$an]->part = $id;
$attachments[$an]->filename = $fname;
$attachments[$an]->type=$part->type;
$attachments[$an]->subtype=$part->subtype;
$attachments[$an]->dispos=$dispos;
$attachments[$an]->size=$part->bytes;
doDebug(«Filename=».$attachments[$an]->filename); break;
>

for($x = 0; $x parts); $x++) <
Check_Part($part->parts[$x], $id.».».($x+1));
>
doDebug(«Dit deel had iets nuttigs.»);
if($part->ifdisposition) $dispos—;
$debug_depth—;
doDebug(«-End of part $id»);
>

function decode_mail($mbox, $msg) <
global $attachments, $debug, $debug_depth;
doDebug(«+Decoding message $msg»); $debug_depth++;
$obj = imap_fetchstructure($mbox, $msg, FT_U > while($moet_werken) <
Check_Part($obj, $id);

$moet_werken=false;
>
$debug_depth—; doDebug(«-End of message $msg»);
>

Now to get this to work..
Decode_Mail([Mailbox connection], [Message Number]);

this is the outpu attachment array..
1—1.1.1—Onbekend—0—PLAIN—0—31
2—1.1.2—Onbekend—0—HTML—0—29
3—1.2—Beschrijving Nieuw E.doc—3—MSWORD—1—613718
—————————————

PS.. «Onbekend» is dutch for «Unknown».

Good luck.
Paradise (www.ml75.nl)

you can easily see through everything with these functions:

function printarray($array) <
while(list($key,$value) = each($array)) <
if(is_array($value)) <
echo $key.»(array):

function printobject($obj) <
$array = get_object_vars($obj);
printarray($array);
>

end then do this:

$struct = imap_fetchstructure($box,$mailnr);
//$struct is een object!!
drukobjectaf($struct);

you get an extended tree-view into the hierarchie of objects and arrays
Comparing different mails(changing thenumber) may bring more clarity into this matter

(these functions may not work properly as they are translated from my dutch original, but they ought to be OK)

I think the above note about attachments is wrong. I tested sending files with and without attachments and I get the following

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

> $msg_structure = imap_fetchstructure($mail_inbox, $msg_id);
> if($msg_structure->bytes == «»)
> Please, test this code and let me know is it
> working properly or not! Thanks in advance

Basically it works, but some mailers send in ‘alternative’-mode, and therefore

> if($msg_structure->bytes == «» && $msg_structure->subtype != «ALTERNATIVE»)

works somewhat better to check for attachments.

Somebody must include some good examples of how to decode a message with and without an attachement.

I’m writing a web based email, and it wasn’t verry easy for me to understand that part.
After a week of searching I still don’t get it very well, but now (I think and hope) I’m able to write it.

Yet I’m not that good with it, so I’m not able to put an example in it myself.

It’s better to use special constants instead of digits for primary content-type:

TYPETEXT unformatted text
TYPEMULTIPART multiple part
TYPEMESSAGE encapsulated message
TYPEAPPLICATION application data
TYPEAUDIO audio
TYPEIMAGE static image (GIF, JPEG, etc.)
TYPEVIDEO video
TYPEOTHER unknown

These constants are documented in the source code of IMAP extension but they are still undocumented here :(

Point of clarification:

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

«Other» is the eigth primary body type.

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.

Parsing the recursive object returned from imap_fetchstructure is easy. However trying to figure out the name of the section to pass to imap_fetchbody() isn’t quite so straight forward because the naming conventions for the MIME sections are odd. If you copy and paste the following function you can pass an UID of an IMAP message and it will print out a hierarchy of the message and label each section.

The only required parameters are $mbox and $em_uid. The other parameters are used when the function needs to call itself.

Two functions mime_encoding() and mime_type() are not included. All they do is return string for the integer represention of a mime type/encoding.

function imap_dbody($mbox, $em_u > <
// If this is the first run of the function then grab a object of the MIME structure of the message

if($section == 0) $mimeobj = imap_fetchstructure($mbox, $em_uid, FT_UID);

for($y = 0; $y type) . «/<$mimeobj->subtype>, «);
echo(mime_encoding($mimeobj->encoding) . » ( $section )
«);

for($x = 0; $x parts); $x++)
<
// If we are in the root of the object increment by whole integers

if($section == 0) $nsection = $x + 1;

// If we are in the object and the first sub-object of our object isn’t multipart
// then increment the postfix by «.1» otherwise we are multipart or a message
// and leave the section id alone to be handled by the next code block

// If there are more parts to the part about to be processed reference it as a header with «.0»
// but only if the child of this child isn’t MULTIPART

if(count($mimeobj->parts[$x]->parts))
<
// Funny really, if a mime section is a inline message that has a multipart body you reference the message
// mime section with «2» the inline message header with «2.0» and the subsections with «2.x»
// However if the mime section is a inline message with only 1 part then you reference the
// mime section in the message with 2.0 and the inline message body with 2.1

imap_dbody($mbox, $em_uid, $mimeobj->parts[$x], $depth + 1, $nsection);

// If after processing the entire MIME object the $x variable is still zero then we didn’t
// process a multipart mime message, it’s just normal email so say so here.

It looks like some clients (e.g. outlook) can attach a file that has two mime-types associated with it, like:

This bombs the parsing procedure somewhere in c-client, I guess, and as a result ifparameters is set to false for the respective part, and you can not retrieve filename, mimetype, or any other parameters.

Проблема с imap_fetchstructure (): неверный номер сообщения

Я работаю над IMAP, читая электронную почту из моей учетной записи Google, и не могу найти способ проверить, существует ли электронная почта с точным номером или почему произошла эта ошибка.

Вот мой код, поэтому в основном я устанавливаю соединение, а затем ищу все письма, получаю их список из списка определенных отправителей, а затем запускаю функцию процесса.

Функция процесса выглядит следующим образом

Я попытался удалить FT_UID, но та же ошибка сохраняется. Что может быть вашим предложением, что делать?

Что такое код imap_fetchstructure

imap_fetchstructure — Read the structure of a particular message

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

This function fetches all the structured information for a given message. The optional flags parameter only has a single option, FT_UID , which tells the function to treat the msg_number argument as a UID . The returned object includes the envelope, internal date, size, flags and body structure along with a similar object for each mime attachement. The structure of the returned objects is as follows:

Таблица 1. Returned Objects for imap_fetchstructure()

Илон Маск рекомендует:  Доказательство пpавильности декодиpования
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL