本地主机通过PHP发送邮件至Gmail未收到问题求助
解决PHP sendmail发送邮件到Gmail收不到的问题
我之前也碰到过一模一样的情况——代码返回发送成功,但Gmail就是没收到邮件,咱们一步步来排查和解决:
1. 先搞定Gmail的安全配置(最常见的坑)
Gmail对SMTP登录的限制非常严格,这是绝大多数人踩的第一个坑:
- 如果你的Google账号开了两步验证(2FA),绝对不能用普通密码填在sendmail配置里,必须去Google账号设置里生成一个应用专用密码(App Password),把这个密码填到sendmail.ini的
auth_password字段。 - 如果没开2FA,现在Google已经取消了“不太安全的应用访问”选项,要么开启2FA用App Password,要么考虑改用OAuth2认证(不过sendmail原生支持OAuth2比较麻烦,优先推荐前者)。
2. 确认sendmail.ini的核心配置正确
把你的sendmail.ini里这些关键配置核对一遍,确保没有错:
smtp_server=smtp.gmail.com smtp_port=587 # TLS端口用587,SSL端口用465,别混着用 auth_username=你的Gmail完整地址@gmail.com auth_password=刚才生成的应用专用密码(或对应密码) smtp_ssl=tls # 587端口配tls,465端口配ssl force_sender=你的Gmail完整地址@gmail.com # 和auth_username保持一致
3. 修复PHP代码里的细节问题
你的代码有几个容易导致邮件被拦截或格式无效的点:
- 邮件头必须用
\r\n作为换行符(邮件标准要求),你之前用的\n会被部分服务器判定为无效格式; - 缺少
Content-Type头,很容易被Gmail当成垃圾邮件; - 没有验证用户输入的邮箱有效性,也没转义特殊字符,可能触发邮件头注入或垃圾邮件判定;
ini_set("sendmail_from", $email_from)可能和sendmail.ini的force_sender冲突,建议注释掉。
修改后的sendmail.php示例代码:
<?php echo 'Current PHP version: ' . phpversion(); // 先验证并获取用户输入 $email_to = "khinthidaphyo92@gmail.com"; $name = isset($_POST["name"]) ? trim($_POST["name"]) : ''; $email_from = isset($_POST["email"]) ? trim($_POST["email"]) : ''; $message = isset($_POST["message"]) ? trim($_POST["message"]) : ''; // 验证邮箱格式是否有效 if (!filter_var($email_from, FILTER_VALIDATE_EMAIL)) { die("请输入有效的邮箱地址"); } $email_subject = "Feedback from website"; // 构造符合标准的邮件头 $headers = "From: " . $email_from . "\r\n"; $headers .= "Reply-To: " . $email_from . "\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; // 格式化邮件内容,转义特殊字符防止注入 $message_body = "Name: " . htmlspecialchars($name) . "\r\n\r\nMessage:\r\n" . htmlspecialchars($message); // 注释掉可能冲突的设置 // ini_set("sendmail_from", $email_from); // 发送邮件,注意-f参数后面的空格(部分系统需要) $sent = mail($email_to, $email_subject, $message_body, $headers, "-f " . $email_from); echo "<br>发送状态: " . ($sent ? "成功" : "失败"); if ($sent) { echo "<br>邮件已发送,请检查收件箱或垃圾邮件文件夹"; } else { echo "<br>发送失败,请检查邮件服务器配置和日志"; } ?>
4. 查看日志找具体原因
如果还是不行,一定要看sendmail的日志:
- Windows系统:sendmail安装目录下的
sendmail.log - Linux系统:
/var/log/mail.log或/var/log/syslog
日志里会明确告诉你是认证失败、连接超时还是被Gmail拒绝,这是最直接的排查线索。
5. 别忘了检查垃圾邮件文件夹
很多时候邮件并没有被拒收,只是被Gmail自动归类到了垃圾邮件里,先去垃圾邮件文件夹翻一翻!
内容的提问来源于stack exchange,提问作者khin thida phyo
相关产品推荐
相关产品推荐

