You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:00:02