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

ECShop 郵件發送失效?改用 PHPMailer 實現 SMTP 可靠投遞

     編輯:PHP 相關知識

ECShop 內建的 cls_smtp 類在執行 fgets() 讀取伺服器回應時頻繁發生超時,即便連線實際已建立,仍回報 EHLO command failed。經排查發現,原生 SMTP 實現對部分郵件伺服器(如 QQ 企業郵箱、Gmail)的協議兼容性較差。最穩妥的方案是引入成熟的 PHPMailer 库替換原發送邏輯。

核心替換代碼

function smtp_mail($name, $email, $subject, $content, $type = 1, $notification = false) {
    // 編碼轉換
    if ($GLOBALS['_CFG']['mail_charset'] != EC_CHARSET) {
        $name    = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $name);
        $subject = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $subject);
        $content = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $content);
        $shop_name = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $GLOBALS['_CFG']['shop_name']);
    }
    $charset = $GLOBALS['_CFG']['mail_charset'];

    include_once ROOT_PATH . 'includes/phpmailer/class.phpmailer.php';
    $mail = new PHPMailer();
    $mail->CharSet = $charset;
    $mail->From = $GLOBALS['_CFG']['smtp_user'];
    $mail->FromName = $GLOBALS['_CFG']['shop_name']; // 建議用配置項替換硬編碼公司名
    $mail->Subject = $subject;
    $mail->Body = $content;
    $mail->IsHTML($type);
    $mail->Encoding = 'base64';
    $mail->Timeout = 30;
    $mail->SMTPDebug = false;

    // 發送模式判斷
    if ($GLOBALS['_CFG']['mail_service'] == 0) {
        $mail->isMail(); // 使用本地 mail()
    } else {
        $mail->IsSMTP();
        $mail->Host = $GLOBALS['_CFG']['smtp_host'];
        $mail->Port = $GLOBALS['_CFG']['smtp_port'];
        $mail->SMTPAuth = !empty($GLOBALS['_CFG']['smtp_pass']);
        $mail->Username = $GLOBALS['_CFG']['smtp_user'];
        $mail->Password = $GLOBALS['_CFG']['smtp_pass'];
        // 建議啟用加密(視伺服器要求)
        // $mail->SMTPSecure = 'tls'; // 或 'ssl'
    }

    $mail->ClearAddresses();
    $mail->AddAddress($email, $name);
    $mail->ConfirmReadingTo = $notification;

    if (!$mail->Send()) {
        $GLOBALS['err']->add($mail->ErrorInfo);
        $GLOBALS['err']->add($GLOBALS['_LANG']['sendemail_false']);
        return false;
    }
    return true;
}

關鍵優化點

  • 統一配置來源:所有 SMTP 參數均從 $GLOBALS['_CFG'] 讀取,後台可視化維護,避免硬編碼。
  • 編碼自動轉換:支援 GB2312/UTF-8 等多種郵件編碼,防止中文亂碼。
  • 錯誤回饋完整:捕獲 ErrorInfo 寫入系統錯誤日誌,便於排查。
  • 支援 TLS/SSL:只需取消註釋 SMTPSecure 即可滿足主流郵件商加密要求。

部署步驟

  1. 下載 PHPMailer 並放置至 includes/phpmailer/ 目錄。
  2. 將上述函數覆蓋原 cls_smtp 調用處(通常在 include/lib_base.php 或 include/lib_main.php)。
  3. 後台「郵件服務器設置」填寫正確 SMTP 主機、端口、帳號、密碼,選擇「SSL/TLS」加密方式。
  4. 前台測試註冊、找回密碼、訂單通知等場景,確認郵件正常送達。

改用 PHPMailer 後,ECShop 郵件送達率顯著提升,且後續維護成本極低,強烈建議所有 ECShop 站點遷移至此方案。

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