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

ECShop 整合 PHPMailer 實現 SMTP 郵件發送:解決原生 SMTP 逾時問題

     編輯:PHP 相關知識

ECShop 整合 PHPMailer 實現 SMTP 郵件發送:解決原生 SMTP 逾時問題

ECShop 內建的 cls_smtp 類在某些伺服器環境下會出現 fgets() 逾時或 EHLO command failed 錯誤,導致郵件無法發送。本文提供將 ECShop 郵件發送核心替換為 PHPMailer 的完整解決方案,穩定可靠且支援更豐富的郵件功能。

問題背景

在 cls_smtp 類的 get_data() 方法中,執行 fgets($this->connection, 512) 時頻繁發生逾時。註釋該行後又回報 ehlo command failed,但連線測試實際是通的。同環境下其他程式使用 PHPMailer 發信正常,因此決定替換核心發信邏輯。

解決方案:重寫 smtp_mail() 函數

修改 includes/lib_base.php 或相關郵件發送檔案中的 smtp_mail() 函數:

<?php
/**
 * 使用 PHPMailer 發送郵件(替換 ECShop 原生 SMTP)
 * @param string $name      收件人姓名
 * @param string $email     收件人郵箱
 * @param string $subject   郵件主題
 * @param string $content   郵件內容(HTML)
 * @param int    $type      內容類型:1=HTML, 0=純文本
 * @param bool   $notification 是否要求回執
 * @return bool
 */
function smtp_mail($name, $email, $subject, $content, $type = 1, $notification = false)
{
    global $_CFG, $_LANG, $err;

    // 字元編碼轉換
    if ($_CFG['mail_charset'] != EC_CHARSET) {
        $name      = ecs_iconv(EC_CHARSET, $_CFG['mail_charset'], $name);
        $subject   = ecs_iconv(EC_CHARSET, $_CFG['mail_charset'], $subject);
        $content   = ecs_iconv(EC_CHARSET, $_CFG['mail_charset'], $content);
        $shop_name = ecs_iconv(EC_CHARSET, $_CFG['mail_charset'], $_CFG['shop_name']);
    }
    $charset = $_CFG['mail_charset'];

    // 載入 PHPMailer(需先將 PHPMailer 放入 includes/phpmailer/ 目錄)
    include_once ROOT_PATH . 'includes/phpmailer/class.phpmailer.php';
    $mail = new PHPMailer();

    // 寄件人設定
    $mail->From       = $_CFG['smtp_user'];
    $mail->FromName   = '您的店鋪名稱'; // 建議從後台設定讀取
    $mail->CharSet    = $charset;
    $mail->Encoding   = 'base64';
    $mail->IsHTML($type);
    $mail->Subject    = $subject;
    $mail->Body       = $content;
    $mail->Timeout    = 30;
    $mail->SMTPDebug  = false; // 生產環境關閉除錯
    $mail->ClearAddresses();
    $mail->AddAddress($email, $name);
    $mail->ConfirmReadingTo = $notification;

    // 郵件發送模式判斷
    if ($_CFG['mail_service'] == 0) {
        // 使用 PHP mail() 函數
        $mail->isMail();
    } else {
        // 使用 SMTP
        $mail->IsSMTP();
        $mail->Host       = $_CFG['smtp_host'];
        $mail->Port       = $_CFG['smtp_port'];
        $mail->SMTPAuth   = !empty($_CFG['smtp_pass']);
        $mail->Username   = $_CFG['smtp_user'];
        $mail->Password   = $_CFG['smtp_pass'];
        $mail->SMTPSecure = 'tls'; // 或 ssl,視郵箱服務商而定
    }

    // 發送並處理結果
    $result = $mail->Send();
    if (!$result) {
        $err->add($mail->ErrorInfo);
        $err->add($_LANG['sendemail_false']);
        return false;
    }
    return true;
}
?>

部署步驟

  1. 下載 PHPMailer:從 GitHub 獲取最新版,解壓後將 class.phpmailer.php、class.smtp.php、PHPMailerAutoload.php 放入 includes/phpmailer/ 目錄
  2. 修改郵件發送函數:按上述代碼替換原有 smtp_mail() 實現
  3. 後台配置 SMTP 參數:在 ECShop 後台「郵件服務器設定」填寫正確的 SMTP 主機、埠號、帳號、密碼、加密方式
  4. 測試發送:後台「郵件隊列」或會員註冊、訂單通知等場景驗證

關鍵優勢