2024 年 PHP Conference Japan

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 則筆記

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 返回
[起始位置] => 0
[起始位置-主體] => 1412
[結束位置] => 14989
[結束位置-主體] => 14989

除非我又遺漏了什麼,這裡有個錯誤,因為結束位置與結束位置-主體相同,所以它不會乾淨地切割內容,留下

------=_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