在開發基於 Socket 的 SMTP 郵件發送類時,即時觀察客戶端指令與伺服器回應對於排錯至關重要。本文介紹一個通用的除錯顯示函數 show_debug(),能清晰區分「發送指令」與「接收回應」,並以灰色字體輸出於瀏覽器,不干擾正常頁面佈局。
function show_debug($message, $inout) {
if ($this->debug) {
// 區分方向:in=伺服器回應, out=客戶端指令
$prefix = ($inout == "in") ? "<< " : ">> ";
// 確保以 HTML 換行結尾
if (!preg_match("/\n$/", $message)) {
$message .= "<br>";
}
$message = nl2br($message);
// 輸出灰色除錯資訊
echo "<font color=#999999>{$prefix}{$message}</font>";
}
}
$inout 為 "in" 時顯示 << 表示伺服器回應;為 "out" 時顯示 >> 表示發送指令,一眼即可辨識通訊流向。nl2br() 將所有換行符轉為 <br>,確保在瀏覽器中正確換行顯示。$this->debug == true 時輸出,生產環境可關閉避免資訊洩露。#999999)與主內容區分,不影響頁面視覺設計。在 do_command() 等核心通訊函數中,於 fputs() 發送指令前、fgets() 接收回應後分別呼叫 show_debug(),即可建立完整的 SMTP 交互日誌:
$this->show_debug($command, "out"); // 記錄發送指令
fputs($this->fp, $command);
$response = fgets($this->fp, 512);
$this->show_debug($response, "in"); // 記錄伺服器回應
date('H:i:s.u') 精確到微秒,分析網路延遲。debug.log 供事後分析。AUTH LOGIN 過程)。良好的除錯機制是 Socket 程式開發的基石。show_debug() 以極簡代碼實現了通訊過程的可視化,大幅降低 SMTP 協議實作的排錯難度,是郵件發送類不可或缺的元件。