PHPMailer配置异常:联系表单数据无法发送至Outlook邮箱
问题排查与修复方案
你的代码存在几个关键问题导致邮件无法送达,具体如下:
核心错误点
- SMTP与Sendmail模式冲突:你先启用了SMTP模式(
$mail->IsSMTP();),随后又调用$mail->IsSendmail();强制切换到Sendmail模式,直接导致SMTP配置失效,必须删除$mail->IsSendmail();这一行。 - 表单编码冗余:表单没有文件上传需求,却设置了
enctype="multipart/form-data",会干扰PHP对POST数据的解析,建议移除该属性。 - 错误信息缺失:当前仅提示"Mail Not Sent",无法获取具体失败原因,应使用
$mail->ErrorInfo输出详细错误日志,便于排查。 - PHPMailer依赖不全:旧版PHPMailer使用SMTP时需要同时引入
class.smtp.php,否则会出现SMTP功能缺失问题,需确保该文件存在并正确引入。
修正后的完整代码
PHP部分
<?php require 'PHPMailer/class.phpmailer.php'; require 'PHPMailer/class.smtp.php'; // 新增SMTP类引入 if(isset($_POST['submit'])){ // 基础输入过滤,增强安全性 $name = htmlspecialchars($_POST['name']); $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); $subject = htmlspecialchars($_POST['subject']); $phone = htmlspecialchars($_POST['phone']); $text = htmlspecialchars($_POST['text']); $body = " <h3>联系表单数据</h3><br> 姓名 * = $name<br> 邮箱 * = $email<br> 主题 = $subject<br> 电话 = $phone<br> 留言 = $text<br> "; try { $mail = new PHPMailer(true); // SMTP核心配置 $mail->isSMTP(); $mail->SMTPAuth = true; $mail->Port = 587; $mail->Host = "smtp-mail.outlook.com"; $mail->Username = "name@domain.co.uk"; // 替换为你的Outlook邮箱 $mail->Password = "password"; // 替换为你的邮箱密码/应用密码 $mail->SMTPSecure = 'tls'; $mail->SMTPDebug = 2; // 开启详细调试,排查完成后改为0 // 邮件内容配置 $mail->setFrom("name@domain.co.uk", "联系表单"); $mail->addAddress("name@domain.co.uk"); // 收件邮箱 $mail->isHTML(true); $mail->Subject = "新的联系表单提交"; $mail->Body = $body; $mail->AltBody = strip_tags($body); $mail->send(); echo '<script>alert("感谢您的留言,我们会尽快回复您!");</script>'; } catch (Exception $e) { echo "邮件发送失败: " . $mail->ErrorInfo; } } ?>
HTML表单部分
<form action="contact.php" method="POST"> <div class="row"> <div class="col-sm-6 mb-5"> <label class="form-label"> 你的姓名 <span class="text-danger-alt">*</span> </label> <div class="input-group form"> <input class="form-control" type="text" name="name" placeholder="请输入全名" required> </div> </div> <div class="col-sm-6 mb-5"> <label class="form-label"> 你的邮箱 <span class="text-danger-alt">*</span> </label> <div class="input-group form"> <input class="form-control" type="email" name="email" placeholder="请输入邮箱" required> </div> </div> <div class="col-sm-6 mb-5"> <label class="form-label"> 留言主题 </label> <div class="input-group form"> <input class="form-control" type="text" name="subject" placeholder="请输入主题"> </div> </div> <div class="col-sm-6 mb-5"> <label class="form-label"> 你的电话 </label> <div class="input-group form"> <input class="form-control" type="text" name="phone" placeholder="请输入电话"> </div> </div> <div class="col-12"> <label class="form-label"> 留言内容 <span class="text-danger-alt">*</span> </label> <div class="input-group form mb-5"> <textarea class="form-control" rows="6" name="text" placeholder="请输入留言内容" required></textarea> </div> </div> <div class="col"> <div class="text-center"> <button type="submit" name="submit" class="btn btn-primary btn-wide">发送留言</button> </div> </div> </div> </form>
额外注意事项
- 若Outlook账号开启了两步验证,需使用应用密码代替普通密码登录SMTP。
- 确保服务器的587端口未被防火墙封禁。
- 调试完成后将
SMTPDebug设置为0,避免向用户暴露敏感调试信息。
内容的提问来源于stack exchange,提问作者Kalyan Paul
相关产品推荐
相关产品推荐

