首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 使用 Mail_MimeDecode 解析郵件內容完整示例

     編輯:PHP 相關知識

場景

通過 POP3/IMAP 獲取原始郵件源碼後,需解析出發件人、主題、正文(文本/HTML)、附件等結構化信息。PEAR Mail_mimeDecode 是處理 MIME 郵件的標準工具。

核心流程

  1. 連接郵箱服務器(POP3),獲取郵件列表。
  2. 逐封獲取原始源碼(getMsg)。
  3. 實例化 Mail_mimeDecode 並調用 decode()。
  4. 遍歷解碼結構提取:Headers、Body(優先 text/plain、再 text/html)、Attachments。
  5. 編碼轉換(Base64/Quoted-Printable → UTF-8)。
  6. 業務處理(入庫、回覆、標記已讀/刪除)。

關鍵代碼片段(one_mail 方法)

<?php
function one_mail($msgId, $pop3) {
    // 1. 獲取原始郵件源碼
    $raw = $pop3->getMsg($msgId);

    // 2. MIME 解碼
    $decoder = new Mail_mimeDecode($raw);
    $structure = $decoder->decode([
        'include_bodies' => true,
        'decode_bodies' => false,  // 手動處理編碼更可控
        'decode_headers' => true,
    ]);

    // 3. 提取主體部分
    $part = $structure->parts ? $structure->parts[0] : $structure;

    // 4. 處理編碼
    $encoding = $part->headers['content-transfer-encoding'] ?? '7bit';
    $charset = $part->ctype_parameters['charset'] ?? 'ISO-8859-1';
    $body = $part->body;

    if (strtolower($encoding) === 'base64') {
        $text = base64_decode($body);
    } elseif (strtolower($encoding) === 'quoted-printable') {
        $text = quoted_printable_decode($body);
    } else {
        $text = $body;
    }
    $text = iconv($charset, 'UTF-8//IGNORE', $text);

    // 5. 解碼主題
    $subject = $structure->headers['subject'] ?? '';
    $subject = imap_mime_header_decode($subject);
    $title = '';
    foreach ($subject as $seg) {
        $title .= ($seg->charset !== 'default') ? iconv($seg->charset, 'UTF-8', $seg->text) : $seg->text;
    }

    // 6. 發件人
    $from = imap_mime_header_decode($structure->headers['from']);
    $fromStr = '';
    foreach ($from as $seg) $fromStr .= $seg->text;
    preg_match('/([\w.+-]+@[\w.-]+\.\w+)/', $fromStr, $m);
    $fromEmail = $m[1] ?? '';

    return [
        'from' => $fromEmail,
        'subject' => $title,
        'body' => $text,
        'charset' => $charset,
    ];
}

完整業務邏輯示例(簡化版)

<?php
// 配置
$host = 'pop.example.com'; $user = 'xxx'; $pass = 'xxx';
$pop3 = new Net_POP3();
if (!$pop3->connect($host, 110) || !$pop3->login($user, $pass)) die('連接失敗');

$list = $pop3->_cmdList();
$count = count($list);

for ($i = 0; $i < $count; $i++) {
    $mail = one_mail($list[$i]['msg_id'], $pop3);
    // 業務處理:入庫、自動回覆等...
    // 標記刪除
    $pop3->deleteMsg($list[$i]['msg_id']);
}
$pop3->disconnect();

常見坑點與對策

問題原因解決
中文附件名亂碼RFC 2047 編碼用 imap_mime_header_decode 解碼 content-disposition 中的 filename 參數
HTML 正文包含 CID 圖片內嵌引用解析 multipart/related 結構,下載附件並替換 src="cid:..."
編碼轉換失敗字符集聲明錯誤或不支持iconv(..., 'UTF-8//IGNORE') 忽略非法字符,或用 mb_convert_encoding 自動檢測
大郵件內存溢出一次性載入整郵件使用 IMAP 分塊獲取(imap_fetchbody),或流式解析庫

現代替代方案

PEAR 已停止維護,新項目推薦使用:

  • plancake/php-email-parser:純 PHP、Composer 安裝、支持流式解析、活躍維護。
  • zendframework/zend-mail:企業級組件,功能全面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved