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

本地主机通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:18:16