mailparse_msg_extract_part

(PECL mailparse >= 0.9.0)

mailparse_msg_extract_part提取/解码消息部分

说明

mailparse_msg_extract_part(resource $mimemail, string $msgbody, callable $callbackfunc = ?): void
警告

此函数目前没有文档;只有它的参数列表可用。

参数

mimemail

一个有效的 MIME 资源。

msgbody

callbackfunc

返回值

不返回值。

参见

添加笔记

用户贡献的笔记 6 笔记

Sbastien
3 年前
以下是一个完整的示例,用于将 ZIP 文件附件保存为其原始名称。

<?php
$email_raw
= '(原始电子邮件内容缓冲区)';
$parser = mailparse_msg_create(); // 必须在脚本结束时销毁
mailparse_msg_parse($parser, $email_raw);
$structure = mailparse_msg_get_structure($parser); // 例如 ["1", "1.1", "1.2"]
foreach ($structure as $part_label) { // 在每个电子邮件部分中搜索
$part = mailparse_msg_get_part($parser, $part_label); // 解析指定部分
$part_data = mailparse_msg_get_part_data($part); // 获取解析的部分数据、标题和元值
if ($part_data['content-type'] ?? null === 'application/zip') {
$name = $part_data['disposition-filename'] ?? $part_data['content-name'] ?? 'unknow.zip';
$contents = mailparse_msg_extract_part($part, $email_raw, null); // null 用于返回内容
file_put_contents($name, $contents);
}
}
mailparse_msg_free($parser); // 重要
marlinf {at} datashaman {dot} com
16 年前
关于前面关于回调的评论

如果明确将 NULL 指定为回调参数,则会提取、解码并返回整个部分,无需回调。
Will
17 年前
在 mailparse 版本 2.1.1(可能更早)中,当使用 mailparse_msg_extract_part() 和回调函数时,它会将传递给它的数据分成 4kB 块,并为每个块调用回调函数。例如,如果它正在提取一个 41kB 的 MIME 部分,那么你定义的回调函数将被调用 11 次,每次都传递下一个数据块。以下是一些快速简便的代码,展示了处理这种情况的一种方法

<?php
$message
= file_get_contents ("email.txt"); // 获取电子邮件。

function catch_part ($part)
{
$GLOBALS["part_data"] .= $part; // 将数据追加到之前提取的任何数据。
}

mailparse_msg_extract_part ("1.1", $message, "catch_part"); // 提取 MIME 部分 1.1
echo $GLOBALS["part_data"]; // 打印提取的部分。
?>

可能还有更好的方法来处理这个问题,但这是我想到的。
php at cdauth dot de
18 年前
substr() 使用字符串长度,而不是位置作为第三个参数。以下代码行的修正版本
<?php
$parts
[$s] = substr($file_txt, $starting_pos_body, $ending_pos_body-$starting_pos_body);
?>
匿名
5 年前
回调参数不支持闭包... :( 它会抱怨 "PHP 可捕获的致命错误:类 Closure 的对象无法转换为字符串"。
steve at tequilasolutions dot com
18 年前
除非我遗漏了什么明显的东西

get_structure 返回数组 (1,1.1,1.1.2) 等,但要获取每个部分的内容并不容易,因为 mailparse_msg_extract_part() 和 mailparse_msg_extract_part_file() 只返回所有内容。但是 get_part_data 会返回字符串偏移量,所以你知道在哪里分割消息,这样你就可以获取部分的内容。

唯一的问题是 get_part_data 返回
[starting-pos] => 0
[starting-pos-body] => 1412
[ending-pos] => 14989
[ending-pos-body] => 14989

除非我漏掉了什么东西,否则这里有一个错误,因为 ending-pos 与 ending-pos-body 相同,所以它不会干净地分割内容,会留下

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

... 作为部分内容的一部分。

$file = "..../mail"; // 你邮件的路径
$file_txt = implode("",file($file));
$parse = mailparse_msg_parse_file($file);
$structure = mailparse_msg_get_structure($parse);
// 将消息部分分割到数组中
$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); // 将数据复制到数组中
print "[".$parts[$s]."]";
print "\n------------------------------------\n";
}
To Top