通过电子邮件发送上传的文件而不先保存

时间:2013-03-14 03:13:53

标签: javascript file email upload

我正在创建一个应用程序,允许用户附加文件,键入消息,然后使用WordPress的PHP邮件程序插件发送电子邮件。我使用javascript从上传html表单获取文件信息,然后使用php发送电子邮件。使用此功能发送在特定位置保存在服务器上的文件时,插件可以正常工作:

$mail->AddAttachment("./new6.txt","attachment");

我想知道是否有办法通过电子邮件发送所选文件而无需将其保存到服务器。换句话说,用户是否可以选择要上传的文件,但是使用此php函数发送文件而不将其保存在要检索的位置?我知道有一个$ _FILES数组,你可以获取该文件的信息,但是该文件是否可以在不先将其保存的情况下发送?我猜不是因为上传表单的重点是“上传”它,但只是想知道是否可以用javascript或其他东西来完成。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

你无法真正做到这一点,但你可以这样做以获得近距离效果:

$filename = $_FILES['file_name']['tmp_name'];
$main->AddAttachment($filename, "attachment");

// Send the email... then:
unset($filename);

这会将文件添加为附件,发送电子邮件,然后删除该文件。 $_FILES数组中的上传文件最终将自动刷新,因此我不确定unset()部分是否有任何重要意义,但它肯定会删除该文件。

答案 1 :(得分:0)

如果不在服务器中保存文件,则无法将其附加到邮件中。

1> Mailing function is executing in Server.
2> It is not possible from Server to get the absolute file path in client machine as in web, the client machines do not have any absolute address.
3> So the file is needed to be uploaded in server to get a real path for the file to have in attachment of Mail.

答案 2 :(得分:0)

我知道这是一个相当老的问题,但是我认为有一个从未给出过的相当有用的答案。为了像我这样的人,在寻找该问题或类似问题的答案时遇到这个问题,您可以选择这里。

当您从表单将文件上传到服务器时,该文件会自动保存到tmp目录中。从技术上讲,不保存就无法对表单上载的文件执行任何操作,因为它会自动为您完成。但是,由于tmp会在每次重新启动时自动清除,因此,如果您经常重新启动或设置cron定期删除tmp目录内容,那么在积压过多积压方面就不成问题了。

但是,由于已将其保存到tmp,并且可以从那里操作该文件,因此可以发送该文件而无需将其保存为任何形式的长寿,也无需实际编写任何文件来保存它。如果您对文件执行了所有必要的安全检查(验证内容,MIME类型以及我现在不会讨论的内容,但是您可以阅读有关如何进行here的信息),则可以使用以下是我从Codexworld获得并修改为使用tmp文件的php函数。您需要做的就是通过 参数,而$ files是您希望已经审核的文件数组。

function multi_attach_mail($to, $subject, $message, $senderEmail, $senderName, $files = array()){ 

    $from = $senderName." <".$senderEmail.">";  
    $headers = "From: $from"; 

    // Boundary  
    $semi_rand = md5(time());  
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";  

    // Headers for attachment  
    $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";  

    // Multipart boundary  
    $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" . 
    "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";  

    // Preparing attachment 
    if(!empty($files)){ 
        for($i=0; $i<count($files); $i++){
            if(is_file($files[$i]["tmp_name"])){ 
                $tmp_name = basename($files[$i]["tmp_name"]);
                $file_name = $files[$i]["name"];
                $file_size = filesize($files[$i]["tmp_name"]); 

                $message .= "--{$mime_boundary}\n"; 
                $fp =    fopen($files[$i]["tmp_name"], "rb"); 
                $data =  fread($fp, $file_size); 
                fclose($fp); 
                $data = chunk_split(base64_encode($data)); 
                $message .= "Content-Type: application/octet-stream; name=\"".$file_name."\"\n" .  
                "Content-Description: ".$file_name."\n" . 
                "Content-Disposition: attachment;\n" . " filename=\"".$file_name."\"; size=".$file_size.";\n" .  
                "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
            }
        } 
    } 

    $message .= "--{$mime_boundary}--"; 
    $returnpath = "-f" . $senderEmail; 

    // Send email    
    $mail = mail($to, $subject, $message, $headers, $returnpath);  

    // Return true, if email sent, otherwise return false 
    if($mail){ 
        return true; 
    }else{ 
        return false; 
    } 
}