PHP 电子邮件附件仍有 0 kb [已解决]

问题描述 投票:0回答:1

出于某种原因,我的 PHP 邮件脚本不断发送 0 kb 的附件,尽管我正在注意空行的正确数量,正如 Stackoverflow 周围的许多类似答案中所述。

基本上,他们在那里说“......附件标题和附件内容之间应该是一个空行”,我想我是对的 - 或者不对?。

但也许我在这里遗漏了其他东西 - 谁能告诉我代码有什么问题,即:为什么它仍然发送大小为 0 kb 的电子邮件附件?

这是脚本的重要部分:

for($i = 0; $i < count($_FILES['filename']['name']); $i++){
    $tmp_name = $_FILES['filename']['tmp_name'][$i];
    if (file_exists($tmp_name)){
        $fname[] = $_FILES['filename']['name'][$i];
    }
}

// array with filenames to be sent as attachment
$files = $fname;

$msg = '<b>E-mail:</b> [email protected]<br>';
$msg .= 'Some other text here...<br>';
$msg .= '<br><br><br>';

// boundary
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
    
$headers = "From: $from";
$headers .= "\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// multipart boundary
$message = "This is a multi-part message in MIME format.\n\n";
$message .= "--{$mime_boundary}\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= $msg . "\n\n";
$message .= "--{$mime_boundary}\n";
    
// preparing attachments
for($i = 0; $i < count($files); $i++){
        
    $file = fopen($files[$i], "rb");
    $data = fread($file, filesize($files[$i]));
    fclose($file);
    
    $data = chunk_split(base64_encode($data));
    
    $message .= "Content-Type: {\"application/octet-stream\"}; name=\"$files[$i]\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n";
    $message .= "Content-Disposition: attachment; filename=\"$files[$i]\"\r\n\r\n";
    $message .= $data."\r\n\r\n";
    $message .= "--{$mime_boundary}\r\n\r\n";
}

// send
if(@mail($to, $subject, $message, $headers)){
    echo "ok";
}

更新:

所以,实际的问题是在第一个 for() 循环中,而不是“$fname[] = $_FILES['filename']['name'][$i];”它应该是“$fname[] = $_FILES['filename']['tmp_name'][$i];”,因为它只生成名称而不是文件的完整路径,因此我的文件总是 0kb 。也就是说,这有效:

for($i = 0; $i < count($_FILES['filename']['name']); $i++){
    $tmp_name = $_FILES['filename']['tmp_name'][$i];
    if (file_exists($tmp_name)){
        $fname[] = $_FILES['filename']['tmp_name'][$i];
    }
}

// array with filenames to be sent as attachment
$files = $fname;

$msg = '<b>E-mail:</b> [email protected]<br>';
$msg .= 'Some other text here...<br>';
$msg .= '<br><br><br>';

// boundary
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
    
$headers = "From: $from";
$headers .= "\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// multipart boundary
$message = "This is a multi-part message in MIME format.\n\n";
$message .= "--{$mime_boundary}\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= $msg . "\n\n";
$message .= "--{$mime_boundary}\n";
    
// preparing attachments
for($i = 0; $i < count($files); $i++){
        
    $file = fopen($files[$i], "rb");
    $data = fread($file, filesize($files[$i]));
    fclose($file);
    
    $data = chunk_split(base64_encode($data));
    
    $message .= "Content-Type: {\"application/octet-stream\"}; name=\"$files[$i]\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n";
    $message .= "Content-Disposition: attachment; filename=\"$files[$i]\"\r\n\r\n";
    $message .= $data."\r\n\r\n";
    $message .= "--{$mime_boundary}\r\n\r\n";
}

// send
if(@mail($to, $subject, $message, $headers)){
    echo "ok";
}

但现在另一个问题:现在文件大小正确,但名称错误且没有任何扩展名 - 如何解决这个问题?我应该只为文件名定义新变量还是可以从 $fname 中获取它们?

更新2:

到目前为止,我已经成功地使其工作,但只是部分地在某种意义上,只有附件中的第一个文件按其应有的方式显示,但任何其他文件都显示为充满字母和数字的长文本 - 为什么?这是到目前为止对我部分有用的脚本:

for($i = 0; $i < count($_FILES['filename']['name']); $i++){
    $tmp_name = $_FILES['filename']['tmp_name'][$i];
    if (file_exists($tmp_name)){
        $fpath[] = $_FILES['filename']['tmp_name'][$i];
        $fname[] = $_FILES['filename']['name'][$i];
    }
}

$msg = '<b>E-mail:</b> [email protected]<br>';
$msg .= 'Some other text here...<br>';
$msg .= '<br><br><br>';

// boundary
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
    
$headers = "From: $from";
$headers .= "\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// multipart boundary
$message = "This is a multi-part message in MIME format.\n\n";
$message .= "--{$mime_boundary}\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= $msg . "\n\n";
$message .= "--{$mime_boundary}\n";
    
// preparing attachments
for($i = 0; $i < count($fpath); $i++){
        
    $file = fopen($fpath[$i], "rb");
    $data = fread($file, filesize($fpath[$i]));
    fclose($file);
    
    $data = chunk_split(base64_encode($data));
    
    $message .= "Content-Type: {\"application/octet-stream\"}; name=\"$fpath[$i]\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n";
    $message .= "Content-Disposition: attachment; filename=\"$fname[$i]\"\r\n\r\n";
    $message .= $data."\r\n\r\n";
    $message .= "--{$mime_boundary}\r\n\r\n";
}

// send
if(@mail($to, $subject, $message, $headers)){
    echo "ok";
}
php email email-attachments
1个回答
0
投票

好吧,事实证明这只是两件事的问题:

  • 错误定义的附加文件的文件路径放置错误
  • 附加文件的边界部分

这是对我来说非常有效的最终正确代码:

for($i = 0; $i < count($_FILES['filename']['name']); $i++){
    $tmp_name = $_FILES['filename']['tmp_name'][$i];
    if (file_exists($tmp_name)){
        $fpath[] = $_FILES['filename']['tmp_name'][$i];
        $fname[] = $_FILES['filename']['name'][$i];
    }
}

$msg = '<b>E-mail:</b> [email protected]<br>';
$msg .= 'Some other text here...<br>';
$msg .= '<br><br><br>';

// boundary
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
    
$headers = "From: $from";
$headers .= "\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";

// multipart boundary
$message = "This is a multi-part message in MIME format.\n\n";
$message .= "--{$mime_boundary}\n";
$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= $msg;

// preparing attachments
for($i = 0; $i < count($fpath); $i++){
    
    $file = fopen($fpath[$i], "rb");
    $data = fread($file, filesize($fpath[$i]));
    fclose($file);
    
    $data = chunk_split(base64_encode($data));
    
    
    $message .= "\r\n--{$mime_boundary}\r\n";
    $message .= "Content-Type: {\"application/octet-stream\"}; name=\"$fpath[$i]\"\r\n";
    $message .= "Content-Transfer-Encoding: base64\r\n";
    $message .= "Content-Disposition: attachment; filename=\"$fname[$i]\"\r\n\r\n";
    $message .= $data;
}

$message .= "\r\n--{$mime_boundary}--";

// send
if(@mail($to, $subject, $message, $headers)){
    echo "ok";
}
© www.soinside.com 2019 - 2024. All rights reserved.