本地xampp发邮件失败主因是sendmail.ini未正确配置smtp参数:需设smtp_server=smtp.gmail.com、port=587、auth_username为完整邮箱、auth_password为16位应用专用密码,并在mail()中严格使用\r\n换行及完整邮件头。

本地开发环境发不了真实邮件,不是因为 XAMPP 本身限制,而是默认的 sendmail 配置根本没连上任何 SMTP 服务——它只是个空壳命令,不处理认证、加密、中继,直接调用会静默失败或退回 550 relaying denied。
确认你用的是 Windows 版 XAMPP + sendmail(非 phpmailer 或 smtp 扩展)
Windows 下 XAMPP 自带的 sendmail 是一个轻量封装工具(sendmail.exe),本质是把 PHP 的 mail() 函数调用转成 SMTP 请求。它不依赖系统 mail 服务,但必须手动配置目标 SMTP 服务器。Linux/macOS 用户看到这里可以停了——你们通常直接配 ssmtp 或 msmtp,路径和权限逻辑完全不同。
- 检查
XAMPP\sendmail\sendmail.ini是否存在且可写 - 确认
php.ini中sendmail_path指向的是"X:\xampp\sendmail\sendmail.exe -t"(注意路径用反斜杠,末尾-t不能少) -
mail()函数必须传完整头信息,比如"From: test@example.com\r\nReply-To: test@example.com",否则 Gmail 等服务会拒收
sendmail.ini 必须填对这 4 个字段
填错任意一个都会导致连接超时、认证失败或被当成垃圾邮件。重点不是“能连上”,而是“被对方 SMTP 接受”。Gmail 和 Outlook 对客户端行为越来越敏感。
-
smtp_server=smtp.gmail.com:别用gmail-smtp.l.google.com这类内部域名,解析不稳定 -
smtp_port=587:必须是 587(STARTTLS),不是 465(SSL)——sendmail.exe不支持隐式 SSL -
auth_username填你完整的 Gmail 地址(如yourname@gmail.com),不是昵称 -
auth_password不能填 Gmail 登录密码,必须是 Google 账户开启「两步验证」后生成的「应用专用密码」(16 位,全小写)
如果用 Outlook/Hotmail,改 smtp_server=smtp-mail.outlook.com,端口仍是 587,认证方式相同。
PHP mail() 调用时最容易漏掉的头信息
sendmail.exe 不自动补全任何邮件头。缺 From 或格式错误,Gmail 直接 550;缺 MIME-Version 和 Content-Type,中文变乱码;没 Reply-To,测试时收不到退信提示。
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,不能只用\n(Windows 行尾标准) - 所有邮箱地址必须是完整格式,不能是
sender或<sender></sender> - 如果发 HTML 邮件,
Content-Type改为text/html; charset=UTF-8,且内容里不能有未转义的符号
调试失败时先看这 3 个地方
错误不会报在浏览器里,得查日志。XAMPP 的 sendmail 默认不输出错误,除非你强制启用。
- 打开
XAMPP\sendmail\sendmail.ini,取消注释debug_logfile="X:\xampp\sendmail\debug.log"并确保路径可写 - PHP 报
Warning: mail(): Failed to connect to mailserver?说明smtp_server或smtp_port错了,或防火墙拦截了出站 587 - 日志里出现
Authentication failed?99% 是应用专用密码过期、输错,或账户没开两步验证
真实环境里,sendmail.exe 是个单线程阻塞工具,高并发下会卡住;生产环境务必换 PHPMailer 或 SMTP 扩展,本地测试够用,但别把它当长期方案。










