使用PHPMailer发送邮件无报错但未收到邮件求助
问题排查与修复方案
从你的代码来看,虽然点击提交后弹出了成功提示,但收不到邮件的核心原因是PHPMailer未配置SMTP服务器,同时缺少错误捕获机制——你根本看不到发送失败的真实原因。下面一步步帮你解决问题:
1. 配置SMTP服务器(核心修复)
PHPMailer默认会尝试使用PHP内置的mail()函数,但大多数共享主机或本地环境都没有正确配置邮件发送服务,导致邮件被直接丢弃或无法送达。你必须明确配置SMTP参数,比如使用主机提供商提供的SMTP服务,或者第三方邮箱(如Gmail,注意Gmail需启用应用密码)。
修改PHPMailer初始化部分的代码,添加SMTP配置:
$mail = new PHPMailer; // 启用SMTP模式 $mail->isSMTP(); // 填写你的SMTP服务器地址(比如主机商提供的smtp.yourdomain.com,或Gmail的smtp.gmail.com) $mail->Host = 'smtp.yourhost.com'; // SMTP端口(587对应TLS加密,465对应SSL加密,根据服务商要求选) $mail->Port = 587; // 启用加密方式 $mail->SMTPSecure = 'tls'; // 开启SMTP认证 $mail->SMTPAuth = true; // SMTP登录用户名(你的邮箱地址) $mail->Username = 'your-email@xxx.com'; // SMTP登录密码(Gmail需用应用密码,普通邮箱填登录密码) $mail->Password = 'your-email-password'; // 保留你原来的代码 $mail->setFrom('xxxx@xxx.com','xxxx'); $mail->addAddress($email); $mail->isHTML(true); $mail->Subject = 'Room Enquiry Form'; $mail->Body = $full_message;
2. 添加错误捕获,查看真实失败原因
你的代码只处理了发送成功的情况,失败时没有任何提示,这会让你误以为发送成功。修改代码,添加错误输出:
if ($mail->send()){ unset($_SESSION['checkin']); unset($_SESSION['checkout']); unset($_SESSION['room']); unset($_SESSION['guest']); session_destroy(); echo 1; } else { // 输出PHPMailer的错误信息,方便精准排查 echo "邮件发送失败: " . $mail->ErrorInfo; }
这样如果发送失败,你就能看到具体问题,比如SMTP认证失败、端口被防火墙拦截等。
3. 修复表单验证的小bug
在手机号验证的分支里,提示文字写错了,重复了邮箱的提示,改成:
elseif(empty($mob)){ echo "Please Enter Mobile No."; }
4. 额外建议:检查SESSION变量有效性
虽然这不是收不到邮件的直接原因,但为了避免SESSION变量缺失导致邮件内容异常,建议在使用SESSION前添加检查:
// 检查关键预订信息是否存在 if(!isset($_SESSION['checkin']) || !isset($_SESSION['checkout']) || !isset($_SESSION['room']) || !isset($_SESSION['guest'])){ echo "缺少预订信息,请重新选择房间与日期。"; exit; }
测试时,先根据错误提示调整SMTP配置——比如用Gmail的话,需要开启两步验证并创建应用密码,同时确保你的主机允许连接外部SMTP服务器。
内容的提问来源于stack exchange,提问作者Chandan Jha
相关产品推荐
相关产品推荐

