mailparse_msg_extract_part

(4.1.0 - 4.1.2 only, PECL)

mailparse_msg_extract_part --  Extracts/decodes a message section

Description

void mailparse_msg_extract_part ( resource rfc2045, string msgbody [, callback callbackfunc] )

警告

本函数是实验性的。本函数的行为,包括函数名称以及其它任何关于本函数的文档可能会在没有通知的情况下随 PHP 以后的发布而改变。使用本函数风险自担。

警告

本函数暂无文档,仅有参数列表。

If callbackfunc is not specified, the contents will be sent to "stdout".


add a note add a note User Contributed Notes
php at cdauth dot de
07-Jun-2006 03:01
substr() uses the string length, not the position as third argument. The corrected version of the following code line:
<?php
$parts
[$s] = substr($file_txt, $starting_pos_body, $ending_pos_body-$starting_pos_body);
?>
steve at tequilasolutions dot com
07-Apr-2006 01:36
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:

------=_NextPart_000_0069_01C659A6.9072E590--

...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);
   print_r($part_data);
   $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";
}