添加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
相关产品推荐
相关产品推荐

