xampp 自带的 sendmail.exe 无法直连 gmail 是因不支持 oauth2 且 gmail 已禁用密码登录;必须启用两步验证后使用 16 位应用专用密码,正确配置 sendmail.ini(smtp.gmail.com:587、starttls、auth_username 为完整邮箱、force_sender 一致),并确保 php.ini 中 sendmail_path 路径正确且重启 apache。

为什么 XAMPP 自带的 sendmail.exe 不能直接连 Gmail
XAMPP Windows 版附带的 sendmail.exe 是一个轻量 SMTP 客户端代理,不是完整邮件服务器,它本身不支持 OAuth2,而 Gmail 自 2022 年 5 月起已全面禁用“用户名+密码”(即普通登录)方式的 SMTP 认证。你看到的 SMTP Error: Could not authenticate 或 534-5.7.9 Application-specific password required 错误,基本都源于此。
可行路径只有两条:启用 Gmail 的「应用专用密码」(需开启两步验证),或改用支持 OAuth2 的替代方案(如 msmtp)。对本地开发环境来说,前者更简单、可快速验证逻辑。
- 必须先在 Google 账户中开启两步验证 → 才能生成「应用专用密码」
- 生成的应用专用密码是 16 位字母组合(无空格),仅用于 SMTP 登录,不是你的 Gmail 密码
-
sendmail.exe配置里填的是这个 16 位密码,不是账户密码
修改 sendmail.ini 启用 Gmail SMTP(TLS + 应用专用密码)
路径通常是 XAMPP\sendmail\sendmail.ini。关键配置项必须严格匹配 Gmail 的要求:端口 587、STARTTLS、认证开启、且用户名为完整邮箱地址。
打开文件,找到并修改以下几行(其余保持默认即可):
smtp_server=smtp.gmail.com smtp_port=587 error_logfile=error.log debug_logfile=debug.log auth_username=your.email@gmail.com auth_password=abcd efgh ijkl mnop
- 确保
auth_password中没有空格或换行;复制时容易多带一个空格,导致认证失败 -
force_sender必须与auth_username一致,否则 Gmail 会拒收(报553 5.7.1 Sender address rejected) - 不要改
smtp_ssl=auto或设为ssl—— Gmail 的 587 端口只接受 STARTTLS,设成ssl会连接超时
PHP mail() 函数调用前的必要检查
即使 sendmail.ini 配好了,PHP 还得知道去哪调用它。检查 php.ini(XAMPP 控制面板 → Config → PHP (php.ini))中以下两项:
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
注意路径中的反斜杠要转义,且末尾必须带 -t 参数(让 sendmail 从邮件头读取收件人,而不是命令行传参)。
- 改完
php.ini后必须重启 Apache,否则不生效 - 测试脚本里不要用
mail("to@example.com", ...)硬编码收件人;要靠headers传,例如:$headers = "To: test@gmail.com\r\nFrom: your.email@gmail.com"; mail("", "test", "body", $headers); - 如果遇到
Warning: mail(): Failed to connect to mailserver,大概率是sendmail_path路径错、没加引号,或sendmail.exe被杀毒软件拦截
常见失败现象和对应排查点
不是配完就能发,Windows 下有几个隐蔽但高频的坑:
- 杀毒软件(尤其是 McAfee、Avast)会静默拦截
sendmail.exe外连 —— 暂时禁用或添加信任后重试 - Gmail 后台可能显示「低安全性应用访问」被阻止,但该开关已于 2022 年彻底移除;如果你看到相关提示,说明你还在用账户密码登录,不是应用专用密码
- 使用企业 Gmail(Google Workspace)账号时,管理员可能禁用了「应用专用密码」功能,需联系管理员开启
-
debug.log文件里若出现Connection refused,优先检查防火墙是否放行了出站 587 端口
应用专用密码是临时解法,Gmail 可能在未来进一步限制;生产环境务必迁移到 SMTP 封装库(如 PHPMailer + OAuth2),但本地开发调试,这条路够用且可控。










