使用SMTP发送邮件无法送达Gmail邮箱的原因排查
问题描述
配置send.php通过SMTP发送邮件,收件人为网站邮箱info@my-site.com时能正常接收,但设置为Gmail邮箱email@gmail.com时无法收到。已生成Gmail应用密码,相关代码如下:
$mail->CharSet = "UTF-8"; $mail->SMTPAuth = true; $mail->SMTPKeepAlive = true; $mail->isSendMail(); $mail->SMTPDebug = true; $mail->Debugoutput = function ($str, $level) { $GLOBALS['status'][] = $str; }; $mail->Host = 'smtp.gmail.com'; $mail->Username = 'username'; $mail->Password = 'password'; $mail->SMTPSecure = 'ssl'; $mail->Port = 465; // Set up email $to = "email@gmail.com"; $body = "From: $name\n Email: $email\n Message:\n $message"; $headers = "From: $email\r\n"; $headers .= "Reply-To: $email\r\n"; // Send email // Set the email details $mail->setFrom($email, $name); $mail->addAddress($to, 'Name'); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $body;
可能的原因及解决方案
1. 代码强制使用Sendmail而非SMTP
代码中调用了$mail->isSendMail();,这会强制使用服务器本地的sendmail命令发送邮件,直接忽略你配置的Gmail SMTP参数。网站邮箱能收到是因为本地服务器可直接投递到同域名邮箱系统,但Gmail会拦截这种无SMTP认证的投递请求。
解决方法:删除$mail->isSendMail();,替换为$mail->isSMTP();,确保使用配置的Gmail SMTP服务器发件。
2. 发件人地址与SMTP用户名不匹配
Gmail SMTP要求发件人地址(setFrom的参数)必须与SMTP用户名($mail->Username)完全一致,否则会触发反垃圾机制,邮件要么被拒绝,要么直接进入垃圾箱。
解决方法:将$mail->setFrom($email, $name);改为$mail->setFrom('你的Gmail用户名@gmail.com', $name);,同时用$mail->addReplyTo($email, $name);设置回复地址,保证用户回复能回到提交的邮箱。
3. HTML邮件格式错误
你设置了$mail->isHTML(true);,但$body使用纯文本换行符\n,Gmail对HTML格式邮件有严格要求,这种混合格式会被判定为垃圾邮件。
解决方法:将$body改为标准HTML格式,示例:
$body = "<p>From: $name</p><p>Email: $email</p><p>Message:</p><p>$message</p>";
4. Gmail反垃圾机制拦截
即使SMTP配置正确,以下情况仍可能导致邮件被拦截:
- 邮件内容包含敏感词(如“免费”“促销”等)
- 发送服务器IP被Gmail列入黑名单
- 邮件被误判为垃圾邮件进入垃圾箱
解决方法:
- 精简邮件内容,避免敏感词汇
- 查看SMTP调试日志(已开启
SMTPDebug = true),确认是否有明确错误提示(如“550 5.7.1 未授权”) - 检查Gmail垃圾箱,确认邮件是否被误分类
内容的提问来源于stack exchange,提问作者Flagmans

