xampp 7.4+ 已彻底移除 sendmail 组件,需补第三方 sendmail.exe 并严格配置 gmail/qq 邮箱的 smtp(587 端口、应用专用密码/授权码、starttls)、邮件头(from/reply-to/mime-version/content-type)及 apache 重启。

新装的 XAMPP(7.4+)根本没 sendmail.exe,硬配 sendmail.ini 是白忙活;Gmail 必须用应用专用密码 + STARTTLS(587 端口),QQ 邮箱则需开启 SMTP 并用授权码——两者都不能填登录密码。
为什么 XAMPP 7.4+ 里找不到 sendmail 文件夹
XAMPP 自 7.2 起就不再打包 sendmail 目录,7.4 及以后版本彻底移除该组件。你搜不到 C:\xampp\sendmail\sendmail.exe,不是路径错、权限低或没重启,是它物理上不存在。
常见误判现象:
Warning: mail(): Failed to connect to mailserver at "localhost" port 25- 调用
mail()后无报错、无日志、邮件无声无息 - 手动复制旧版
sendmail.exe进去,但始终卡在 TLS 握手阶段(debug.log显示连接超时)
解决方案只有两个:
- 降级到 XAMPP 7.3.x(不推荐,安全与 PHP 版本滞后)
- 补全第三方
sendmail.exe(如ssmtp-win或fake-sendmail),并严格按 Gmail/QQ 要求重配
Gmail SMTP 配置四要素(缺一不可)
即使你补好了 sendmail.exe,以下四项任意写错,Gmail 就静默拒收或连接失败:
-
smtp_server=smtp.gmail.com:不能写成gmail-smtp.l.google.com(DNS 不稳定) -
smtp_port=587:必须是 587;smtp_ssl=auto或ssl会导致握手失败(Gmail 587 仅支持 STARTTLS) -
auth_username=your.name@gmail.com:必须是完整邮箱地址,不能只写昵称 -
auth_password=abcd-efgh-ijkl-mnop:必须是 Google 账户开启「两步验证」后生成的 16 位应用专用密码(全小写、无空格、无连字符),绝不能填账户登录密码
额外关键项:force_sender 必须与 auth_username 完全一致,否则 Gmail 返回 553 5.7.1 Sender address rejected。
QQ 邮箱 SMTP 配置要点(比 Gmail 更宽松但易忽略)
QQ 邮箱允许密码登录(已淘汰),但必须使用「SMTP 授权码」,且默认关闭 SMTP 服务:
- 登录 QQ 邮箱 → 设置 → 账户 → 「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务」→ 开启「SMTP服务」
- 生成「授权码」(16 位字母数字组合),不是 QQ 密码,也不是微信/手机登录密码
-
sendmail.ini中填:smtp_server=smtp.qq.com、smtp_port=587、auth_username=your@qq.com、auth_password=xxxxxxxxxxxxxx -
force_sender同样需与auth_username一致
QQ 邮箱对邮件头容忍度略高,但仍建议补全 From:、Reply-To:、MIME-Version: 和 Content-Type:,换行符统一用 \r\n。
PHP mail() 函数头信息必须手写,且格式零容错
sendmail.exe 不自动补任何邮件头。Gmail/QQ 都会因头信息缺失或格式错误直接返回 550 或静默丢弃:
- 必须含
From: sender@xxx.com,邮箱格式合法、域名可解析(localhost或未配置 MX 的域名会被拒) - 必须含
Reply-To: sender@xxx.com(退信追踪依赖此项) - 必须含
MIME-Version: 1.0和Content-Type: text/plain; charset=UTF-8 - 所有头字段拼接必须用
\r\n,不能用\n或\r;头末尾多一个空格或空行,整个邮件即失效
正确示例:
mail(
'receiver@example.com',
'测试邮件',
"这是一封测试内容",
"From: sender@gmail.com\r\n".
"Reply-To: sender@gmail.com\r\n".
"MIME-Version: 1.0\r\n".
"Content-Type: text/plain; charset=UTF-8\r\n"
);
真正容易被忽略的是:改完 php.ini 中的 sendmail_path 后,必须重启 Apache 才生效;而 sendmail.ini 修改后无需重启,但 debug 日志(debug.log)和错误日志(error.log)路径要提前确认可写。











