PHPMailer问题:添加$_POST后无报错但发送成功却未收到邮件
问题:PHPMailer使用POST表单数据无法收到邮件,但手动赋值正常
手动设置邮件变量时,以下PHPMailer代码可正常运行,但添加$_POST获取表单数据后,虽日志显示一切正常且提示“Message has been sent”,却始终无法收到邮件(已尝试两个不同收件地址以排除入站服务器问题)。
代码示例
<?php require("PHPMailer-master/src/PHPMailer.php"); require("PHPMailer-master/src/SMTP.php"); require_once 'PHPMailer-master/src/Exception.php'; if(isset($_POST['submit'])){ $name=$_POST['name']; $email=$_POST['email']; $phone=$_POST['phone']; $date=$_POST['date']; $p_name=$_POST['p_name']; $dob=$_POST['dob']; $gender=$_POST['gender']; $height=$_POST['height']; $weight=$_POST['weight']; $oxygen=$_POST['oxygen']; $message=$_POST['message']; $mail = new PHPMailer\PHPMailer\PHPMailer(); $mail->IsSMTP(); // enable SMTP $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only $mail->SMTPAuth = true; // authentication enabled $mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail $mail->Host = "smtp.xxxx.co.uk"; $mail->Port = 465; // or 587 $mail->IsHTML(true); $mail->Username = "website@pxxxxxxxx.com"; $mail->Password = "xxxxxxxxxxxxxxxxxxx"; $mail->SetFrom($email, $name); $mail->Subject = "Website Repatriation Form"; $mail->Body = "Contact Name: ".$name."\n"."Contact Phone No: ".$phone."\n"."Patient's Name: ".$p_name."\n"."Date of Birth: ".$dob."\n"."Gender: ".$gender."\n"."Height: ".$height."\n"."Needs Oxygen? :".$oxygen."\n"."Message:"."\n".$message; $mail->AddAddress("xxxxxxxxxxxxxxxxx"); if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent"; } } ?>
发送日志输出
2022-11-21 11:24:17 CLIENT -> SERVER: EHLO xxxxxxxx.com 2022-11-21 11:24:17 CLIENT -> SERVER: AUTH LOGIN 2022-11-21 11:24:17 CLIENT -> SERVER: [credentials hidden] 2022-11-21 11:24:17 CLIENT -> SERVER: [credentials hidden] 2022-11-21 11:24:17 CLIENT -> SERVER: MAIL FROM:<name@domain.com> 2022-11-21 11:24:17 CLIENT -> SERVER: RCPT TO:<name@domain.co.uk> 2022-11-21 11:24:17 CLIENT -> SERVER: DATA 2022-11-21 11:24:17 CLIENT -> SERVER: Date: Mon, 21 Nov 2022 12:24:17 +0100 2022-11-21 11:24:17 CLIENT -> SERVER: To: name@domain.co.uk 2022-11-21 11:24:17 CLIENT -> SERVER: From: Name <name@domain.com> 2022-11-21 11:24:17 CLIENT -> SERVER: Subject: Website Repatriation Form 2022-11-21 11:24:17 CLIENT -> SERVER: Message-ID: <WANZgAlHnYVPWwcMaFO7zyV8AXyiFTzo@domain.com> 2022-11-21 11:24:17 CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.5 (https://github.com/PHPMailer/PHPMailer) 2022-11-21 11:24:17 CLIENT -> SERVER: MIME-Version: 1.0 2022-11-21 11:24:17 CLIENT -> SERVER: Content-Type: text/html; charset=iso-8859-1 2022-11-21 11:24:17 CLIENT -> SERVER: Content-Transfer-Encoding: 8bit 2022-11-21 11:24:17 CLIENT -> SERVER: 2022-11-21 11:24:17 CLIENT -> SERVER: Contact Name: Webform name 2022-11-21 11:24:17 CLIENT -> SERVER: Contact Phone No: xxxxxxxxxxx 2022-11-21 11:24:17 CLIENT -> SERVER: Patient's Name: Eric Sprognasty 2022-11-21 11:24:17 CLIENT -> SERVER: Date of Birth: 1956-01-01 2022-11-21 11:24:17 CLIENT -> SERVER: Gender: Male 2022-11-21 11:24:17 CLIENT -> SERVER: Height: 5'11" 2022-11-21 11:24:17 CLIENT -> SERVER: Needs Oxygen? :No 2022-11-21 11:24:17 CLIENT -> SERVER: Message: 2022-11-21 11:24:17 CLIENT -> SERVER: Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorem aspernatur magnam sapiente dicta, harum quae iure, labore tenetur cumque odio nostrum nesciunt quos tempora maiores animi id et soluta vitae. 2022-11-21 11:24:17 CLIENT -> SERVER: 2022-11-21 11:24:17 CLIENT -> SERVER: . 2022-11-21 11:24:18 CLIENT -> SERVER: QUIT Message has been sent
解决建议
- 修复发件人地址配置:当前用用户提交的邮箱作为
SetFrom地址,会触发SPF/DKIM验证失败(手动测试时用的是SMTP账号邮箱所以没问题)。正确做法是用SMTP账号邮箱作为发件人,用户邮箱放到回复地址:$mail->SetFrom("website@pxxxxxxxx.com", "网站表单"); $mail->addReplyTo($email, $name); - 修正HTML格式的换行:已开启
IsHTML(true),但邮件内容用\n换行在HTML中无效,会导致内容排版混乱,改用<br>标签:$mail->Body = "Contact Name: ".$name."<br>Contact Phone No: ".$phone."<br>Patient's Name: ".$p_name."<br>Date of Birth: ".$dob."<br>Gender: ".$gender."<br>Height: ".$height."<br>Needs Oxygen?: ".$oxygen."<br>Message:<br>".$message; - 添加纯文本备用内容:设置
AltBody字段,兼容不支持HTML的邮箱客户端,提升邮件可信度:$mail->AltBody = "Contact Name: ".$name."\nContact Phone No: ".$phone."\nPatient's Name: ".$p_name."\nDate of Birth: ".$dob."\nGender: ".$gender."\nHeight: ".$height."\nNeeds Oxygen?: ".$oxygen."\nMessage:\n".$message; - 验证POST数据合法性:添加邮箱格式验证,避免非法数据导致异常:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo "无效的邮箱格式"; exit; } - 检查发件邮箱的退信:即使SMTP发送成功,收件服务器可能拒收邮件并退回给
website@pxxxxxxxx.com,登录该邮箱查看退信通知,里面会有具体拒收原因(如SPF验证失败、触发垃圾邮件规则等)。
内容的提问来源于stack exchange,提问作者Steve_R
相关产品推荐
相关产品推荐

