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

用 PHP 發送 MIME 郵件(三):MIME_mail 類別架構與建構子設計

     編輯:PHP 相關知識

有了 MIME 基礎知識,現在正式建構 MIME_mail 類別。本文介紹類別的公開/私有屬性、建構子參數處理,以及內部陣列 $mimeparts 的角色定位。

類別屬性總覽

公開屬性(可由外部直接存取)

屬性說明
$to收件人地址,支援多筆以逗號分隔
$from寄件人地址
$subject郵件主旨
$body郵件主體內容(純文字或 HTML)
$headers額外郵件標頭(如 X-Mailer, X-Priority),字串或陣列
$errstr錯誤訊息,供呼叫端檢查
$base64_func自訂 Base64 編碼函式,空值則用內建 base64_encode()
$qp_func自訂 Quoted-Printable 編碼函式,PHP 核心無內建,需自行實作或引用 imap 擴充
$mailer指定替代郵件發送物件(如 SMTP 類別),空則用 PHP mail()

私有屬性(僅內部使用)

var $mimeparts = array();  // 存放各 MIME 區段(含標頭+內容)

注意: 切勿在類別外部直接操作 $mimeparts,以免破壞郵件結構完整性。

建構子 MIME_mail() 詳細解析

function MIME_mail($from="", $to="", $subject="", $body="", $headers = "") {
    $this->to      = $to;
    $this->from    = $from;
    $this->subject = $subject;
    $this->body    = $body;

    // 標頭陣列轉字串
    if (is_array($headers)) {
        $headers = (sizeof($headers) > 1) ? join(CRLF, $headers) : $headers[0];
    }

    // 若指定 $from,移除 $headers 中既有的 From: 標頭避免重複
    if ($from) {
        $headers = preg_replace("!(from: ?.+?[ ]?\r\n)!i", "", $headers);
    }
    $this->headers = chop($headers);

    // 索引 0 預留給主體(BODY),先放入空字串佔位
    $this->mimeparts[] = "";
    return;
}

設計考量重點

  1. 參數彈性: 所有參數皆為選填,支援實例化後再逐一設定屬性。
  2. 標頭去重: 自動移除外部傳入的 From:,避免郵件標頭重複導致郵件伺服器拒收。
  3. CRLF 常數: 程式碼中使用 CRLF 常數(定義於 .def 檔),確保跨平台換行一致性。
  4. mimeparts[0] 佔位: 索引 0 固定留給郵件主體(文字或 HTML 版本),後續 attach() 新增的附件從索引 1 開始,方便 build_message() 依序組裝。

常數定義檔(.def)範例

define("CRLF", "\r\n");
define("OCTET", "application/octet-stream");
define("TEXT", "text/plain");
define("BASE64", "base64");
define("BIT7", "7bit");
define("QP", "quoted-printable");
define("INLINE", "inline");
define("ATTACH", "attachment");
define("BODY", "BODY_PART_MARKER");  // 特殊標記,非實際標頭值
define("CHARSET", "us-ascii");

實例化範例

require_once "MIME_mail.class.php";
require_once "MIME_mail.def.php";

$mail = new MIME_mail(
    "sender@example.com",
    "recipient@example.com",
    "測試 MIME 郵件",
    "這是純文字版本內容",
    array("X-Mailer: MyApp 1.0", "X-Priority: 3")
);

$mail->attach("<h1>HTML 版本</h1>", BODY, "text/html", BASE64, INLINE);
$mail->fattach("/path/to/report.pdf", "月報表", "application/pdf", BASE64, ATTACH);
$mail->send_mail();

建構子奠定了整個郵件物件的基礎骨架,下一篇將探討 build_message() 如何將 $mimeparts 串接成完整的 RFC 822 郵件字串,以及 send_mail() 的發送細節與 SMTP 替代方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved