PHP Conference Japan 2024

mailparse_msg_extract_part

(PECL mailparse >= 0.9.0)

mailparse_msg_extract_part提取/解码邮件部分

描述

mailparse_msg_extract_part(资源 $mimemail, 字符串 $msgbody, 可调用 $callbackfunc = ?):
警告

此函数目前没有文档;仅提供其参数列表。

参数

mimemail

有效的 MIME 资源。

msgbody

callbackfunc

返回值

不返回值。

参见

添加注释

用户贡献的注释 6 个注释

5
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); // 重要
0
marlinf {at} datashaman {dot} com
16 年前
关于先前关于回调的评论

如果将 NULL 显式指定为回调参数,则会提取、解码并返回完整的节,而无需回调。
0
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"]; // 打印提取的部分。
?>

可能还有更好的方法来处理这个问题,但这正是我想到的。
0
php at cdauth dot de
18 年前
substr() 使用字符串长度,而不是位置作为第三个参数。以下代码行的更正版本
<?php
$parts
[$s] = substr($file_txt, $starting_pos_body, $ending_pos_body-$starting_pos_body);
?>
-1
匿名用户
5 年前
回调参数不支持闭包... :( 它会报错“PHP 可捕获致命错误:无法将 Closure 类对象转换为字符串”。
-3
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 "部分 $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