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

PHPMailer联系表单提交失败:contact.php无错误返回求助

问题排查:PHPMailer联系表单提交失败无返回信息

当保留接收前端表单数据的代码时,提交表单报错:Error: Form submission failed and no error message returned from: contact.php;移除该代码块后,仅发送测试邮件功能正常。

现有PHP代码

<?php
//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

if(isset($_POST['submit']))
{
    $name = $_POST["name"];
    $email = $_POST["email"];
    $subject = $_POST["subject"];
    $message = $_POST["message"];


//Load Composer's autoloader
require 'PHPMailer/Exception.php';
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';

//Create an instance; passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      
    $mail->isSMTP();                                             
    $mail->Host       = 'smtp.gmail.com';                     
    $mail->SMTPAuth   = true;                                   
    $mail->Username   = 'test1@test.com';                     
    $mail->Password   = '000000000000';                                 
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;             
    $mail->Port       = 587;                                    


    $mail->setFrom('test1@test.com', 'Contactform');
    $mail->addAddress('test2@test.com', 'website mail');  


    $mail->isHTML(true);                                  
    $mail->Subject = "Sender Subject - $subject";
    $mail->Body    = "Sender Name - $name <br> Sender Email - $email <br> Sender Subject - $subject <br> Message - $message";

    $mail->send();
    echo "Your message has been sent. Thank you!";
} catch (Exception $e) {
    echo "Message could not be sent.";
}

}

?>

现有HTML表单代码

<div class="col-lg-8">
        <form action="contact.php" method="post" role="form" class="php-email-form">
          <div class="row">
            <div class="col-md-6 form-group">
              <input type="text" name="name" class="form-control" id="name" placeholder="Your Name" required>
            </div>
            <div class="col-md-6 form-group mt-3 mt-md-0">
              <input type="email" class="form-control" name="email" id="email" placeholder="Your Email" required>
            </div>
          </div>
          <div class="form-group mt-3">
            <input type="text" class="form-control" name="subject" id="subject" placeholder="Subject" required>
          </div>
          <div class="form-group mt-3">
            <textarea class="form-control" name="message" placeholder="Message" required></textarea>
          </div>
          <div class="my-3">
            <div class="loading">Loading</div>
            <div class="error-message">Message could not be sent.</div>
            <div class="sent-message">Your message has been sent. Thank you!</div>
          </div>
          <div class="text-center"><button type="submit" name="submit" value="submit">Send Message</button></div>
        </form>
      </div>

排查与解决步骤

1. 开启PHP错误输出并优化异常提示

当前异常捕获仅返回模糊提示,且SMTP调试会输出大量冗余信息,导致前端无法正常解析响应:

  • 关闭SMTP调试:将$mail->SMTPDebug = SMTP::DEBUG_SERVER;改为$mail->SMTPDebug = 0;
  • 升级错误提示:修改catch块输出具体错误信息
catch (Exception $e) {
    echo "Message could not be sent. Error: {$mail->ErrorInfo}";
}
  • 在PHP开头添加错误显示代码,快速定位语法或变量错误:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

2. 增加表单字段合法性检查

避免因未定义索引或空字段导致PHP报错,在赋值变量前添加校验:

if(isset($_POST['submit']))
{
    $required_fields = ['name', 'email', 'subject', 'message'];
    foreach($required_fields as $field) {
        if(!isset($_POST[$field]) || empty(trim($_POST[$field]))) {
            echo "Error: Missing required field - $field";
            exit;
        }
    }
    $name = trim($_POST["name"]);
    $email = trim($_POST["email"]);
    $subject = trim($_POST["subject"]);
    $message = trim($_POST["message"]);
    // 后续PHPMailer代码...
}

3. 适配前端AJAX响应格式

从表单类名php-email-form判断,前端大概率使用AJAX提交,此时需确保PHP返回纯文本或标准JSON格式,无额外输出:

  • 修改成功/失败的输出为JSON(更适配AJAX解析):
// 成功时
echo json_encode(['status' => 'success', 'message' => 'Your message has been sent. Thank you!']);
// 失败时
echo json_encode(['status' => 'error', 'message' => "Message could not be sent. Error: {$mail->ErrorInfo}"]);

4. 校验Gmail SMTP配置

使用Gmail SMTP需注意:

  • 若未开启2FA,需启用"低安全性应用访问";开启2FA后,需使用应用专用密码替代普通密码
  • 确认邮箱地址、SMTP端口(587)、加密方式(STARTTLS)配置正确

5. 检查PHPMailer文件路径

确保Exception.php、PHPMailer.php、SMTP.php的引入路径正确,若通过Composer安装PHPMailer,建议用require 'vendor/autoload.php';替代单独引入三个文件。


内容的提问来源于stack exchange,提问作者Tabish Gill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:58