• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mailparse_msg_extract_part()

    (PECL mailparse >= 0.9.0)

    Extracts/decodes a message section

    说明

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

    本函数还未编写文档,仅有参数列表。

    参数

    $mimemail

    A validMIMEresource.

    $msgbody
    $callbackfunc

    返回值

    没有返回值。

    参见

    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".
    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);
    ?>
    
    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:
    <?php
      $message = 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.
    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.
    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";
    }