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

同一服务器下PHP mail()正常但PHPMailer发送成功却收不到邮件

问题根因及排查方案

  • 发件人校验失败是最核心原因
    你原生mail()函数使用的发件人为同服务器域名下的webmaster@example.com,通常该域名的SPF/DKIM记录已经配置了当前服务器IP为合法发信源,因此收件方校验通过可以正常收信。
    而PHPMailer代码中你使用了fiwejfiwe@gmail.com作为发件人,但没有配置走Gmail官方SMTP通道,直接通过服务器本地的mail组件发信,Gmail的SPF记录仅允许谷歌官方IP段发送该域名后缀的邮件,收件方(Outlook)校验SPF失败后会直接将邮件判定为垃圾邮件,甚至直接丢弃不进入收件箱,也不会生成退信回发到你填写的Gmail发件地址,因此你看不到任何报错。

  • PHPMailer返回true不代表最终投递成功
    $mail->send()返回true仅代表PHPMailer已经将邮件正常交给下层发信组件(默认是系统的mail()函数),不代表收件方已经接收并放行该邮件。你可以开启调试日志查看完整投递交互信息,确认下层发信的实际返回状态:

// 加在send()之前开启调试,输出完整投递日志
$mail->SMTPDebug = 3;

解决方案

方案1:继续使用服务器本地发信

将PHPMailer的发件人改为和原生代码一致的、属于服务器绑定域名下的邮箱地址,确保该域名的SPF、DKIM记录已经配置当前服务器IP为合法发信源,即可正常收信。

方案2:使用Gmail作为发件人发信

需要配置PHPMailer走Gmail官方SMTP通道发信,不要用本地mail组件,示例代码如下:

$mail = new PHPMailer();
// 开启SMTP模式
$mail->isSMTP();
// Gmail SMTP配置
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'fiwejfiwe@gmail.com';
// 需先开启Gmail两步验证,生成专属应用密码填入此处,不可使用账号原密码
$mail->Password = '你的Gmail应用密码';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;

// 原有发件人、收件人、内容配置保持不变
$mail->setFrom('fiwejfiwe@gmail.com');
$mail->addReplyTo('fiwejfiwe@gmail.com');
$mail->addAddress('myaddress@outlook.com');
$mail->Subject = 'PHPMailer mails test';
$mail->Body = 'This is a plain-text message body';

if (!$mail->send()) {
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message sent!';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:54:02