Midwest PHP Call For Papers Open


(PECL mailparse >= 0.9.0)

mailparse_msg_extract_part Extracts/decodes a message section


mailparse_msg_extract_part ( resource $mimemail , string $msgbody [, callable $callbackfunc ] ) : void

This function is currently not documented; only its argument list is available.



A valid MIME resource.



Return Values

No value is returned.

See Also

add a note add a note

User Contributed Notes 5 notes

6 months ago
The callback argument does not support closures... :( It will complains with "PHP Catchable fatal error:  Object of class Closure could not be converted to string".
php at cdauth dot de
13 years ago
substr() uses the string length, not the position as third argument. The corrected version of the following code line:
[$s] = substr($file_txt, $starting_pos_body, $ending_pos_body-$starting_pos_body);
12 years ago
In mailparse version 2.1.1 (and perhaps earlier), when using mailparse_msg_extract_part() with a callback function, it breaks the data it passes to it into 4kB chunks and calls the callback function for each chunk.  So, for example, if it's extracting a 41kB MIME part, the callback function you define will be called 11 times, each time with the next chunk of data.  Here's some quick-and-dirty code that shows one way to handle this:

= file_get_contents ("email.txt"); // Pull in the e-mail.

function catch_part ($part)
$GLOBALS["part_data"] .= $part; // Append the data onto any previously extracted data.

mailparse_msg_extract_part ("1.1", $message, "catch_part"); // Extract MIME part 1.1
echo $GLOBALS["part_data"]; // Print out the extracted part.

There's probably a much better way of dealing with this, but hey.  It's what I got.
marlinf {at} datashaman {dot} com
11 years ago
With ref to previous comment re: callback:

If you explicitly specify NULL as the callback parameter, the complete section is extracted, decoded and returned, without the need for a callback.
steve at tequilasolutions dot com
13 years ago
Unless I've missed something obvious:

get_structure returns array(1,1.1,1.1.2) etc but its not easy to get the contents of each part as mailparse_msg_extract_part() and mailparse_msg_extract_part_file() just return the lot.  However get_part_data will return the string offsets so you know where to chop the message so you can get the contents of the parts.

Only issue is get_part_data returns:
    [starting-pos] => 0
    [starting-pos-body] => 1412
    [ending-pos] => 14989
    [ending-pos-body] => 14989

Unless I'm missed something else, theres a bug here as ending-pos is the same as ending-pos-body so it won't chop the contents cleanly, leaving the:


...as supposedly part of the section contents.

$file = "..../mail"; // path of your mail
$file_txt = implode("",file($file));
$parse = mailparse_msg_parse_file($file);
$structure = mailparse_msg_get_structure($parse);
// chop message parts into array
$parts = array();
foreach ($structure as $s){
    print "Part $s\n";
    print "--------------------------------------\n";
    $part = mailparse_msg_get_part($parse, $s);
    $part_data = mailparse_msg_get_part_data($part);
    $starting_pos_body = $part_data['starting-pos-body'];
    $ending_pos_body    = $part_data['ending-pos-body'];
    $parts[$s] = substr($file_txt,$starting_pos_body,$ending_pos_body); // copy data into array
    print "[".$parts[$s]."]";
    print "\n------------------------------------\n";
To Top