有了 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;
}
From:,避免郵件標頭重複導致郵件伺服器拒收。CRLF 常數(定義於 .def 檔),確保跨平台換行一致性。attach() 新增的附件從索引 1 開始,方便 build_message() 依序組裝。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 替代方案。