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

PHP邮件发送系统:上传图片附件为空问题求助

解决邮件上传图片为空的问题

嘿,我帮你梳理了代码里的问题,导致图片附件在收件箱里为空的原因主要有两个:文件上传的变量引用错误,以及没正确构建带附件的MIME邮件格式——原生mail()函数不会自动帮你处理附件,你之前只是把一个没正确赋值的路径写到邮件文本里,自然看不到实际的图片。

具体问题拆解

  • 上传变量错误:你写的$_FILES['arquivo']['arquivo']是错的,正确的文件名索引应该是$_FILES['arquivo']['name'],而且你没定义$uploaddir变量,也没执行实际的文件上传移动操作。
  • 邮件未支持附件:纯HTML邮件无法携带附件,必须构建多部分MIME格式的邮件内容,把图片编码后嵌入邮件。

修复方案与代码修改

第一步:先搞定文件上传逻辑

首先在你的服务器上创建一个uploads/文件夹(权限设为755,确保服务器能写入),然后修正上传代码:

// 定义上传目录(必须存在且可写)
$uploaddir = 'uploads/';
// 正确获取上传的文件名
$uploadfile = $uploaddir . basename($_FILES['arquivo']['name']);

// 执行文件移动操作,如果失败直接跳错误页
if (!move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploadfile)) {
    header("Location: erro.php?msg=上传图片失败,请检查权限");
    exit;
}

第二步:构建带附件的MIME邮件

下面是完整的修改后的PHP处理代码,已经包含了附件支持:

<?php
session_start();
include_once("conexao/config.php");

$ti = $_SESSION['email'];
$nome = $_POST['nome'];
$email = $_POST['email1'];
$assunto = $_POST['assunto'];
$mensagem = $_POST['texto'];

// 处理文件上传
$uploaddir = 'uploads/';
// 如果上传目录不存在,自动创建
if (!file_exists($uploaddir)) {
    mkdir($uploaddir, 0755, true);
}
$uploadfile = $uploaddir . basename($_FILES['arquivo']['name']);
$has_attachment = false;
$attachment_info = [];

// 检查是否有合法的上传文件
if (!empty($_FILES['arquivo']['tmp_name']) && $_FILES['arquivo']['error'] == UPLOAD_ERR_OK) {
    if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploadfile)) {
        $has_attachment = true;
        $attachment_info = [
            'name' => $_FILES['arquivo']['name'],
            'mime_type' => $_FILES['arquivo']['type'],
            'file_path' => $uploadfile
        ];
    }
}

// 准备邮件参数
$to = "contato@silvaplataformas.com.br";
$subject = $assunto;

// 生成随机的MIME边界符(区分邮件正文和附件)
$mime_boundary = md5(uniqid(time()));

// 构建邮件头
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"{$mime_boundary}\"\r\n";
$headers .= "From: {$email}\r\n";

// 构建邮件正文(HTML格式)
$email_body = "--{$mime_boundary}\r\n";
$email_body .= "Content-Type: text/html; charset=utf-8\r\n";
$email_body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$email_body .= "<strong>Nome:</strong> {$nome}<br><br>";
$email_body .= "<strong>Email:</strong> {$email}<br><br>";
$email_body .= "<strong>Assunto:</strong> {$assunto}<br><br>";
if ($has_attachment) {
    $email_body .= "<strong>Arquivo:</strong> {$attachment_info['name']}<br><br>";
}
$email_body .= "<strong>Mensagem:</strong> {$mensagem}<br><br>";

// 添加附件(如果有上传的图片)
if ($has_attachment) {
    $file_content = file_get_contents($attachment_info['file_path']);
    $file_content = chunk_split(base64_encode($file_content)); // 转成base64编码
    
    $email_body .= "--{$mime_boundary}\r\n";
    $email_body .= "Content-Type: {$attachment_info['mime_type']}; name=\"{$attachment_info['name']}\"\r\n";
    $email_body .= "Content-Disposition: attachment; filename=\"{$attachment_info['name']}\"\r\n";
    $email_body .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $email_body .= $file_content . "\r\n";
}

// 结束MIME边界
$email_body .= "--{$mime_boundary}--";

// 发送邮件
$mail_success = mail($to, $subject, $email_body, $headers);

// 跳转结果页
if ($mail_success) {
    // 可选:如果不需要保留服务器上的图片,可以在这里删除
    // unlink($attachment_info['file_path']);
    header("Location: sucesso.php");
} else {
    header("Location: erro.php");
}
?>

额外提醒

  1. 权限检查:务必确保uploads/文件夹的权限是755,否则服务器无法写入上传的图片。
  2. 编码统一:我把邮件编码改成了utf-8,和你的HTML页面编码一致,避免出现乱码。
  3. 文件限制:可以添加额外的判断,比如只允许上传图片类型(image/jpeg、image/png等),防止上传恶意文件。
  4. PHP配置:检查php.ini中的upload_max_filesize和post_max_size,确保它们的值足够大,能接收你需要的图片大小。

内容的提问来源于stack exchange,提问作者Davi Gabriel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:15:43