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"); } ?>
额外提醒
- 权限检查:务必确保
uploads/文件夹的权限是755,否则服务器无法写入上传的图片。 - 编码统一:我把邮件编码改成了
utf-8,和你的HTML页面编码一致,避免出现乱码。 - 文件限制:可以添加额外的判断,比如只允许上传图片类型(
image/jpeg、image/png等),防止上传恶意文件。 - PHP配置:检查
php.ini中的upload_max_filesize和post_max_size,确保它们的值足够大,能接收你需要的图片大小。
内容的提问来源于stack exchange,提问作者Davi Gabriel
相关产品推荐
相关产品推荐

