PHPMailer返回发送成功但收件箱未收到邮件如何解决?
PHPMailer发信提示成功但收不到排查步骤
- 先开debug看真实发送状态
你代码里已经用了new PHPMailer(true)开启了异常模式,直接在$mail->Send()之前加一行$mail->SMTPDebug = 2;,运行后就能看到完整的发信交互日志。如果日志里显示收件方服务器已经返回接收成功,就往下排查;如果有报错,直接根据报错内容处理就行,常见的有端口被封、发件人权限不足、SPF校验失败这类问题。 - 修改发件人配置
你现在直接把用户提交的邮箱当发件人$mail->From,这是最常见的触发反垃圾规则的原因。所有正规邮件服务商都会校验发件人域名的SPF记录,你用用户的个人邮箱(比如163、qq邮箱)作为发件人,你的主机IP根本不在这些邮箱的SPF允许发件的列表里,邮件直接就会被拒收或者丢垃圾箱。
正确改法是把$mail->From固定为你自己域名下的邮箱,用户的邮箱保留在addReplyTo里就行,这样收件人回复的时候还是会直接回到用户提交的邮箱,不会影响使用,还能通过SPF校验。 - 先查垃圾邮件文件夹
如果debug日志显示邮件已经被对方服务器接收,第一时间去收件箱的垃圾邮件、广告邮件、订阅邮件文件夹里找,没做过域名认证的自定义发信大概率会被归到垃圾邮件里,找到之后标记为不是垃圾邮件,后续的邮件就会正常进收件箱了。 - 确认主机发信限制+换SMTP发信
你现在的代码没有配置SMTP参数,默认用的是PHP自带的mail()函数,kinghost这类虚拟主机很多都会限制25端口的对外发信,或者要求必须用主机提供的SMTP服务发件。直接改成SMTP模式发件更稳定,加以下配置就行:
// 加在$mail = new PHPMailer(true);之后 $mail->isSMTP(); $mail->Host = '填kinghost给你的SMTP服务器地址'; $mail->SMTPAuth = true; $mail->Username = '你自己域名下的发件邮箱'; $mail->Password = '发件邮箱的授权码或者登录密码'; $mail->SMTPSecure = 'ssl'; $mail->Port = 465;
- 修正HTML邮件格式
你开了isHTML(true)但是内容里用的是\r\n换行,HTML里不识别这种纯文本换行,格式混乱也会触发反垃圾规则,把所有\r\n换成<br>就行,或者额外加一行$mail->AltBody = strip_tags($mail->Body);设置纯文本备用内容,兼容性更好。 - 确认收件邮箱变量正确
你用的收件邮箱$emailBase是从variaveisFixas.php里赋值的,可以临时加一行var_dump($emailBase);die;在addAddress之后,确认这个变量的值是不是你实际要收件的邮箱,避免变量配置错误发到别的邮箱里了。
内容的提问来源于stack exchange,提问作者Anna Halasz
相关产品推荐
相关产品推荐

