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;
}
$GLOBALS['_CFG'] 讀取,後台可視化維護,避免硬編碼。ErrorInfo 寫入系統錯誤日誌,便於排查。SMTPSecure 即可滿足主流郵件商加密要求。includes/phpmailer/ 目錄。cls_smtp 調用處(通常在 include/lib_base.php 或 include/lib_main.php)。改用 PHPMailer 後,ECShop 郵件送達率顯著提升,且後續維護成本極低,強烈建議所有 ECShop 站點遷移至此方案。