PHP调用mail()发送表单附件收到无法读取.dat文件的问题求助
问题原因
- 核心错误:读取上传文件时用了错误的路径。
$_FILES['userfile']['name']是用户上传文件的原始文件名,仅为客户端上传的字符串标识,PHP接收上传文件后会将其暂存到服务器临时目录,实际可读的文件路径是$_FILES['userfile']['tmp_name'],你用file_get_contents($ufile['name'])根本读不到实际文件内容,所以base64编码出来的只是错误提示文本,大小才会只有100字节左右。 - 次要问题:代码里
$msg变量没有提前定义,邮件正文部分会输出空值或者PHP通知内容,也可能破坏邮件结构。 - 前置检查:确保你的HTML上传表单设置了
enctype="multipart/form-data"属性,否则文件根本不会被上传到服务器。
本修正方案无需将文件持久化存储到你的Web服务器,直接读取PHP自动生成的临时文件内容发送,脚本执行完成后临时文件会被系统自动清理,符合你的需求。
修正后代码
<?php // 先判断文件上传成功再执行后续逻辑 if (isset($_FILES['userfile']) && $_FILES['userfile']['error'] === UPLOAD_ERR_OK) { $ufile = $_FILES['userfile']; $to = "john@example.com"; $subject = "New message on our website"; // 边界值加前缀避免和邮件内容冲突,更规范 $boundary = "----_MailBoundary_" . md5(time()); $headers = implode("\r\n", [ "MIME-Version: 1.0", 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' ]); // 自定义邮件正文内容,替换为你实际需要的文本即可 $msg = "您收到一条新的表单提交,附件为用户上传的文件。"; // 处理文件名编码,避免中文文件名乱码 $fileName = basename($ufile['name']); $fileName = '=?UTF-8?B?' . base64_encode($fileName) . '?='; $mailBody = implode("\r\n", [ "--$boundary", "Content-type: text/html; charset=utf-8", "", $msg, "--$boundary", 'Content-Type: application/octet-stream; name="' . $fileName . '"', "Content-Transfer-Encoding: base64", "Content-Disposition: attachment", "", // 改为读取服务器临时文件路径的内容 chunk_split(base64_encode(file_get_contents($ufile['tmp_name']))), "--$boundary--" ]); $sent = mail($to, $subject, $mailBody, $headers); if ($sent) { echo "邮件发送成功"; } else { echo "邮件发送失败,请检查服务器邮件配置"; } } else { echo "文件上传失败,请检查表单配置"; } ?>
内容的提问来源于stack exchange,提问作者DevAlp12
相关产品推荐
相关产品推荐

