PHP 8.0及以上版本邮件脚本失效问题求助
PHP 8.0+ 兼容调整:表单邮件脚本修复方案
以下是针对你的邮件脚本适配PHP 8.0及以上版本的具体修改点:
核心修改项
- 初始化
$headers变量:原代码直接使用.=拼接未定义的$headers,PHP8.0+会抛出未定义变量错误,需先初始化为空字符串。 - 移除废弃函数调用:
get_magic_quotes_gpc()在PHP5.4已废弃,PHP8.0完全移除,直接删除相关判断代码。 - 安全获取POST参数:直接访问
$_POST中不存在的键会触发警告,改用??空合并运算符处理,避免报错。 - 修正变量名错误:成功提示中误用
$first_name,实际变量为$firstname,需统一变量名。 - 可选优化邮箱验证:原正则表达式过于冗长,改用PHP内置的
filter_var()函数做邮箱验证,更可靠且兼容新版本。
修改后的完整代码
<?php if ($_SERVER['REQUEST_METHOD'] !== 'POST') exit; // 邮箱验证:改用PHP内置函数(可选,替代原正则) function isEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; } if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n"); // 安全获取POST参数,避免未定义键警告 $gender = $_POST['gender'] ?? ''; $firstname = $_POST['firstname'] ?? ''; $lastname = $_POST['lastname'] ?? ''; $street = $_POST['street'] ?? ''; $zipcode = $_POST['zipcode'] ?? ''; $place = $_POST['place'] ?? ''; $phone = $_POST['phone'] ?? ''; $email = $_POST['email'] ?? ''; $send = $_POST['send'] ?? ''; $model = $_POST['model'] ?? ''; $service = $_POST['service'] ?? ''; $serial = $_POST['serial'] ?? ''; $comments = $_POST['comments'] ?? ''; $mymail = 'XXXXXXXX'; $verify = $_POST['verify'] ?? ''; if (trim($firstname) == '') { echo '<div class="error_message">请输入姓名。</div>'; exit(); } else if (trim($email) == '') { echo '<div class="error_message">请输入邮箱。</div>'; exit(); } else if (!isEmail($email)) { echo '<div class="error_message">请输入有效的邮箱地址。</div>'; exit(); } if (trim($comments) == '') { echo '<div class="error_message">请输入故障描述。</div>'; exit(); } // 移除get_magic_quotes_gpc相关代码(该函数已废弃) $address = "XXXXXXXX"; $e_subject = '维修申请来自 ' . $firstname . ' ' . $lastname . '.'; $e_body = "XXXXXXX" . PHP_EOL . PHP_EOL; $e_content = "\"$comments\"" . PHP_EOL . PHP_EOL; $e_reply = "XXX" . PHP_EOL . PHP_EOL; $msg = wordwrap($e_body . $e_content . $e_reply, 70); // 初始化headers变量 $headers = ""; $headers .= "From: $mymail" . PHP_EOL; $headers .= "Reply-To: $email" . PHP_EOL; $headers .= "MIME-Version: 1.0" . PHP_EOL; $headers .= "Content-type: text/plain; charset=utf-8" . PHP_EOL; $headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL; if (mail($address, $e_subject, $msg, $headers)) { header("Location: XXXXXXXXXX", true, 301); exit(); // 以下代码在header跳转后不会执行,可按需保留或删除 echo "<fieldset>"; echo "<div id='success_page'>"; echo "<h1>邮件发送成功。</h1>"; echo "<p>感谢 <strong>$firstname</strong>,我们已收到您的邮件,将尽快与您联系。</p>"; echo "</div>"; echo "</fieldset>"; } else { echo '发送失败,请联系 repairs@mysoundrepair.com'; } ?>
额外说明
- 原代码中
header()跳转后的echo内容永远不会执行,因为exit()会终止脚本,可根据需求删除该部分冗余代码。 - 若需要保留原邮箱正则验证,可保留原
isEmail函数,但推荐使用内置filter_var更简洁可靠。
内容的提问来源于stack exchange,提问作者Dion Maurice
相关产品推荐
相关产品推荐

