xampp 7.4+已移除sendmail.exe,mail()不支持附件且易失败;应改用phpmailer直连smtp,一行addattachment()即可发带附件邮件,并注意gmail配置、应用专用密码及路径无空格。

你的 XAMPP 根本没有 sendmail.exe,别白忙了
XAMPP 7.4 及之后所有版本(包括你今天刚下载的)已彻底移除 sendmail 目录和 sendmail.exe。你在 C:\xampp\sendmail\ 下看到空文件夹、404 错误,或手动放进去的第三方 sendmail.exe 死活连不上 Gmail —— 这不是配置错,是物理不存在。强行修改 php.ini 中的 sendmail_path 或反复重装 XAMPP,只会浪费两小时。
即使补上 sendmail.exe,mail() 也发不出带附件的邮件
mail() 函数本身不支持附件。它只接受 to、subject、message、headers 四个参数,所有附件逻辑必须靠手拼 MIME 多部分结构(boundary、base64 编码、Content-Disposition 等),稍有换行或空格错误就直接被 Gmail 拒收为 550。网上那些“用 \r\n--boundary\r\n... 手写附件”的示例,在真实环境里几乎 100% 失败。
- 附件需 base64 编码 + 换行符严格为
\r\n(不是\n) -
Content-Type必须含multipart/mixed; boundary="xxx",且每个 part 的 header 和 body 之间要有且仅有一个空行 -
mail()不校验、不修复、不报错——失败时静默返回false,日志里连线索都没有
正确做法:用 PHPMailer 替代 mail(),附件一行代码搞定
PHPMailer 绕过系统 MTA,直连 SMTP,自动处理 MIME、编码、TLS 握手、重试逻辑。Gmail 要求的 STARTTLS、应用专用密码、force_sender 一致性等问题,它全封装好了。
安装后,添加附件只需这一行:
$mail->addAttachment('path/to/file.pdf', '说明书.pdf');
关键配置点(以 Gmail 为例):
-
$mail->Host = 'smtp.gmail.com':不能写成gmail-smtp.l.google.com(DNS 不稳) -
$mail->Port = 587:必须是 587;设成 465 且用ENCRYPTION_SMTPS也可,但 587 +ENCRYPTION_STARTTLS更通用 -
$mail->Username和$mail->setFrom()必须完全一致,否则 Gmail 返回 553 -
$mail->Password必须是 Google 账户「两步验证」开启后生成的 16 位小写字母应用专用密码,绝非登录密码
最容易被忽略的坑:中文附件名和路径里的空格
PHPMailer 默认对附件名做 RFC 2231 编码,但 Windows 下如果路径含中文或空格(如 C:\my project\简历.pdf),addAttachment() 会因路径解析失败静默跳过。解决方法只有两个:
- 把附件先复制到无空格、纯英文路径下再传入(例如
C:\temp\resume.pdf) - 用
file_get_contents()读取二进制内容,再用addStringAttachment()手动传入,并显式指定$name参数(支持 UTF-8 中文名)
别信“改 php.ini 的 default_charset 就能解决”,那对附件路径无效。路径是操作系统层面的事,PHPMailer 不做转义,也不该做。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











