You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加SMTP Server后网站持续加载,邮件发送无响应问题求助

问题排查与修复方案

1. 先开启错误显示,定位基础问题

脚本持续加载大概率是因为发生了致命错误但未输出,先在代码最开头添加错误输出代码:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 原代码后续内容...

这样能直接看到脚本执行中的错误,比如SQL语法错误、变量未定义等核心问题。

2. 修复SQL语句的安全与稳定性问题

当前代码直接将用户传入的$flightId拼入SQL,存在注入风险,且空值/非法值会导致SQL报错,卡住脚本。所有SQL查询必须使用WordPress的$wpdb->prepare方法:

修复捐赠者邮箱查询语句:

$prayers = $wpdb->get_results(
    $wpdb->prepare("SELECT * FROM $prayerTable WHERE `flight_id` = %d", $flightId)
);
$moneys = $wpdb->get_results(
    $wpdb->prepare("SELECT * FROM $moneyTable WHERE `flight_id` = %d", $flightId)
);

修复航班信息查询语句:

$flights = $wpdb->get_results(
    $wpdb->prepare("SELECT * FROM $flightTable WHERE `flight_id` = %d", $flightId)
);
// 先判断是否查询到结果,避免空数组报错
if (empty($flights)) {
    echo "未找到对应航班";
    exit;
}
$flight_title = $flights[0]->flight_title;

修复通知插入语句:

$insertNotification = $wpdb->query(
    $wpdb->prepare(
        "INSERT INTO $notificationTable (`flight_title`, `notification_subject`, `notification_message`) VALUES (%s, %s, %s)",
        $flight_title, $emailDatas[0], $emailDatas[1]
    )
);

3. 修复PHPMailer配置与超时问题

SMTP连接超时是页面持续加载的常见原因,同时当前依赖数组索引获取配置的方式极不稳定:

3.1 改用键值对获取配置(避免索引依赖)

假设你的flight_funders_settings表有setting_name字段(比如smtp_host、smtp_port等),先将配置转为键值对:

$settings = [];
$settingRows = $wpdb->get_results("SELECT setting_name, settings_value FROM $settingsTable");
foreach ($settingRows as $row) {
    $settings[$row->setting_name] = $row->settings_value;
}
// 之后用键名调用,比如:
$mail->Host = $settings['smtp_host'];
$mail->Port = $settings['smtp_port'];
$mail->Username = $settings['smtp_username'];
$mail->Password = $settings['smtp_password'];

3.2 添加SMTP超时与调试

$mail = new PHPMailer(); 
$mail->IsSMTP(); 
$mail->SMTPAuth = true; 
$mail->SMTPSecure = 'tls'; 
$mail->Host = $settings['smtp_host'];
$mail->Port = $settings['smtp_port']; 
// 添加超时设置,避免无限等待
$mail->Timeout = 30;
// 开启调试模式(测试完成后关闭),查看SMTP连接日志
$mail->SMTPDebug = 2;
$mail->IsHTML(true);
$mail->CharSet = 'UTF-8';
$mail->Username = $settings['smtp_username'];
$mail->Password = $settings['smtp_password'];
$mail->SetFrom($settings['smtp_username']);

4. 修复邮件内容的依赖问题

当前$emailDatas依赖$_POST的遍历顺序,一旦表单参数顺序变化就会出错,直接使用表单字段名获取:

// 假设表单中主题字段名为email_subject,内容字段名为email_body
$emailSubject = $_POST['email_subject'];
$emailBody = $_POST['email_body'];
// 替换原代码中的$emailDatas[0]和$emailDatas[1]
$mail->Subject = $emailSubject;
$mail->Body = $emailBody;
// 插入通知时也用对应变量
$insertNotification = $wpdb->query(
    $wpdb->prepare(
        "INSERT INTO $notificationTable (`flight_title`, `notification_subject`, `notification_message`) VALUES (%s, %s, %s)",
        $flight_title, $emailSubject, $emailBody
    )
);

5. 优化邮件发送失败的反馈

当前只输出"Sorry",可以加上PHPMailer的错误信息,方便排查:

if(!$mail->Send()){
    echo "发送失败:" . $mail->ErrorInfo;
}

内容的提问来源于stack exchange,提问作者Neel Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:01:24