PHP联系表单突发故障停止发送邮件求助
问题诊断与修复方案
先看你PHP代码里的几个明显语法错误,这大概率是导致邮件发送失败的核心原因——哪怕你恢复了旧版本,可能不小心带了这些错误:
1. 邮件内容的换行符语法错误
在$emailBody里,"Phone: $phone 'n"这里用了单引号的'n,正确的换行符应该是转义的\n。这个错误会直接导致PHP解析脚本失败,中断执行,自然发不出邮件。
2. 邮件头格式不符合标准
Reply to的写法不规范,邮件标准里应该是Reply-To:(注意大写字母和冒号),原代码的写法会被邮件服务器识别为无效头,可能导致邮件被拒收或发送失败。
3. 缺少错误检查与基础验证
你既没有检查mail()函数的执行结果,也没有对表单字段做基础验证(比如必填字段是否为空、邮箱格式是否正确),这不仅容易出错,也没法快速定位问题所在。
修正后的PHP代码
<?php // 先确认是POST请求再处理 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取表单数据并做基础过滤 $name = trim($_POST['name'] ?? ''); $email = trim($_POST['email'] ?? ''); $phone = trim($_POST['phone'] ?? ''); $message = trim($_POST['message'] ?? ''); // 基础表单验证 $errors = []; if (empty($name)) $errors[] = "请填写您的姓名"; if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "请填写有效的邮箱地址"; if (empty($message)) $errors[] = "请填写您的留言内容"; if (!empty($errors)) { // 把错误信息存入session,返回表单页提示用户 session_start(); $_SESSION['form_errors'] = $errors; header("Location: index.php"); exit; } $emailFrom = 'myemail@gmail.com'; $emailSubject = 'New Form Submission'; // 修复换行符错误 $emailBody = "Name: $name.\nEmail: $email.\nPhone: $phone\nMessage: $message."; $to = 'myemail@gmail.com'; // 修复Reply-To头格式,加上编码声明让邮件显示更规范 $headers = "From: $emailFrom\r\n"; $headers .= "Reply-To: $email\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; // 检查邮件发送结果 if (mail($to, $emailSubject, $emailBody, $headers)) { session_start(); $_SESSION['form_success'] = "留言发送成功!我会尽快回复您。"; header("Location: index.php"); } else { session_start(); $_SESSION['form_errors'] = ["邮件发送失败,请稍后再试或通过其他方式联系我。"]; header("Location: index.php"); } exit; } else { // 非POST请求直接跳回表单页 header("Location: index.php"); exit; } ?>
主机/服务器层面的排查步骤
如果修复代码后还是无法发送,那可能是主机配置问题,可以按以下步骤排查:
- 检查
mail()函数是否被禁用:创建一个phpinfo.php文件,内容为<?php phpinfo(); ?>,上传到主机后访问,搜索mail相关配置,查看sendmail_path是否为空,或者主机是否禁用了该函数。很多共享主机为了防垃圾邮件,默认禁用mail(),需要改用SMTP方式发送。 - 查看服务器错误日志:大部分主机控制面板(比如cPanel)里有错误日志选项,查看最近的PHP错误日志,找有没有和邮件发送相关的报错(比如权限问题、sendmail配置错误)。
- 尝试用SMTP替代原生
mail():如果mail()确实无法使用,建议用PHPMailer或SwiftMailer这类库,通过SMTP发送(比如用你的Gmail账号,注意需要开启应用专用密码)。 - 检查垃圾邮件文件夹:有时候邮件其实发送成功了,但被收件箱判定为垃圾邮件,先去垃圾邮件里确认一下。
另外,你可以给HTML表单的必填字段加上required属性,做一层前端验证:
<input type="text" name="name" class="form-control" placeholder="Your Name *" required/> <input type="text" name="email" class="form-control" placeholder="Your Email *" required/> <textarea name="message" class="form-control" placeholder="Your Message *" style="width: 100%; height: 150px" required></textarea>
这样用户提交前会被浏览器提示填写必填字段,减少无效请求。
内容的提问来源于stack exchange,提问作者Sam Donaghy-Bell
相关产品推荐
相关产品推荐

