必须下载fake-sendmail最新版并配置gmail应用专用密码:xampp 7.4+已移除sendmail,需手动部署sendmail.exe与ini文件,smtp设为smtp.gmail.com:587,php.ini中sendmail_path须含-t参数,sendmail.ini的auth_password必须为16位小写应用专用密码且force_sender与之完全一致,编码保存为ansi,启用openssl并重启apache后测试。

要在XAMPP环境下让PHP的mail()函数真正发出测试邮件,必须补全缺失的sendmail.exe并严格匹配SMTP服务商要求——XAMPP 7.4+已彻底移除sendmail目录,直接编辑php.ini里的SMTP参数或复制旧版sendmail.exe进去都无效,Gmail/QQ邮箱还强制要求应用专用密码而非登录密码,填错就静默失败。
确认XAMPP版本与sendmail物理存在状态
打开命令行,执行dir C:\xampp\sendmail。若提示“系统找不到指定的路径”,说明你用的是XAMPP 7.4或更新版本,【sendmail.exe物理上不存在,硬配sendmail.ini是白忙活】。
不要尝试从网上下载“XAMPP自带sendmail”压缩包——那全是7.3及更早版本的残留物,与当前PHP 8.x不兼容。
去fake-sendmail for Windows下载最新release的zip包(如fake-sendmail-v1.0.0.zip),解压后仅保留sendmail.exe和sendmail.ini两个文件。
部署sendmail.exe并配置基础路径
在C:\xampp\下手动新建文件夹:sendmail。
把下载解压出的sendmail.exe和sendmail.ini放入该目录。
打开C:\xampp\php\php.ini,定位到[mail function]区块,修改以下三行(其余保持原样):
SMTP = smtp.gmail.comsmtp_port = 587sendmail_path = "C:\xampp\sendmail\sendmail.exe -t"
注意:这里sendmail_path必须用英文双引号包裹完整路径,且末尾带-t参数——漏掉它,sendmail.exe将无法读取邮件头中的To字段。
Gmail SMTP四要素精准配置
打开C:\xampp\sendmail\sendmail.ini,全部清空,粘贴以下内容(逐项核对,不可跳过):
[sendmail]smtp_server=smtp.gmail.comsmtp_port=587error_logfile=error.logdebug_logfile=debug.logauth_username=your.name@gmail.comauth_password=abcd-efgh-ijkl-mnopforce_sender=your.name@gmail.com
【auth_password必须是Google账户开启两步验证后生成的16位应用专用密码,全小写、无空格、无连字符;填登录密码必定失败】
【force_sender必须与auth_username完全一致,否则Gmail返回553 5.7.1错误】
保存后,确保sendmail.ini编码为ANSI(非UTF-8),否则中文注释可能导致解析失败——用记事本另存为时选“ANSI”。
启用OpenSSL并重启Apache
打开C:\xampp\php\php.ini,搜索extension=openssl,删掉前面的分号取消注释。
进入XAMPP控制面板,点击Apache右侧的“Stop”,再点“Start”——【改了php.ini不重启Apache,所有配置都不生效】。
检查Apache日志窗口是否出现“Apache started”字样,没有报错即为成功。
编写测试脚本并验证日志
在C:\xampp\htdocs\下新建testmail.php,内容如下:
<?php $to = 'your.test@email.com';$subject = 'XAMPP mail() test at ' . date('Y-m-d H:i:s');$body = "This is a plain-text test email from XAMPP.\n\nTime: " . date('c');$headers = "From: your.name@gmail.com\r\nReply-To: your.name@gmail.com\r\nMIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8";if (mail($to, $subject, $body, $headers)) { echo '✅ 邮件已提交至sendmail队列';} else { echo '❌ mail()调用失败';}?>
浏览器访问http://localhost/testmail.php,页面显示✅即表示PHP层调用成功。
立即查看C:\xampp\sendmail\debug.log最后一行是否含Connected to smtp.gmail.com:587——若出现Connection timed out,说明端口或服务器地址写错;若含Authentication failed,立刻检查应用专用密码是否输错或过期。











