decode_mail 類別主要方法:
decode($head, $body, $content_num = -1):主入口,$head、$body 為字串陣列(各行一元素),$content_num 指定只解析第 N 部分(-1 為全部)。decode_head():解析標頭,提取 From、To、Date、Subject、Content-Type、boundary 等。decode_body():根據標頭資訊解析主體,支援單一與多部分。decode_mult():遞迴解析多部分郵件。decode_mime():上篇介紹的標頭編碼解碼。var $from_name, $to_name, $mail_time, $from_mail, $to_mail;
var $reply_to, $cc_to, $subject;
var $body = array(); // 解碼後主體陣列,每元素含 type, name, content_id, char_set, size, content
var $body_type, $boundary, $body_code_type, $body_char_set;
=? 呼叫 decode_mime,再以 : 分割欄位名與值,用 switch 處理各欄位。Date 轉為 Unix timestamp;Content-Type 判斷是否 multipart 並提取 boundary/ charset/ encoding。implode 合併主體行,依 body_code_type 呼叫 base64_decode 或 quoted_printable_decode。decode_mult,以 boundary 為分隔遞迴處理。每部分再解析其標頭(Content-Type, Content-Transfer-Encoding, Content-Disposition, name, charset, Content-ID),取得內容後依編碼解碼。$this->body[$index] 包含 type、name、content_id、char_set、size、content。<?php
require_once 'pop3_class.php'; // 假設已有 POP3 收信類
require_once 'decode_mail.php'; // 本類別
$pop = new POP3('pop.163.com', 110, 'user', 'pass');
$pop->connect();
$mail = $pop->getMail(1); // 取得第 1 封郵件,回傳 [head, body] 陣列
$decoder = new decode_mail();
if ($decoder->decode($mail['head'], $mail['body'])) {
echo "主旨: " . $decoder->subject . "<br>";
echo "寄件者: " . $decoder->from_name . " <" . $decoder->from_mail . "><br>";
echo "時間: " . date('Y-m-d H:i:s', $decoder->mail_time) . "<br>";
foreach ($decoder->body as $part) {
echo "<h3>部分: {$part['name']} ({$part['type']})</h3>";
if (strpos($part['type'], 'text/') === 0) {
echo "<pre>" . htmlspecialchars($part['content']) . "</pre>";
} else {
echo "附件/非文字內容,大小: {$part['size']} bytes<br>";
}
}
} else {
echo "解碼失敗: " . $decoder->err_str;
}
?>