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

PHP无法向邮件发送附件问题求助

问题分析与解决方案

你的HTML表单配置是正确的(已设置enctype="multipart/form-data"),问题出在PHP的邮件发送逻辑上:

  • 原生mail()函数默认发送纯文本邮件,无法直接添加附件,必须手动构建多部分MIME格式的邮件内容
  • $_FILES是数组类型,直接拼接进文本会显示Array,这就是你收到的邮件里附件部分异常的核心原因

修改后的PHP代码

<?php
$name = $_POST['name'] ?? '';
$contact = $_POST['contact'] ?? '';

// 收集上传的有效文件
$files = [];
foreach (['file1', 'file2', 'file3'] as $field) {
    if (!empty($_FILES[$field]['tmp_name']) && $_FILES[$field]['error'] === UPLOAD_ERR_OK) {
        $files[] = [
            'name' => $_FILES[$field]['name'],
            'tmp_path' => $_FILES[$field]['tmp_name'],
            'type' => $_FILES[$field]['type'] ?? 'application/octet-stream'
        ];
    }
}

$to = "my@email.com";
$subject = "New Form Received!";
$from = "noreply@email.com";
$cc = "private-sender@gmail.com";

// 构建MIME边界
$boundary = md5(uniqid(time()));

// 邮件头部
$headers = "From: $from\r\n";
$headers .= "CC: $cc\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$headers .= "\r\nThis is a multi-part message in MIME format.\r\n";

// 文本内容部分
$message = "--$boundary\r\n";
$message .= "Content-Type: text/plain; charset=utf-8\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$message .= "Name = $name\r\n";
$message .= "Contact = $contact\r\n\r\n";

// 添加附件
foreach ($files as $file) {
    $file_content = file_get_contents($file['tmp_path']);
    $encoded_content = chunk_split(base64_encode($file_content));
    
    $message .= "--$boundary\r\n";
    $message .= "Content-Type: {$file['type']}; name=\"{$file['name']}\"\r\n";
    $message .= "Content-Disposition: attachment; filename=\"{$file['name']}\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $message .= $encoded_content . "\r\n";
}

// 结束边界
$message .= "--$boundary--";

// 发送邮件
if (!empty($contact)) {
    mail($to, $subject, $message, $headers);
}

header("Location: Success.html");
exit;
?>

关键说明

  1. MIME多部分格式:通过定义boundary分隔邮件的文本内容和附件,让邮件客户端能正确识别不同组成部分
  2. 文件有效性验证:只处理上传状态为UPLOAD_ERR_OK的文件,避免处理错误或未上传的文件
  3. Base64编码:附件内容必须经过Base64编码后嵌入邮件,否则会出现乱码或无法识别的问题
  4. 空值处理:使用??运算符处理表单字段空值,避免未定义索引报错

内容的提问来源于stack exchange,提问作者Vladimir Sanchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:08:27