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

PHPMailer邮件发送异常求助:表单提交后无法接收邮件

PHPMailer邮件发送异常排查与修复

核心问题定位

从你提供的代码来看,导致邮件无法发送的关键问题集中在以下几点:

1. 非法表单字段引用

  • PHP代码中调用了$_POST['name']和$_POST['subject'],但你的HTML表单里没有这两个字段,会触发PHP警告,直接中断邮件发送流程。
  • addReplyTo方法的第二个参数应使用用户的全名($_POST['first-name'] . ' ' . $_POST['surname']),而非不存在的$_POST['name']。
  • 邮件主题$mail->Subject无对应表单字段,需补充或设置默认值。

2. SMTP服务器配置有效性

你使用localhost:25作为SMTP服务器,需确认:

  • 服务器是否安装并运行了邮件服务(如Postfix、Sendmail)
  • 25端口是否未被防火墙拦截
  • 本地邮件服务是否允许匿名发送(对应你设置的SMTPAuth = false)

3. 反馈逻辑缺失

当前PHP处理完发送后直接跳转首页,未携带状态参数,导致HTML中的成功/错误提示无法触发,你无法直观判断发送结果。

4. HTML格式风险

手动拼接HTML表格时未转义用户输入,若用户输入包含<、>等特殊字符,会破坏HTML结构,可能被邮件服务器判定为垃圾邮件。

修复后的PHP代码

<?php
require 'vendor/autoload.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

// 改用存在的表单字段判断提交状态
if (isset($_POST['first-name']) && isset($_POST['email'])) {
    try {
        // 转义用户输入,避免HTML注入和格式错误
        $firstName = htmlspecialchars($_POST['first-name']);
        $surname = htmlspecialchars($_POST['surname']);
        $email = htmlspecialchars($_POST['email']);
        $phone = htmlspecialchars($_POST['phone-number']);
        $country = htmlspecialchars($_POST['country']);
        $state = htmlspecialchars($_POST['state']);
        $company = htmlspecialchars($_POST['company-name'] ?? '');
        $hearAbout = htmlspecialchars($_POST['how-did-you-hear-about-us'] ?? '');
        $projectDesc = nl2br(htmlspecialchars($_POST['tell-us-about-your-project'] ?? ''));

        // 构建HTML表格
        $html = "<table border='1' cellpadding='8' cellspacing='0'>";
        $html .= '<tbody>';
        $html .= '<tr><th>Full Name: </th><td>' . $firstName . ' ' . $surname . '</td></tr>';
        $html .= '<tr><th>Email: </th><td>' . $email . '</td></tr>';
        $html .= '<tr><th>Phone Number: </th><td>' . $phone . '</td></tr>';
        $html .= '<tr><th>Country: </th><td>' . $country . '</td></tr>';
        $html .= '<tr><th>State / Province: </th><td>' . $state . '</td></tr>';
        $html .= '<tr><th>Company Name: </th><td>' . $company . '</td></tr>';
        $html .= '<tr><th>How Did You Hear About Us?: </th><td>' . $hearAbout . '</td></tr>';
        $html .= '<tr><th>Tell Us About Your Project: </th><td>' . $projectDesc . '</td></tr>';
        $html .= '</tbody></table>';

        // SMTP配置
        $mail->isSMTP();
        $mail->SMTPDebug = SMTP::DEBUG_SERVER; // 开启调试,查看服务器交互日志
        $mail->Host = 'localhost';
        $mail->Port = 25;
        $mail->SMTPAuth = false;
        $mail->SMTPSecure = false;
        $mail->SMTPAutoTLS = false;

        // 邮件基础信息
        $mail->setFrom('demo@demo.com', 'Contact Form');
        $mail->addAddress('demo@demo.com');
        $mail->isHTML(true);
        $mail->addReplyTo($email, $firstName . ' ' . $surname);
        $mail->Subject = 'New Contact Form Submission from ' . $firstName . ' ' . $surname;
        $mail->Body = $html;

        // 发送邮件
        $mail->send();

        // 携带成功状态跳转
        header('Location: https://www.demo.com/?email=send&status=ok');
        exit;
    } catch (Exception $e) {
        // 携带错误状态跳转
        header('Location: https://www.demo.com/?email=send&status=no');
        // 调试时可取消注释查看错误详情
        // echo '发送失败: ' . $mail->ErrorInfo;
        exit;
    }
}
?>

额外排查步骤

  1. 查看SMTP调试日志:保留SMTPDebug = SMTP::DEBUG_SERVER,临时注释跳转代码,提交表单后查看PHP页面输出,确认SMTP服务器是否正常响应。
  2. 检查服务器邮件日志:若使用本地邮件服务,查看服务器日志(如Postfix的/var/log/mail.log),确认邮件是否被接收、转发或拒绝。
  3. 测试端口连通性:在服务器上执行telnet localhost 25,验证25端口是否可访问。
  4. 检查垃圾邮件文件夹:部分邮件会被收件方垃圾过滤器拦截,优先排查该目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:55:54